Search code examples
iosflutterdeep-linkingbranch.io

Flutter app crashes on open from cold state with Branch.io deep link


I recently implemented deep linking with Branch.io for my flutter app running on iOS. It works as expected when the app is running in the background. When the Branch.io link is clicked, it will open in my Flutter app. However, when the app is completely closed and in a cold state, tapping the link will begin to redirect to the application but then the app crashes immediately.

This is my code for creating and opening deep links:

static Future<void> listen(BuildContext context) async {
    await FlutterBranchSdk.init();
    StreamSubscription<Map>? streamSubscription;

    streamSubscription = FlutterBranchSdk.listSession().listen((data) async {
      if (data.containsKey("groupId") && context.mounted) {
        AppNavigationV2.to(
            AppPages.groupProfileScreen, {"data": data["groupId"]});
      }
    }, onError: (error) {
      PlatformException platformException = error as PlatformException;
      print(
          'InitSession error: ${platformException.code} - ${platformException.message}');
    });
  }

  // Following this guide: 
  // https://seayeshaiftikhar.medium.com/branch-io-for-deep-linking-in-flutter-2327530f1639
  static Future<void> createLink(String groupId) async {
    BranchUniversalObject branchUniversalObject = BranchUniversalObject(
        canonicalIdentifier: 'flutter/branch',
        contentMetadata: BranchContentMetaData()
          ..addCustomMetadata('groupId', groupId),);
    FlutterBranchSdk.registerView(buo: branchUniversalObject);
    BranchLinkProperties linkProperties =
        BranchLinkProperties(feature: 'sharing');
    linkProperties.addControlParam('\$uri_redirect_mode',
        '1'); // this will redirect the link to application

    BranchResponse response = await FlutterBranchSdk.getShortUrl(
        buo: branchUniversalObject, linkProperties: linkProperties);
    Share.share(response.result);
  }

I made sure to run FlutterBranchSdk.validateSDKIntegration(); and all the checks passed - my Info.plist file configuration appears to be correct.

Anything look amiss?

I was able to watch my device's output with Mac's Console app, and when the app crashes, I see some error messages like this:

[(FBSceneManager):sceneID:com.myapp.myapp-default] Update failed: <NSError: 0x3038b52f0; domain: FBSceneErrorDomain; code: 1 ("operation-failed"); "Scene update failed."> {
    NSUnderlyingError = <NSError: 0x3026896b0; domain: BSServiceConnectionErrorDomain; code: 3 ("OperationFailed"); "XPC error received on message reply handler">;
}
Process state is unknown AppStateTracker, pid 3533, uuid xxxxxxx-xxxxxxx display identifier com.myapp.myapp foreground 1
COSMCtrl _foregroundAppActivity incoming bundle com.myapp.myapp has nil supplied UUID, finds existing xxxxxxxxx-xxxx-xxx-xxx-xxxxxxxx

I also tried following this solution to no success.

Running on iPhone 12 mini with iOS 18.0. Any ideas?


Solution

  • Simple mistake - I had to run the release mode version of my Flutter app first before being able to properly deep link on cold start. On iOS you must run the app in release mode if you want to open it from cold start.