In-App Routing

概述

When a Branch link is opened, either your app launches or users are taken to the App/Play store to download it. Deep links improve this process by routing users directly to specific content after your app launches. With Branch, this works even if users have to stop and download the app first (a.k.a., "deferred deep links"). Deep links are an incredibly important part of delivering a high-quality user experience.

我们将引导您完成3个配置选项:

  • 选项1:在路由回调中建立自定义路由—在打开应用后立即进行路由
  • 选项 2:让 Branch 使用您现有的深度链接路由
  • 选项3:使用 Branch 的简单配置深度链接路由—自动路由

🚧

iOS Deferred Deep Linking

With the introduction of iOS 15 and iCloud+ Private Relay, Branch released support for deferred deep linking using NativeLink™

To implement iOS NativeLink™, follow the instructions in our developer documentation.

选项1:在路由回调中构建自定义路由

在应用打开时立即进行路由

在 initSession 中注册的深度链接处理程序回调中,您将需要检查参数字典以确定用户是否打开过 Branch Link。以下是假定链接对应于图片的示例。以下是来自 iOS 和 Android 的一些示例,其中我们使用pictureId key 进行路由,但是您可以在此处看到其他平台的更多代码片段。

iOS

- (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 'pictureId' is present in the deep link dictionary
        // then load the picture screen with the appropriate picture
        NSString *pictureId = [params objectForKey:@"pictureId"];
        if (pictureId) {
          nextVC = [storyboard instantiateViewControllerWithIdentifier:@"PicVC"];
          [nextVC setNextPictureId:pictureId];
        } else {
          nextVC = [storyboard instantiateViewControllerWithIdentifier:@"MainVC"];
        }

        // navigate!
        [navC setViewControllers:@[nextVC] animated:YES];
      }];

      return YES;
    }

Android

@Override
        public void onStart() {
            super.onStart();

            Branch.sessionBuilder(this).withCallback(new BranchReferralInitListener(){
                @Override
                public void onInitFinished(JSONObject referringParams, Branch.BranchError error) {
                    if (error == null) {
                        // params are the deep linked params associated with the link that the user clicked before showing up
                        // params will be empty if no data found
                        String pictureID = referringParams.optString(""picture_id"", """");
                        if (pictureID.equals("""")) {
                            startActivity(new Intent(this, HomeActivity.class));
                        }
                        else {
                            Intent i = new Intent(this, ViewerActivity.class);
                            i.putExtra(""picture_id"", pictureID);
                            startActivity(i);
                        }
                    } else {
                        Log.e(""MyApp"", error.getMessage());
                    }
                }
            }).withData(this.getIntent().getData()).init();
        }

Branch 添加的参数

除了在链接数据 dictionary 中指定的任何自定义 key/值对之外,每次会话初始化时,Branch 还返回一些其他有用的参数。即使用户未点击 Branch Link,每次初始化会话时也将返回这些参数。这是一个列表,以及每个代表什么的描述。

  • ~ 表示分析
  • + 表示 Branch 添加的信息
  • 该数据将无法用于来自 Facebook 或其他自归因平台的深度链接
  • 给好奇者,$ 表示用于控制 Branch 服务行为的保留关键字。在 Configuring Links 页面上了解有关控制参数的更多信息

参数

意义

+is_first_session

表示这是第一个会话(安装)还是任何其他会话(重新安装,打开)

+clicked_branch_link

表示用户是否点击了触发该会话的 Branch Link

+match_guaranteed

关于匹配是否以100%的准确性进行的判断是对还是错

+referrer

点击链接的推荐人来源网址(如果已点击链接)

+click_timestamp

点击发生的时间戳记

+url

驱动安装/打开的链接的完整 URL(如果存在)(例如,yourapp.app.link / abcde12345)

~channel

在创建链接时指定共享链接的渠道

~feature

创建链接时指定的功能,例如邀请或分享

~tags

在链接创建时指定的任何标签

~campaign

