The template library for creating Salesforce mobile applications. This repository contains ready-to-use app templates for iOS, Android, hybrid (Cordova), and React Native platforms.
These templates are consumed by the Mobile SDK CLI tools and SFDX plugin to generate new mobile applications:
- forceios - Creates iOS native apps (Swift or Objective-C)
- forcedroid - Creates Android native apps (Kotlin or Java)
- forcehybrid - Creates hybrid apps using Cordova
- forcereact - Creates React Native apps (JavaScript or TypeScript)
- sf mobilesdk - SFDX plugin providing all above functionality
| Template | Description |
|---|---|
| iOSNativeSwiftTemplate | Basic Swift template with MobileSync, SwiftUI, and Combine (most common) |
| iOSNativeSwiftPackageManagerTemplate | Swift template using Swift Package Manager instead of CocoaPods |
| iOSNativeSwiftEncryptedNotificationTemplate | Swift template with notification service extension |
| iOSNativeLoginTemplate | SwiftUI native login screen example |
| iOSIDPTemplate | Identity Provider implementation sample |
| MobileSyncExplorerSwift | Full-featured sample app demonstrating MobileSync CRUD and sync |
| Template | Description |
|---|---|
| AndroidNativeKotlinTemplate | Basic Kotlin template with Jetpack Compose (most common) |
| AndroidNativeLoginTemplate | Jetpack Compose native login screen example |
| AndroidIDPTemplate | Identity Provider implementation sample |
| MobileSyncExplorerKotlinTemplate | Full-featured sample app demonstrating MobileSync CRUD and sync |
| Template | Description |
|---|---|
| ReactNativeTemplate | Basic JavaScript template |
| ReactNativeTypeScriptTemplate | Basic TypeScript template |
| ReactNativeDeferredTemplate | Deferred login (guest mode) example |
| MobileSyncExplorerReactNative | Full-featured sample app demonstrating MobileSync CRUD and sync |
| Template | Description |
|---|---|
| HybridLocalTemplate | Local HTML/JS/CSS app |
| HybridRemoteTemplate | Remote Visualforce/Communities app |
# Create app with default template
forceios create --appname MyApp --packagename com.mycompany.myapp --organization "My Company"
# List available templates
forceios listtemplates
# Create app from specific template
forceios createwithtemplate \
--templaterepouri iOSNativeSwiftTemplate \
--appname MyApp \
--packagename com.mycompany.myapp \
--organization "My Company"
# Create from custom template repository
forceios createwithtemplate \
--templatesource https://github.com/myorg/my-templates#main \
--template MyCustomTemplate \
--appname MyApp \
--packagename com.mycompany.myapp \
--organization "My Company"# Install plugin
sf plugins install sfdx-mobilesdk-plugin
# Create app
sf mobilesdk ios create \
--appname MyApp \
--packagename com.mycompany.myapp \
--organization "My Company"
# List templates
sf mobilesdk ios listtemplatesEach template contains two key scripts that orchestrate app creation:
Downloads SDK dependencies and sets up the development environment.
What it does:
- Clones SDK repositories from
package.jsonsdkDependencies - Runs CocoaPods (
pod updatefor iOS) - Installs npm dependencies (for React Native)
- Cleans up unnecessary files
Example:
var packageJson = require('./package.json');
var execSync = require('child_process').execSync;
for (var sdkDependency in packageJson.sdkDependencies) {
var repoUrlWithBranch = packageJson.sdkDependencies[sdkDependency];
var [repoUrl, branch] = repoUrlWithBranch.split('#');
var targetDir = 'mobile_sdk/' + sdkDependency;
execSync(`git clone --branch ${branch} --single-branch --depth 1 ${repoUrl} ${targetDir}`);
}
execSync('pod update'); // iOS onlyCustomizes the template with user-provided values.
What it does:
- Replaces placeholders (app name, package name, organization)
- Configures OAuth settings (consumer key, callback URL)
- Renames/moves files to match new app name
- Calls
install.jsto download dependencies - Returns workspace and bootconfig file paths
Example:
function prepare(config, replaceInFiles, moveFile, removeFile) {
// Replace template values with user values
replaceInFiles('iOSNativeSwiftTemplate', config.appname, [
'Podfile',
'iOSNativeSwiftTemplate.xcodeproj/project.pbxproj'
]);
// Rename project files
moveFile('iOSNativeSwiftTemplate.xcodeproj', config.appname + '.xcodeproj');
moveFile('iOSNativeSwiftTemplate', config.appname);
// Download SDK dependencies
require('./install');
return {
workspacePath: config.appname + '.xcworkspace',
bootconfigFile: config.appname + '/bootconfig.plist'
};
}
module.exports = {
appType: 'native_swift',
prepare: prepare
};Each template follows this structure:
TemplateDirectory/
├── package.json # SDK dependencies
├── install.js # Downloads SDK dependencies
├── template.js # Customizes template
├── <project-files> # Platform-specific project files
└── <source-code> # Template source code
React Native templates have additional files:
ReactNativeTemplate/
├── package.json # SDK and npm dependencies
├── installios.js # iOS setup
├── installandroid.js # Android setup
├── template.js # Multi-platform customization
├── ios/ # iOS project
└── android/ # Android project
Use test_template.sh to verify templates build successfully:
# Test a specific template
./test_template.sh --template iOSNativeSwiftTemplate
# Test on specific platform
./test_template.sh --template ReactNativeTemplate --platform ios
# Test all templates
./test_template.shOverride SDK dependencies for testing with in-development changes:
# Test with custom iOS SDK branch
./test_template.sh \
--msdk-ios-branch my-feature \
--template iOSNativeSwiftTemplate
# Test with custom Android SDK branch
./test_template.sh \
--msdk-android-branch my-feature \
--template AndroidNativeKotlinTemplate
# Test React Native with all custom branches
./test_template.sh \
--msdk-ios-branch my-feature \
--msdk-android-branch my-feature \
--rn-force-branch my-feature \
--template ReactNativeTemplateFor detailed testing documentation, see TESTING.md.
- Copy an existing template as a starting point
- Modify the code to implement your desired functionality
- Update placeholders to match your template name
- Create/update scripts:
package.jsonwithsdkDependenciesinstall.jsfor SDK dependency managementtemplate.jsfor customization logic
- Add to
templates.json:{ "path": "MyCustomTemplate", "description": "My custom iOS template", "appType": "native_swift", "platforms": ["ios"] } - Test with
test_template.sh
Templates use placeholder strings that get replaced during customization:
| Placeholder | Replaced With | Where |
|---|---|---|
Template app name (e.g., iOSNativeSwiftTemplate) |
User's app name | Project files, schemes |
Template package name (e.g., com.salesforce.iosnativeswifttemplate) |
User's package name | Bundle ID, manifests |
Template organization (e.g., iOSNativeSwiftTemplateOrganizationName) |
User's organization | Xcode project |
__INSERT_CONSUMER_KEY_HERE__ |
OAuth consumer key | bootconfig files |
__INSERT_CALLBACK_URL_HERE__ |
OAuth callback URL | bootconfig files |
__INSERT_DEFAULT_LOGIN_SERVER__ |
Login server URL | Info.plist/servers.xml |
When adding a template to templates.json, specify the appType:
- native - Objective-C (iOS) or Java (Android)
- native_swift - Swift (iOS only)
- native_kotlin - Kotlin (Android only)
- hybrid_local - Cordova with local HTML/JS
- hybrid_remote - Cordova with Visualforce/Communities
- react_native - React Native (JavaScript or TypeScript)
MyCustomTemplate/package.json:
{
"name": "MyCustomTemplate",
"sdkDependencies": {
"SalesforceMobileSDK-iOS": "https://github.com/forcedotcom/SalesforceMobileSDK-iOS.git#dev"
}
}MyCustomTemplate/install.js: (copy from existing iOS template)
MyCustomTemplate/template.js:
function prepare(config, replaceInFiles, moveFile, removeFile) {
var path = require('path');
var templateAppName = 'MyCustomTemplate';
replaceInFiles(templateAppName, config.appname, ['Podfile', 'package.json']);
moveFile(templateAppName + '.xcodeproj', config.appname + '.xcodeproj');
moveFile(templateAppName, config.appname);
require('./install');
return {
workspacePath: config.appname + '.xcworkspace',
bootconfigFile: path.join(config.appname, 'bootconfig.plist')
};
}
module.exports = {
appType: 'native_swift',
prepare: prepare
};templates.json (add entry):
{
"path": "MyCustomTemplate",
"description": "My custom iOS template",
"appType": "native_swift",
"platforms": ["ios"]
}Update SDK dependencies across all templates:
./setversion.sh <version>This updates sdkDependencies in all package.json files to reference the specified SDK version.
- CLAUDE.md: Comprehensive development guide for AI-assisted development
- TESTING.md: Detailed testing guide with SDK override examples
- Mobile SDK Developer Guide: Official documentation
- SalesforceMobileSDK-Package: CLI tools that consume these templates
- SalesforceMobileSDK-iOS - iOS native SDK
- SalesforceMobileSDK-Android - Android native SDK
- SalesforceMobileSDK-ReactNative - React Native SDK
- SalesforceMobileSDK-Package - CLI tools and SFDX plugin
- SalesforceMobileSDK-Shared - Hybrid JavaScript libraries
- SalesforceMobileSDK-CordovaPlugin - Cordova plugin
Contributions are welcome! When adding or modifying templates:
- Follow existing template patterns
- Test with
test_template.sh - Update
templates.json - Verify CLI tools can use the template
- Document any special requirements
Salesforce Mobile SDK License. See LICENSE for details.
- Issues: GitHub Issues
- Questions: Salesforce Developer Community
- Stack Overflow: Tag questions with
salesforce-mobile-sdk