Mobile SDK Upgrade From 2.3 to 3.0

Compilation and Linking Issues

Upgrading Salesforce Mobile SDK from 3.1 to 3.2 is indeed quite simple

$ cd <your_Cordova_app_folder>
$ cordova plugin rm com.salesforce
$ cordova prepare

But every time I did the upgrade from 3.x to latest version of SDK. I see the following set of errors.

Undefined symbols for architecture arm64:
  "_OBJC_CLASS_$_SFHybridViewController", referenced from:
      objc-class-ref in AppDelegate+SalesforceHybridSDK.o
  "_OBJC_CLASS_$_SFDefaultUserManagementViewController", referenced from:
      objc-class-ref in AppDelegate+SalesforceHybridSDK.o
  "_OBJC_CLASS_$_SFUserAccountManager", referenced from:
      objc-class-ref in AppDelegate+SalesforceHybridSDK.o
  "_OBJC_CLASS_$_SFLogger", referenced from:
      objc-class-ref in AppDelegate+SalesforceHybridSDK.o
  "_OBJC_CLASS_$_SalesforceSDKManager", referenced from:
      objc-class-ref in AppDelegate+SalesforceHybridSDK.o
  "_OBJC_CLASS_$_SFLocalhostSubstitutionCache", referenced from:
      objc-class-ref in AppDelegate+SalesforceHybridSDK.o
  "_OBJC_CLASS_$_SFPushNotificationManager", referenced from:
      objc-class-ref in AppDelegate+SalesforceHybridSDK.o
  "_OBJC_CLASS_$_SFHybridViewConfig", referenced from:
      objc-class-ref in AppDelegate+SalesforceHybridSDK.o
ld: symbol(s) not found for architecture arm64

And you see the following binaries (.a) files are missing.


Under "Compile Sources" InitialViewController.m was missing.


Undefined symbols for architecture arm64:
  "_OBJC_CLASS_$_InitialViewController", referenced from:
      objc-class-ref in AppDelegate+SalesforceHybridSDK.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)



Also, please note that there used to be two modules for networking.

libMKNetworkKit-iOS.a
libSalesforceNetworkSDK.a

Now, libSalesforceNetwork.a replace them both.

Resolution

I started off by linking the missed libraries manually.

Link the binaries under "$(SRCROOT)/OneStop/Plugins/com.salesforce"  in Build Phases.  Also, don't forget to add InitialViewController.m under compile sources.
I also added CDVDevice.m to resolve the plugin error.

IT Worked!!

Soon, I faced a roadblock. Once I authorize the app, the screen is stuck at "Loading" view. "Create Passcode" screen never comes up in iOS 8.3 OR intermittently comes up in  older version of iOS 8.

I thought there should be a fix in unstable branch. I downloaded the source code of iOS SDK (https://github.com/forcedotcom/SalesforceMobileSDK-iOS) and generated libraries by running SalesforceSDKCore and SalesforceSDKCommon projects in "Release" mode. In order to run in release mode, I edited the scheme to select "Release" mode for Build Configuration.



Once done, pickup files from "Release-iphoneos" folder. You can navigate to the folder by looking up for the .a file under "Products" folder in Xcode.




I copied all the files to $(SRCROOT)/OneStop/Plugins/com.salesforce and linked them again. This time I made sure names and link order match with the sample apps.

It worked!


If you want to do this in a simple way, just navigate to com.salesforce plugin repo (https://github.com/forcedotcom/SalesforceMobileSDK-CordovaPlugin) and copy the libraries. The task of importance is to make sure you have correct libs and right linking order.

Comments

Popular posts from this blog

Updating SourceData/ Data Source of the Pivot Table

Salesforce.com migration tool - Deploying Weblink and migrating files with special characters

Information Architecture - Setup your term store to scale