Getting Started with iOS Recording

About FullStory for Mobile Apps

FullStory for Mobile Apps includes and requires Private by Default technology that empowers product teams to debug experiences on native mobile applications while proactively respecting end-user privacy. Session replay for mobile apps isn't a screen recording and FullStory never captures screenshots from an end-user's device. Similar to FullStory for the web, where session replay represents a re-creation of a digital experience based on recorded changes in the DOM, FullStory's session replay for mobile apps is based on drawing operations, where text, images, and personal data are masked at the source by default, such that masked data never reaches FullStory's servers. 

Interested in using FullStory to understand and debug mobile app experiences? Request a demo or contact us to learn how to add FullStory for Mobile Apps to your current account plan.

 

Getting Started

Using native recording on iOS requires adding the FullStory capture framework to your app. If you use CocoaPods, you can do this by simply adding the FullStory pod to your application, or you can also add the FullStory dylib to your Xcode project directly. These instructions describe how to implement these two approaches.


CocoaPods Installation: adding the FullStory pod

For iOS applications that already use CocoaPods, FullStory distributes a pod specification that you can integrate directly into your existing Podfile. To do this, you’ll take the following steps to edit that file:

  • Open your Podfile and make sure that your primary target has the line “use_frameworks!” present and uncommented. It should be on a line by itself.
  • In your Podfile, add the pod specification for the latest version of the FullStory framework to your target. It should look like this (with <POD-VERSION> as the correct version, of the form a.b.c - this is currently 1.1.0):

pod 'FullStory', :http => 'https://ios-releases.fullstory.com/fullstory-<POD-VERSION>.tar.gz'

  • Run “pod install” to download the FullStory framework and add it to your project. To upgrade the FullStory framework in the future, run “pod update”.

 

Manual Installation: adding the FullStory framework

For iOS applications that do not use CocoaPods, you can directly integrate the FullStory framework with your app. To do that, follow these steps:

  • Download the latest FullStory.framework release tarball from our release site at https://ios-releases.fullstory.com/fullstory-0.99.10.tar.gz, and extract it to a path in your project.
  • Select your target in Xcode, then add FullStory.framework with “File” -> “Add Files”.
  • In the editor for your target, select “Build Phases”, and click the “+” in the upper-left corner. Add a “Copy Files” phase. Change the destination to “Frameworks”, and click the “+” in the files list; select “FullStory.framework”, and hit “Add”. (You may optionally wish to rename the “Copy Files” phase to something like “Copy Frameworks”; this step can also be merged with any other framework-copy build phases that your application may have.)


Completing the FullStory integration

To complete the FullStory integration, you need to make a few changes to your Xcode project.

  • Add FullStory.framework to the Link Binary With Libraries build phase
  • The FullStory library currently doesn’t support building with bitcode. To disable bitcode in your project, select the project itself in the Xcode file view, click on “Build Settings”, select All, and in the search box, type “bitcode”; then, select “no”. (If your project uses a more complicated setup, you will need to make this change in your xcconfig, or elsewhere in your build tooling.)
  • In your app’s Info.plist, you need to add a FSOrgId key that has your assigned ID. Select the Info.plist file in the Xcode file view, right click, and click ‘add row’. In the “Key” field, type FSOrgId, and in the “Value” field, add your ID (typically a short string of numbers and capital letters). (Note that “FSOrgId” is case-sensitive.)
  • Add a build phase to your app target to run FullStory’s asset upload script FullStoryCommandLine when you build your app. In the editor for your target, select “Build Phases”, and click the “+” in the upper-left corner. Select “New Run Script Phase” inside of the shell editor and call FullStoryCommandLine passing the output path to your built app bundle. (Ensure that the FullStoryCommandLine build step takes place after the FullStory framework is copied; if you have a “Copy Files” step, you can drag the FullStoryCommandLine step below it.)

"<your-path-to>/FullStory/tools/FullStoryCommandLine" "${CONFIGURATION_BUILD_DIR}/${WRAPPER_NAME}"


Identifying users and passing custom data to FullStory

On the Web, FullStory offers the FS.identify and FS.setUserVars JavaScript functions to enable you to enrich your FullStory data with additional variables for use in searches, segments, and integrations. This functionality is replicated on iOS to allow you to pass user information to FullStory directly from your native app. The methods behave identically to their JavaScript counterparts linked above. The parameters are simply the Objective-C/Swift equivalents of the original JavaScript parameters: [FS identify:userVars:] takes a NSString and an optional NSDictionary<NSString *, id>, while [FS setUserVars:] takes a NSDictionary<NSString *, id>.

 

FullStory Delegate

You can implement the FullStory Delegate protocol FSDelegate to be notified about the session lifecycle.

// In your AppDelegate’s didFinishLaunchingWithOptions set the FS delegate

FS.delegate = self;
// Implement the optional methods - (void)fullstoryDidTerminateWithError:(NSError *)error {} - (void)fullstoryDidStartSession:(NSString *)sessionUrl {} - (void)fullstoryDidStopSession {}

 

Identify

Identify is used to associate your own application-specific id with the active user.

Objective-C

NSString *userId = @"13ff474bae77"; // replace with your user’s Id
NSDictionary *info = @{ @"email": @"user@example.com", @"displayName": @"Shopping User"
};

[FS identify:userId userVars:info];


Swift

In order for FullStory to be imported and used in Swift you’ll need to make sure that you’ve configured an Objective-C bridging header and @import FullStory; in the bridging header. See Apple’s Importing Objective-C into Swift documentation for help with adding the header.

let userId = "13ff474bae77" // replace with your user’s Id
let info = ["email": "user1@example.com", "displayName": "Shopping User"]
FS.identify(userId, userVars: info)

 

Additional topics

Privacy rules

For more information about configuring privacy rules and masking, please consult our Native Mobile Privacy Rules guide.

Turning mobile recording on or off

Mobile recording can be toggled on or off from Settings > Mobile Recording. This applies across your entire FullStory account.

Configuring domain whitelisting for WebViews

If your application makes use of WebViews, you must explicitly whitelist any domain you wish to record within a WebView. For security and privacy reasons, you should only whitelist domains which are under your control. Wildcards and subdomains are supported using the same scheme as Web domain settings. The key difference between the Web and Mobile settings is that while domain whitelisting is optional on Web, it is mandatory on Mobile if you wish to record content within WebViews. If your application doesn’t use WebViews or you don’t care to record within WebViews, you can safely ignore this section.

These settings can be configured from Settings > Mobile Recording.

Impact on App Size

For apps downloaded from the App Store, FullStory’s framework adds ~ 9MB to your uncompressed app size on device but only ~ 2.8MB to your compressed download size. (Note that compression rates can vary by app.)

Since iOS 9.0 when App Thinning was introduced, the App Store will automatically slice your app into different variants for all devices targeted. In each variant, executables and resources for unsupported architectures or screen sizes are automatically removed.

If your app targets both 32-bit and 64-bit devices (true for iOS 10 or earlier), your App Store submission will include both armv7 and arm64 versions of FullStory.framework (~ 18MB, uncompressed). However, when your users download your app, they’ll only receive the version of FullStory.framework that matches their device (~ 9MB, uncompressed).

Note that FullStory.framework will occupy more space in developer builds. We ship a universal framework that includes a variant for each architecture we support. Currently, that’s arm64, armv7, and x86_64. The full universal framework adds ~ 29MB uncompressed to your app, but that’s because app thinning / slicing doesn’t happen for developer builds.

To learn more about how app thinning impacts app size, see Getting an App Size Report in Technical Q&A QA1795.

Need to get in touch with us?

The FullStory Team awaits your every question.

Contact us