与链接关联的 Campaign,在链接创建时指定

~creation_source

链接创建位置 ('API', 'Dashboard', 'SDK', 'iOS SDK', 'Android SDK', 或 'Web SDK')

~id

自动生成驱动安装/打开的链接的18位ID号(如果存在)(对于动态和3P链接为0)

稍后访问深度链接参数

您可以随时通过调用以下方法之一从 Branch singleton 中检索深度链接数据。如果要在提示用户登录后进行深度链接,则可以使用此方法。您可以在此处查看其他平台的代码片段。

获取最新的会话引用参数

这将从点击的最新链接中返回最新的深度链接数据集。如果您最小化该应用并重新打开它,则该会话将被清除,该数据也将被清除。

iOS

NSDictionary *params = [[Branch getInstance] getLatestReferringParams];

Android

JSONObject sessionParams = Branch.getInstance().getLatestReferringParams();

获取第一次会话引用参数

这将返回曾经引用用户的第一组深度链接数据。一旦为给定用户进行了设置 ,就永远无法更新。这对于推荐很有用。

iOS

NSDictionary *params = [[Branch getInstance] getFirstReferringParams];

Android

JSONObject installParams = Branch.getInstance().getFirstReferringParams();

选项 2:让 Branch 使用您现有的深度链接路由

如果你的应用中使用 URI 路径已经支持深度链接,您可以填充 $deeplink_path$ios_deeplink_path$android_deeplink_path ,以在该应用内显示与内容的 URI 路径的链路参数。当 Branch SDK 收到包含这些参数之一的链接时,它将自动加载指定的 URI 路径。

🚧

对 iOS 不完全支持

Universal Links and Spotlight do not support deep linking via URI paths. If you use $deeplink_path or $ios_deeplink_path, you will need to implement some custom logic. Click here for more information.

如何将自定义深度链接路由插入 Branch Link

以下所有示例均创建链接,这些链接将使 Branch 在启动后显示myapp://content/1234。请不要在$deeplink_path参数上添加 URI scheme;我们会自动附加在操作后台 (Dashboard)的配置(Configuration)页面中指定的方案。

动态创建链接时
如果您通过附加查询参数重新创建链接,则只需将控制参数附加到 URL。请确保对所有内容进行 URL 编码,否则链接将断开。

"https://[branchsubdomain]?%24deeplink_path=content%2F1234"

使用移动 SDK 时

iOS

BranchLinkProperties *linkProperties = [[BranchLinkProperties alloc] init];
linkProperties.feature = @"sharing";
linkProperties.channel = @"facebook";
[linkProperties addControlParam:@"$deeplink_path" withValue:@"content/1234"];

Android

LinkProperties linkProperties = new LinkProperties()
.setChannel("facebook")
.setFeature("sharing")
.addControlParameter("$deeplink_path", "content/1234");

📘

在操作后台 (Dashboard) 创建 Quick Link 时

您可以通过将 key 和值插入深度链接数据(高级)部分来指定单个 Quick Link 的控制参数。

如何使用 Universal Links 或 App Links 链接处理 URI 路径

因为 Universal Links,Spotlight 和 Android App Links 不使用 URI scheme 进行深度链接路由。如果填充 $deeplink_path$ios_deeplink_path$android_deeplink_path 与 URI 路径,则需要一点额外的工作,以确保按照原来的模式是 Branch Links 的联系途径。

  1. 按照应用配置步骤中所述初始化会话。
  2. 在回调 Function 中,添加一些自定义代码以在 params 读取相应的 $deeplink_path 参数
  3. 使用此值来调用现有的路由逻辑,以将用户路由到应用中的正确位置

选项3:使用 Branch 的简单配置来深度链接路由

在 iOS 中自动路由

配置 View Controller 以接受深度链接

打开您要在用户点击链接时显示的视图控制器。例如,这可能是显示产品的视图。首先,导入 Branch 框架:

#import "Branch.h"

为委托 BranchDeepLinkingController 注册您的视图控制器:

