应用内路由

概述

打开“Branch”链接后,应用程序会被开启或用户被带到应用商店下载。应用启动后,深度链接接通过将用户直接路由到特定内容来改善用户体验。使用Branch,即使用户必须先停止并下载该应用程序(aka, "延迟深度链接接" ),该方法仍然有效。

深度链接接是提供高质量用户体验的极其重要的部分。通过深度链接接,您可以将用户带到他们点击的确切位置,甚至提供定制的体用户引导验。

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

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

在会话初始化期间注册的深层链接处理程序回调中,您将需要检查params字典以确定用户是否打开了Branch链接。以下是假定链接对应于图片的示例。以下是我们从iOS和Android的一些例子'再使用pictureId 关键路线,但你可以看到更多的代码片段对于这里的其他平台。

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;
	}
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
	    let branch: Branch = Branch.getInstance()
			branch.initSession(launchOptions: launchOptions, andRegisterDeepLinkHandler: {params, error in
	        // If the key 'pictureId' is present in the deep link dictionary
	        if error == nil && params["+clicked_branch_link"] != nil && params["pictureId"] != nil {
	            print("clicked picture link!")
	            // load the view to show the picture
	        } else {
	            // load your normal view
	        }
	    })
	    return true
	}

安卓

@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添加的参数

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

  • ~ 表示分析
  • + 表示Branch添加的信息
  • 该数据将无法用于来自Facebook或其他自我归因平台的深度链接接
  • $ 表示用于控制Branch服务行为的保留关键字。有关控制参数的更多信息,请参见配置链接页)。
参数 意义
+is_first_session 表示这是第一个会话(安装)还是任何其他会话(重新安装,打开)
+clicked_branch_link 表示用户是否点击了触发该会话的Branch链接
+match_guaranteed 关于匹配是否以100%的准确性进行的判断是对还是错
+referrer 点击链接的引荐来源网址(如果点击了链接)
+click_timestamp 点击发生的时间时间戳记
+url 驱动安装/打开的链接的完整URL(如果存在)(例如,yourapp.app.link / abcde12345)
~channel 在创建链接时指定共享链接的通道
~feature 在链接创建时指定的功能,例如inviteshare
~tags 在链接创建时指定的任何标签
~campaign 与链接关联的广告系列,在链接创建时指定
~creation_source 其中链路被创建( ' API ' , '仪表板' , ' SDK ' , '的iOS SDK ' , '的Android SDK ' ,或'的Web SDK ' )
~id 自动生成驱动安装/打开的链接的18位ID号(如果存在)(对于动态和3P链接为0)

稍后访问深度链接接参数

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

获取最新的会话引用参数

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

iOS

NSDictionary *params = [[Branch getInstance] getLatestReferringParams];
let sessionParams = Branch.getInstance().getLatestReferringParams()

安卓

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

获取第一次会话引用参数

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

iOS

NSDictionary *params = [[Branch getInstance] getFirstReferringParams];
let firstParams = Branch.getInstance().getFirstReferringParams()

安卓

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

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

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

对iOS的不完全支持

通用链接 Spotlight 不支持通过URI路径进行深层链接。如果使用$deeplink_path$ios_deeplink_path ,则需要实现一些自定义逻辑。 单击此处了解更多信息

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

下面的所有示例均创建链接,这些链接将导致Branch在启动后显示myapp://content/1234 。请不要在$deeplink_path 参数上添加URI scheme;我们会自动附加在信息中心的链接设置中指定的方案。

动态创建链接时

如果您通过附加查询参数'重新创建链接,则只需将控制参数附加到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"];
let linkProperties: BranchLinkProperties = BranchLinkProperties()
linkProperties.feature = "sharing"
linkProperties.channel = "facebook"
linkProperties.addControlParam("$deeplink_path", withValue: "content/1234")

安卓

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

在仪表板上创建Quick Links时

您可以通过将键和值插入“ 深度链接数据(高级) 部分来指定各个快速链接的控制参数。

图像

如何使用通用链接或应用程序链接处理URI路径

因为通用链接,Spotlight和Android应用程序链接不使用URI方案进行深度链接接路由。如果填充$deeplink_path$ios_deeplink_path$android_deeplink_path 与URI路径,则需要一点额外的工作,以确保按照原来的模式是分公司的联系途径。

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

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

在iOS中自动路由

配置View Controller以接受深度链接接

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

#import "Branch.h"
import Branch

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

@interface ExampleDeepLinkingController : UIViewController <BranchDeepLinkingController>
class ExampleDeepLinkingController: UIViewController, BranchDeepLinkingController

接收从链接点击加载视图控制器时将调用的委托方法:

@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;
			});
		});
	}
func configureControl(withData params: [AnyHashable: Any]!) {
	    let dict = params as Dictionary
	    if dict["product_picture"] != nil {
		   // show the picture
	    }
	}

什么是链接数据密钥?

示例键product_picture 是来自链接的数据字典中的参数,该参数在创建链接时已定义。

- (IBAction)closePressed {
    [self.deepLinkingCompletionDelegate deepLinkingControllerCompleted];
}
var deepLinkingCompletionDelegate: BranchDeepLinkingControllerCompletionDelegate?
func closePressed() {
    self.deepLinkingCompletionDelegate!.deepLinkingControllerCompleted()
}

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

最后,您需要告诉Branch刚刚配置的视图控制器,以及链接'的数据字典中使用的密钥。

[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);
	    }
	}];
branch.initSession(launchOptions: launchOptions, deepLinkHandler: { params, error in
	    if error == nil {
	        // 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];
var controller = UIStoryboard.init("Main", NSBundle.mainBundle()).instantiateViewControllerWithIdentifier("DeepLinkingController")

	branch.registerDeepLinkController(controller, forKey: "product_picture", withPresentation: .optionShow)
	branch.initSession(launchOptions: launchOptions, automaticallyDisplayDeepLinkController: true)

现在,只要您的应用程序从在其数据字典中设置了product_picture 键的Branch链接启动,就会显示ExampleDeepLinkingController 视图控制器!

选项 意义
BNCViewControllerOptionShow 该选项将视图控制器以与showViewController类似的方式推入导航堆栈
BNCViewControllerOptionPush 该选项将视图控制器以与pushViewController类似的方式推入导航堆栈
BNCViewControllerOptionPresent 此选项以类似于presentViewController的方式将视图控制器呈现到窗口的根视图控制器上

查看控制器

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

Android中的自动路由

配置活动以接受深度链接接

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

@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");
    }
}

什么是链接数据密钥?

示例键product_picture 是来自链接的数据字典中的参数,该参数在创建链接时已定义。

注册活动以进行深度链接接路由

最后,您需要从链接'的数据字典中告诉Branch刚刚配置的Activity,以及正在使用的密钥。在清单文件中,找到上面“活动”的定义,然后添加以下元数据标记:

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

现在,只要您的应用程序从在其数据字典中设置了product_picture 键的Branch链接启动,就会显示此活动!

大约一个月前更新

应用内路由


建议的编辑仅限于API参考页

您只能建议对Markdown正文内容进行修改,而不能建议对API规范进行修改。