Note: At this point, you should already have completed Base app configuration section.
-
Open iOS project in Xcode and in Build Settings update
iOS deployment target
to 11.0. Also, change version inPodfile
:platform :ios, '11.0'
-
Create new swift file and add it to your Xcode project. When offered, also accept creating
*-Bridging-Header.h
file too. You can leave the content of both files empty. -
Add VCX library: VCX Cocoapods library is necessary to be added to iOS Podfile.
-
Add the next source to the top of your Podfile:
... source 'https://cdn.cocoapods.org/' source 'https://gitlab.com/evernym/mobile/mobile-sdk.git'
-
Add VCX dependency into your Podfile inside target :
-
release build for devices only (
arm64
):pod 'vcx', '0.0.233'
-
debug build for simulators
pod 'vcx', '0.0.234'
-
-
Note that currently recommended VCX versions are
227/228
. -
Add below lines inside your
target
in Podfileuse_frameworks! $RNFirebaseAsStaticFramework = true
-
-
Add apptentive. You are not required to use this library. As of now we have a dependency on this library. We will make this optional in future. Add below dependency in
Podfile
pod 'apptentive-ios'
-
Run
pod install
-
Configure App permissions by adding following lines to
ios/<project-name>/info.plist
file<key>NSCameraUsageDescription</key> <string>Please allow us access to Camera so that we can scan QR code</string> <key>NSFaceIDUsageDescription</key> <string>Enabling Face ID allows you quick and secure access to your app.</string> <key>NSMicrophoneUsageDescription</key> <string>Connect.Me uses your microphone to support audio messages.</string> <key>NSPhotoLibraryAddUsageDescription</key> <string>Connect.Me needs access to your photo library in order to set your avatar photo.</string> <key>NSPhotoLibraryUsageDescription</key> <string>Connect.Me needs access to your photo library in order to set your avatar photo.</string>
Remember to replace
Connect.Me
with your app name -
Add below entries in same info.plist file
<key>UIStatusBarHidden</key> <true/> <key>UISupportedInterfaceOrientations</key> <array> <string>UIInterfaceOrientationPortrait</string> </array> <key>UIViewControllerBasedStatusBarAppearance</key> <false/>
-
Open
awesomeMsdkProject.xcworkspace
in Xcode and setAlways embed swift standard libraries
toYes
There are two strategies regarding receiving messages by an application which described here:
If you wish to use Push Notifications strategy you need to set variable USE_PUSH_NOTIFICATION=true
and follow steps bellow to configure Firebase for iOS:
Official documentation: https://developer.apple.com/documentation/usernotifications
-
Add initialization of Firebase library into your
AppDelegate.m
:# import Firebase framework # import <Firebase.h> @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // ... if ([FIRApp defaultApp] == nil) { [FIRApp configure]; } // ... return YES; }
-
Add Push notification capabilities.
-
When selected Xcode project, choose Signing & Capabilities. From there, select signing for valid Team and bundle identifier. Tap
+ Capabilty
and from the drop list (or by searching) choosePush notifications
. New certificates and provision profiles should be automatically generated by Xcode.
-
Don't forget to follow rest of the steps for registering your app with Firebase service and including adding GoogleService-Info.plist to your project. For more details, please refer to official documentaion here: https://firebase.google.com/docs/cloud-messaging/ios/client
-
Register app for push notifications in AppDelegate.m
if ([UNUserNotificationCenter class] != nil) {
[UNUserNotificationCenter currentNotificationCenter].delegate = self;
UNAuthorizationOptions authOptions = UNAuthorizationOptionAlert |
UNAuthorizationOptionSound | UNAuthorizationOptionBadge;
[[UNUserNotificationCenter currentNotificationCenter]
requestAuthorizationWithOptions:authOptions
completionHandler:^(BOOL granted, NSError * _Nullable error) {
// ...
}];
}
[application registerForRemoteNotifications];
-
Add below entries to
ios/<project-name>/info.plist
file<key>UIBackgroundModes</key> <array> <string>remote-notification</string> </array> <key>FirebaseScreenReportingEnabled</key> <false/> <key>firebase_crashlytics_collection_enabled</key> <false/>
If you want to add a capability where if user taps on a link in other apps (slack, email, whatsapp, etc.) and that link should open the app. Then you can add a deep linking configuration as described below. Evernym's react-native SDK uses branch.io for deep linking.
-
In you
AppDelegate.m
add this line#import "RNBranch.h"
in import statements -
In
AppDelegate.m
find the method(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
.- Inside this method, after
*rootView
is created. Add this line[RNBranch initSessionWithLaunchOptions:launchOptions isReferrable:YES];
- Inside this method, after
-
Copy below method to same file if not already created
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray *restorableObjects))restorationHandler { return [RNBranch continueUserActivity:userActivity]; }
-
Other steps that must be done are defined more clearly here
-
Optionally, you can add general Aries deep link domain to be compatible with other applications:
didcomm
.
By default ios app uses System
font which is usually San Francisco
on ios. If you want to add a custom font, then use below steps. Below steps are describing how to add Lato
font. You can add any other font in similar way.
-
Add
Lato
fonts to Xcode project located here:node_modules/@evernym/react-native-white-label-app/src/fonts/Lato
and updateinfo.plist
with configuration related to fonts:<key>UIAppFonts</key> <array> <string>Lato-Bold.ttf</string> <string>Lato-BoldItalic.ttf</string> <string>Lato-Italic.ttf</string> <string>Lato-Medium.ttf</string> <string>Lato-MediumItalic.ttf</string> <string>Lato-Regular.ttf</string> <string>Lato-Semibold.ttf</string> <string>Lato-SemiboldItalic.ttf</string> </array>
In case you already added custom fonts to Xcode project, just expand list by adding Lato fonts.
-
Building the app fails on XCode 12.5+
Adding those two blocks into your application Podfile file should resolve the issue:
-
after the section containing
source
statements:def find_and_replace(dir, findstr, replacestr) Dir[dir].each do |name| text = File.read(name) replace = text.gsub(findstr,replacestr) if text != replace puts "Fix: " + name File.open(name, "w") { |file| file.puts replace } STDOUT.flush end end Dir[dir + '*/'].each(&method(:find_and_replace)) end
-
inside the
post_install
hook beforeend
keyword, add below codefind_and_replace("../node_modules/react-native/React/CxxBridge/RCTCxxBridge.mm", "_initializeModules:(NSArray<id<RCTBridgeModule>> *)modules", "_initializeModules:(NSArray<Class> *)modules") find_and_replace("../node_modules/react-native/ReactCommon/turbomodule/core/platform/ios/RCTTurboModuleManager.mm", "RCTBridgeModuleNameForClass(module))", "RCTBridgeModuleNameForClass(Class(module)))")
-
-
Missing ObjectiveC
Make sure you added .swift file and bridging header to your Xcode project, as instructed in this documentation.
In case you experience this error:
ld: warning: Could not find auto-linked library
please add next line in Build Settings, Search Library paths (in Xcode):$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)
-
Missing FS in DotEnv library
In case you experience issue with missing fs library
node_modules/react-native-dotenv/index.js
, this can be resolution:- Add react-native-fs using yarn or npm
- Open DotEnv library in /node_modules/dotenv/lib/main.js
- Replace const
fs = require('fs')
tofs = require('react-native-fs')
Note: Unfortunately, if you rebuild node_modules, same steps will be necessary again, just to keep in mind.
-
vcx.framework/vcx' does not contain bitcode *
In case you experience issue with vcx or react-native-white-label-app pod
vcx.framework/vcx' does not contain bitcode
, this can be resolution:- Open project in XCode and set
Bitcode=NO
for target pods. - Add following lines to your app Podfile:
post_install do |installer| installer.pods_project.build_configurations.each do |config| config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64" end installer.pods_project.targets.each do |target| if target.name == "react-native-white-label-app" target.build_configurations.each do |config| config.build_settings['ENABLE_BITCODE'] = 'NO' end end if target.name == "evernym-react-native-sdk" target.build_configurations.each do |config| config.build_settings['ENABLE_BITCODE'] = 'NO' end end if target.name == "vcx" target.build_configurations.each do |config| config.build_settings['ENABLE_BITCODE'] = 'NO' end end end end
- Open project in XCode and set
-
App builds fine, but at runtime we see error
No permission handler detected
. Add apre_install
hook-
pre_install do |installer| Pod::Installer::Xcode::TargetValidator.send(:define_method, :verify_no_static_framework_transitive_dependencies) {} installer.pod_targets.each do |pod| if pod.name.eql?('RNPermissions') || pod.name.start_with?('Permission-') def pod.build_type; # Uncomment the line corresponding to your CocoaPods version Pod::BuildType.static_library # >= 1.9 # Pod::Target::BuildType.static_library # < 1.9 end end end end
-
Add permission handler for Camera. Put below code inside target of Podfile
# react-native-permissions permission handlers permissions_path = '../node_modules/react-native-permissions/ios' pod 'Permission-Camera', :path => "#{permissions_path}/Camera.podspec" pod 'Permission-FaceID', :path => "#{permissions_path}/FaceID.podspec" pod 'Permission-Microphone', :path => "#{permissions_path}/Microphone.podspec" pod 'Permission-PhotoLibrary', :path => "#{permissions_path}/PhotoLibrary.podspec"
-
-
App build fails due to transitive statically linked Flipper libraries
- For now, we don't support Flipper. Please disable Flipper by commenting this line (
# use_flipper!()
) in Podfile
- For now, we don't support Flipper. Please disable Flipper by commenting this line (