iOS 14 实施
为了帮助您全面管理用户体验,Branch SDK 将不会触发 IDFA 许可模式。
然而,如果您选择触发这一模式,在可行的情况下,Branch 仍然可以收集并使用 IDFA。
iOS 11.2上通用链接行为不一致
将设备更新到iOS 11.2后,我们发现在安装应用程序后,该应用程序的AASA文件不再可靠地下载到您用户的设备上。因此,单击“通用”链接将不再始终打开该应用程序。
您可以在分支链接上设置强制uri重定向模式,以使用URI方案打开应用程序。在Apple Bug报告中查看问题的详细信息。
Google Play 服务版本17+
如果您引用的是 Google Play 服务版本17或更高版本,则必须在此处完成 Google 的更新说明。
由于 Google Play 服务于2019年6月进行了重大更改,未完成更新步骤将导致 Branch 的 Android SDK(以及其他各种跨平台 SDK,例如 Unity)停止收集 Android AID,我们使用该 ID 来确保准确的深度链接和归因。
如果您运行的 Google Play 服务版本低于17,则无需更新。
注意:要将17以下的Google Play服务版本用于以后的应用构建,请按照以下变通方法实施步骤进行操作。
配置 Branch
- 完成您的分支仪表板
- 自定义您的app.link域:
配置分支SDK
-
下载最新的SDK版本或克隆我们的开源GitHub存储库。
-
单击
Assets -> Import Package
将BranchUnityWrapper.unitypackage导入项目。
配置应用
- 将Branch预制资产添加到Unity项目的first scene
更新您的Branch预制
完成后,请不要忘记单击“更新iOS包装器”和“更新Android清单”按钮。
预制领域
栏位名称 | 描述 |
---|---|
模拟全新安装 | 此复选框启用调试模式。这使您可以在每次卸载并重新安装该应用程序时进行全新模拟。在发布您的应用程序之前,请确保取消选中此框。 |
测试模式 | 此复选框从您的Branch预制中选择测试密钥。如果未选中此框,则默认情况下,将使用活动的分支键。 |
测试分支键 | 这是在“测试分支”应用程序的“应用程序设置”页面上找到的测试分支键 |
测试分支URI | 这是您在“测试分支”应用程序的“ 链接设置”页面 为应用程序设置的测试URI方案 |
测试Android路径前缀 | 仅当您位于Test Branch应用程序的bnc.lt 域中时,此字段才适用。启用应用链接后,您可以在“ 链接设置”页面 上标记为SHA256证书指纹的字段下方找到它。它看起来像这样: /WSuf (应包含首字母/字符)。 |
测试应用链接 | 如果您要为域启用APPLINKS 和UNIVERSAL LINKS ,则此字段适用。请确保添加正确的域,该域位于Test Branch应用程序的“ 链接设置”页面 的底部。添加-alternate域,使您的Branch链接从您的 Deepviews 和 Journeys 深链接。如果您没有使用app.links 域,请联系我们的 支持团队 |
实时分支密钥 | 这是在Live Branch应用程序的“应用程序设置”页面上找到的Live Branch键。 |
实时分支URI | 这是您在Live Branch应用程序的“链接设置”页面上为应用程序设置的Live URI方案 |
实时Android路径前缀 | 仅当您位于Live Branch应用的bnc.lt 域 链接设置页 上时,此字段才适用。启用应用链接后,您可以在“ 链接设置”页面 上标记为SHA256证书指纹的字段下方找到它。它看起来像这样: /WSuf (应包含首字母/字符)。 |
实时应用链接 | 如果您要为域启用APPLINKS 和UNIVERSAL LINKS ,则此字段适用。请确保添加在Live Branch应用的“ 链接设置”页面 底部找到的正确域。添加-alternate域,使您的Branch链接从您的 Deepviews 和 Journeys 深链接。如果您没有使用app.links 域,请联系我们的 支持团队 。 |
- Android笔记
有时,由于与Branch无关的一般性问题,在添加我们的库后,Android会倒转。请参阅此Android故障排除部分
初始化 Branch
- 将“分支”添加到第一个场景的
Monobehavior
脚本中
using UnityEngine;
using System.Collections;
public class Spin : MonoBehaviour {
// Use this for initialization
void Start () {
Branch.initSession(CallbackWithBranchUniversalObject);
}
void CallbackWithBranchUniversalObject(BranchUniversalObject buo,
BranchLinkProperties linkProps,
string error) {
if (error != null) {
System.Console.WriteLine("Error : "
+ error);
} else if (linkProps.controlParams.Count > 0) {
System.Console.WriteLine("Deeplink params : "
+ buo.ToJsonString()
+ linkProps.ToJsonString());
}
}
// Update is called once per frame
void Update () {
//rotate 90 degress per second
transform.Rotate(Vector3.up * Time.deltaTime*90);
}
}
测试深度链接
-
在分支仪表板上创建一个快速链接
-
从设备中删除您的应用程序
-
将快速链接粘贴到Google Hangouts (Android)或Notes (iOS)
-
点击快速链接以打开您的应用
-
编译您的应用并将其下载到设备
-
您应该在应用中看到延迟的深层链接数据显示
实施功能
创建内容参考
- Branch Universal Object封装了您要与链接共享的内容
BranchUniversalObject universalObject = new BranchUniversalObject();
// Content index mode: 0 - private mode, 1 - public mode
universalObject.contentIndexMode = 1;
//Identifier that helps Branch dedupe across many instances of the same content.
universalObject.canonicalIdentifier = "id12345";
// OG title
universalObject.title = "id12345 title";
// OG Description
universalObject.contentDescription = "My awesome piece of content!";
// OG Image
universalObject.imageUrl = "https://s3-us-west-1.amazonaws.com/branchhost/mosaic_og.png";
// User defined key value pair
universalObject.metadata.Add("foo", "bar");
创建深度链接
- 创建
Branch Universal Object
,定义链接属性
BranchLinkProperties linkProperties = new BranchLinkProperties();
linkProperties.tags.Add("tag1");
linkProperties.tags.Add("tag2");
// Feature link is associated with. Eg. Sharing
linkProperties.feature = "invite";
// The channel where you plan on sharing the link Eg.Facebook, Twitter, SMS etc
linkProperties.channel = "Twitter";
// The Campaign that drives this link
linkProperties.campaign = "referral";
linkProperties.stage = "2";
// Parameters used to control Link behavior
linkProperties.controlParams.Add("$desktop_url", "http://example.com");
- 生成分支链接
Branch.getShortURL(universalObject, linkProperties, (params, error) => {
if (error != null) {
Debug.LogError("Branch.getShortURL failed: " + error);
} else if (params != null) {
Debug.Log("Branch.getShortURL shared params: " + url);
}
});
分享深度链接
- 在用户和应用之间共享深层链接
Branch.shareLink(universalObject, linkProperties, "Sharing link: ", (parameters, error) => {
if (error != null) {
Debug.LogError("Branch.shareLink failed: " + error);
} else if (parameters != null) {
Debug.Log("Branch.shareLink: " + parameters["sharedLink"].ToString() + " " + parameters["sharedChannel"].ToString());
}
});
读取深度链接
-
从
BranchInitSession callback
的BUO读取Deeplink参数 -
返回深度链接属性
public void CallbackWithBranchUniversalObject(BranchUniversalObject universalObject, BranchLinkProperties linkProperties, string error) {
if (error != null) {
Debug.LogError("Branch Error: " + error);
} else {
Debug.Log("Branch initialization completed: ");
Debug.Log("Universal Object: " + universalObject.ToJsonString());
Debug.Log("Link Properties: " + linkProperties.ToJsonString());
}
}
这与每个会话(应用安装和应用打开)相关
分支初始化后从任何地方读取安装(安装或打开)参数
BranchUniversalObject obj = Branch.getFirstReferringBranchUniversalObject();
BranchLinkProperties link = Branch.getFirstReferringBranchLinkProperties();
导航和显示内容
- 使用链接参数来确定要加载的视图
public class MyCoolBehaviorScript : MonoBehaviour {
void Start () {
Branch.initSession(delegate(Dictionary<string, object> parameters, string error) {
if (parameters.ContainsKey("picture_id") {
// load the Scene to show the picture
SceneManager.LoadSceneAsync("ImageScene", LoadSceneMode.Additive);
} else {
// load your normal Scene
SceneManager.LoadSceneAsync("NormalScene", LoadSceneMode.Single);
}
});
}
}
跟踪内容
- 如果要跟踪用户查看BUO内容的次数
Branch.registerView(universalObject);
跟踪用户
在登录/注册上设置用户ID
Branch.setIdentity("your user id");
注销时取消设置用户标识
Branch.logout();
追踪用户操作和事件
使用BranchEvent类可跟踪特殊的用户操作或特定于应用程序的事件,而不仅仅是应用程序的安装,打开和共享。您可以跟踪事件,例如用户何时将商品添加到在线购物车中或搜索关键字等。BranchEvent提供一个接口来添加由BranchUniversalObject表示的内容,以便将内容与事件。您可以查看在“分支”仪表板上触发的BranchEvent的分析。 BranchEventType枚举最常跟踪的事件以及可以与BranchEvent一起使用以获得最佳结果的事件参数。您始终可以使用自定义事件名称和事件参数。
BranchEvent e01 = new BranchEvent (BranchEventType.COMPLETE_REGISTRATION);
e01.SetAffiliation("my_affilation");
e01.SetCoupon("my_coupon");
e01.SetCurrency(BranchCurrencyType.USD);
e01.SetTax(10.0f);
e01.SetRevenue(100.0f);
e01.SetShipping(1000.0f);
e01.SetDescription("my_description");
e01.SetSearchQuery("my_search_query");
e01.AddCustomData("custom_data_key01", "custom_data_value01");
e01.AddContentItem(universalObject);
Branch.sendEvent (e01);
BranchEvent e02 = new BranchEvent ("MY_CUSTOM_EVENT");
e02.SetAffiliation("my_affilation");
e02.SetCoupon("my_coupon");
e02.SetCurrency(BranchCurrencyType.USD);
e02.SetTax(10.0f);
e02.SetRevenue(100.0f);
e02.SetShipping(1000.0f);
e02.SetDescription("my_description");
e02.SetSearchQuery("my_search_query");
e02.AddCustomData("custom_data_key01", "custom_data_value01");
e02.AddContentItem(universalObject);
Branch.sendEvent (e02);
排查问题
iOS + Unity 4.6注意
Branch需要ARC,并且我们不打算在整个SDK中添加检查以尝试并支持ARC之前的版本。
但是,您可以将标志添加到项目中,以使用ARC编译Branch文件。如果您想这样做
将-fobjectivec-arc
添加到所有分支文件。
注意:默认情况下,我们会选中此标志,但请在为iOS构建之前进行检查。
Android-使用您自己的自定义应用程序类
如果您使用自己的Custom Application类,则需要在您的项目中添加Branch android库,并在OnCreate()方法中调用以下代码:
Branch.getAutoInstance(this.getApplicationContext());
如果您使用自己的自定义Activity类,请确保您覆盖以下Activity:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public void onNewIntent(Intent intent) {
this.setIntent(intent);
}
支持分支与不同的插件
Branch SDK具有自己的自定义activity
和application
类。其他使用自己的插件
定制活动和应用程序类可能导致这些类之间的“冲突”。解决这些冲突:
- 创建一个空的android库
- 将Branch插件以及其他插件添加到您的项目中
- 创建一个自定义的Activity和Application类,其中将包含所有插件的自定义逻辑
- 建立你的图书馆
- 将您的库添加到Unity项目
- 在清单的
application
标记中将android:name更改为自定义Application类的名称 - 在清单的
activity
标记中将android:name更改为自定义Activity类的名称
支持几个IMPL_APP_CONTROLLER_SUBCLASS
Branch Unity SDK插件使用其自己的UnityAppController来扩展默认AppController。这用于捕获通用链接。
@interface BranchAppController : UnityAppController
{
}
@end
@implementation BranchAppController
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray *))restorationHandler {
BOOL handledByBranch = [[BranchUnityWrapper sharedInstance] continueUserActivity:userActivity];
return handledByBranch;
}
@end
IMPL_APP_CONTROLLER_SUBCLASS(BranchAppController)
某些插件会扩展默认的AppController,就像Branch的Cardboard SDK插件一样。解决冲突:
- 将所有自定义AppController合并到一个。
- 注释其他AppController中的代码(或删除其他AppController)。
示例应用
使用Google Play服务<版本17的变通办法实施步骤
-
安装
BranchUnityWrapper.unitypackage
。 -
从Assets-> Plugins-> Branch-> Android-> libs中删除
android-support-customtabs-23.3.0.jar
。 -
创建一个Assets-> Plugins-> Branch-> Editor文件夹。
-
将附加的
BranchPluginDependencies.xml
添加到新的Editor文件夹中。 -
从https://github.com/googlesamples/unity-jar-resolver安装最新的Google Play解析器
-
它应该自动解决依赖关系,但是您可能需要从播放解析器菜单中列出库来进行确认。您应该看到以下块:
dependencies {implementation 'com.android.installreferrer:installreferrer:1.0' // Assets/Plugins/Editor/BranchPluginDependencies.xml:11implementation 'com.android.support:customtabs:23.3.0' // Assets/Plugins/Editor/BranchPluginDependencies.xml:13implementation 'com.google.android.gms:play-services-ads:16.0.0' // Assets/Plugins/Editor/BranchPluginDependencies.xml:12}
4个月前更新