Search code examples
uiwebviewdeep-linkingbranch.ioios-universal-links

Branch Universal Deep Link does not display custom view controller elements


So I have a Universal link that leads to a view controller in my app. On that particular view controller I display a couple of images as well as a web view. The webView displays a url chosen by the user. How do I save this custom url so that it is displayed every time someone clicks the link? I think the code to this is under:

@synthesize deepLinkingCompletionDelegate;
 -(void)configureControlWithData:(NSDictionary *)data {


NSString *string = data[@"favoriteArticle"];

Solution

  • Alex from Branch.io here:

    To accomplish this, you need to do two things.

    Step 1

    Store the URL of the article you want to load as one of the Branch link custom parameters. Full instructions on how to do that here, but essentially:

    BranchUniversalObject *branchUniversalObject = [[BranchUniversalObject alloc] initWithCanonicalIdentifier:@"item/12345"];
    branchUniversalObject.title = @"My Content Title";
    branchUniversalObject.contentDescription = @"My Content Description";
    branchUniversalObject.imageUrl = @"https://example.com/mycontent-12345.png";
    [branchUniversalObject addMetadataKey:@"favorite_article" value:@"https://example.com/path/to/article"]; // this is used to route inside the app
    [branchUniversalObject addMetadataKey:@"property2" value:@"red"];
    
    BranchLinkProperties *linkProperties = [[BranchLinkProperties alloc] init];
    linkProperties.feature = @"sharing";
    linkProperties.channel = @"facebook";
    [linkProperties addControlParam:@"$desktop_url" withValue:@"https://example.com/path/to/article"]; // this is used for desktop visitors
    [linkProperties addControlParam:@"$ios_url" withValue:@"https://example.com/path/to/article"]; // this is used for iOS mobile visitors without the app installed
    

    Step 2

    Then when the app opens after a link click, watch for that data key. Again, full instructions, but basically:

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
      // initialize the session, setup a deep link handler
      [[Branch getInstance] initSessionWithLaunchOptions:launchOptions
                              andRegisterDeepLinkHandler:^(NSDictionary *params, NSError *error) {
    
        // start setting up the view controller hierarchy
        UINavigationController *navC = (UINavigationController *)self.window.rootViewController;
        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
        UIViewController *nextVC;
    
        // If the key 'favoriteArticle' is present in the deep link dictionary
        // then load the picture screen with the appropriate picture
        NSString * favoriteArticle = [params objectForKey:@"favorite_article"];
        if (favoriteArticle) {
          nextVC = [storyboard instantiateViewControllerWithIdentifier:@"ArticleVC"];
          [nextVC setArticleUrl: favoriteArticle];
        } else {
          nextVC = [storyboard instantiateViewControllerWithIdentifier:@"MainVC"];
        }
    
        // navigate!
        [navC setViewControllers:@[nextVC] animated:YES];
      }];
    
      return YES;
    }
    

    After this, in your ArticleVC, retrieve the favoriteArticle value and use it for your webview.

    Step 2 (Alternate)

    The configureControlWithData method you mentioned is used in the automatic deep link routing implementation. You may be able to adapt this to work with a webview, but I haven't personally tried that. It would look something like this:

    @synthesize deepLinkingCompletionDelegate;
    - (void)configureControlWithData:(NSDictionary *)data {
        NSString *favoriteArticle = data[@"favorite_article"];
    
        // load the webview with the URL stored inside favoriteArticle
    }