@interface ExampleDeepLinkingController : UIViewController <BranchDeepLinkingController>

接收从链接点击加载 view controller 时将调用的委托方法:

@synthesize deepLinkingCompletionDelegate;
    - (void)configureControlWithData:(NSDictionary *)data {
        NSString *pictureUrl = data[@"product_picture"];

        // show the picture
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:pictureUrl]];
            UIImage *image = [UIImage imageWithData:imageData];
            dispatch_async(dispatch_get_main_queue(), ^{
                self.productImageView.image = image;
            });
        });
    }

什么是链接数据 Key?
Example Key product_picture是来自被点击链接的 data dictionary 的参数,该参数在创建链接时已被定义。

- (IBAction)closePressed {
    [self.deepLinkingCompletionDelegate deepLinkingControllerCompleted];
}

注册 View Controller 以进行深度链接路由

最后,您需要告诉 Branch 刚刚配置的 view controller,以及链接的数据 dictionary 中使用的 Key。

[branch initSessionWithLaunchOptions:launchOptions andRegisterDeepLinkHandler:^(NSDictionary *params, NSError *error) {
        if (!error && params) {
            // params are the deep linked params associated with the link that the user clicked -> was re-directed to this app
            // params will be empty if no data found
            // ... insert custom logic here ...
            print(@"params: %@", params.description);
        }
    }];

将其删除,然后将此片段插入相同的位置:

ExampleDeepLinkingController *controller = [[UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]] instantiateViewControllerWithIdentifier:@"DeepLinkingController"];

    [branch registerDeepLinkController:controller forKey:@"product_picture" withPresentation:BNCViewControllerOptionShow];
    [branch initSessionWithLaunchOptions:launchOptions automaticallyDisplayDeepLinkController:YES

现在,只要您的应用通过在其数据字典中设置了product_picture key 的Branch Link 启动,就会显示 ExampleDeepLinkingController视图控制器!

选项

意义

BNCViewControllerOptionShow

该选项将 view controller 以与 showViewController 类似的方式推入导航堆栈

BNCViewControllerOptionPush

该选项将 view controller 以与 showViewController 类似的方式推入导航堆栈

BNCViewControllerOptionPresent

此选项以类似于 presentViewControlle r的方式将 view controller 呈现到窗口的根视图控制器上

📘

View Controller

BNCViewControllerOptionShow BNCViewControllerOptionPush 选项仅在窗口的根视图控制器的类型为 UINavigationViewController 时才推送视图控制器。否则,默认情况下将显示视图控制器。

Android 中的自动路由

配置 Activity 以接受深度链接

打开您要在用户点击链接时显示的 Activity。例如,这可以是展示产品的 Activity。从链接点击加载 Activity 时,插入以下代码片段以显示您的内容:

@Override
protected void onResume() {
    super.onResume();
    if (Branch.isAutoDeepLinkLaunch(this)) {
        try {
            String autoDeeplinkedValue = Branch.getInstance().getLatestReferringParams().getString("product_picture");
            launch_mode_txt.setText("Launched by Branch on auto deep linking!"
                    + "\n\n" + autoDeeplinkedValue);
        } catch (JSONException e) {
            e.printStackTrace();
        }
    } else {
        launch_mode_txt.setText("Launched by normal application flow");
    }
}

📘

什么是链接数据 Key?

Example Key product_picture是来自被点击链接的 data dictionary 的参数,该参数在创建链接时已被定义。

注册 Activity 以进行深度链接路由

最后,您需要从链接数据 dictionary 中告诉 Branch 刚刚配置的 Activity,以及正在使用的 Key。在清单文件中,找到上面 Activity 的定义,然后添加以下元数据标签:

<meta-data android:name="io.branch.sdk.auto_link_keys" android:value="product_picture" />

现在,只要您的应用从在其数据 dictionary 中设置了product_picture Key 的 Branch Link 启动,就会显示此 Activity!


这个页面对您有帮助吗?