iOS完整参考

迦太基兼容 麻省理工学院许可

在CocoaPods中可用

分支可通过 CocoaPods 。要安装它,只需将以下行添加到您的Podfile中:

pod 'Branch'

然后,从命令行将cd 转到您的项目目录,然后执行以下操作:

pod install
pod update

安装Branch pod并将其更新到最新版本的SDK。

确保执行pod update 。否则,CocoaPods可能不会使用最新版本的SDK!

迦太基

要使用Carthage将Branch集成到您的项目中,请将以下内容添加到Cartfile

github "BranchMetrics/ios-branch-deep-linking"

下载原始文件

您也可以通过下载以下原始文件进行安装。

将Raw Files Branch SDK添加到您的项目

如果要不使用Cocoapods或Carthage而直接添加Branch SDK,则将Branch作为动态框架依赖项添加到项目中。

我将以'将Branch添加到项目' BareBones '为例:

  1. 下载或git将Branch SDK文件克隆到您的计算机。

  2. 如果' VE已经添加分行您的项目,将其删除。

  3. 在Xcode项目导航器视图中,选择您的项目,右键单击,然后选择'将文件添加到" \ <您的项目名称\ > " ... '

添加文件...

  1. ' Add '文件选择器将打开。导航到' ios-branch-deep-linking >迦太基文件'目录,然后选择BranchSDK.xcodeproj项目。

添加BranchSDK.xcodeproj

Xcode会将BranchSDK.xcodeproj添加到您的项目中。

  1. 在您的项目中,显示' BranchSDK.xcodeproj >产品'层次结构。然后将Branch.framework产品拖动到构建产品的' Embedded Binaries '部分。

嵌入二进制

  1. 做完了!您可以单击项目的“构建阶段”,以确保将Branch添加为目标依赖项并复制为嵌入式框架。

检查构建阶段

注册您的应用

您可以在 https://dashboard.branch.io 注册自己的应用程序ID。

将您的分支键添加到您的项目

注册应用程序后,可以在仪表板的“ 设置页面上检索分支键。现在,您需要将其添加到YourProject-Info.plist(Swift的Info.plist)。

  1. 在plist文件中,鼠标悬停"信息属性列表, "悬停在Key列下的根项目。
  2. 大约半秒钟后,你会看到一个" + "标志出现。点击它。
    3在新添加的行中,为其键填充" branch_key " ,将类型保留为String,然后在值列中输入您的应用程序' s通过上述步骤获得的Branch Key。
  3. 保存plist文件。

分支键演示

如果要同时为实时和测试应用添加密钥,则需要将类型列更改为字典,并在其中添加两个条目:

  1. 对于实时应用程序,将" live " (不带双引号)用作键,将String用于类型,将live分支键用作值。
  2. 对于测试应用程序,将"测试" (不带双引号)用作键,将String用作类型,将测试分支键用作值。

分支多键演示

注意:如果使用Fabric将Branch作为工具包安装,则Branch键将作为Fabric > Kits数组下的元素位于Info.plist中,如下所示:

分支机构密钥

注册URI方案

通过在YourProject-Info.plist文件中添加URI方案,注册您的应用程序以响应直接的深层链接(在移动浏览器中为yourapp://)。确保将 yourapp 更改为代表您的应用程序名称的唯一字符串。

  1. 在Xcode中,单击左侧的YourProject-Info.plist。
  2. 查找URL类型,然后单击向右箭头。 (如果不存在' t,请在任何位置单击鼠标右键,然后选择“添加行”。向下滚动并选择“ URL类型”)。
  3. 添加" yourapp, "其中yourapp是应用程序的唯一字符串)作为URL方案中的一项,如下所示。

警告:您的应用URI方案必须是列表中定义的第一个方案(项目0)。

如果您定义了多个方案,例如Facebook登录URI,则将您的应用'的URI方案设为列表中的第一个方案,以便Branch SDK知道特定于您的应用的URI。

URL方案演示

或者,您可以在项目'的“信息”页面中添加URI方案。

  1. 在Xcode中,在导航器中(左侧)单击您的项目。
  2. 选择"信息"标签。
  3. 展开底部的" URL Types "部分。
  4. 单击" + "符号以添加新的URI方案,如下所示:

URL方案演示

支持通用链接(iOS 9及更高版本)

在iOS 9中,Apple添加了允许http链接直接打开您的应用程序的功能,而不是使用URI方案。设置起来很麻烦,因为它涉及服务器上的复杂过程。好消息是,Branch仅需两个步骤即可为您完成这项工作!

  1. 在Xcode中,在导航器中(左侧)单击项目。
  2. 选择"功能"选项卡。
  3. 展开"关联的域"选项卡。
  4. 启用设置(切换开关)。
  5. applinks:xxxx.app.linkapplinks:xxxx-alternate.app.link 添加到列表中。确保xxxx 与您的应用程序的4个字符子域匹配(您可以在仪表板上的找到它)。如果您使用自定义子域,请使用它代替x ' s(例如imgur.app.linkimgur-alternate.app.link )。
  6. 添加您拥有的其他任何自定义域(例如applinks:vng.io

Xcode启用UL

  1. 在控制台上,导航到您的应用程序'的链接设置页面。
  2. 选中"启用通用链接
  3. 确保您的Apple Team ID和App Bundle ID是正确的(我们会尝试自动为您收集它们)。
  4. 确保保存这些设置更新。

仪表板启用UL

自定义域名配置(如果您不使用'分支提供的xxxx.app.link域,则为必填项)

Branch为您的应用程序提供了一个xxxx.app.link域,但是您可以使用自己的自定义域来创建应用程序链接。如果您将做为将自己的自定义域用于通用应用程序链接,则需要将其添加到Info.plist。

使用自定义域将branch_universal_link_domains 键添加为字符串值:

自定义域信息列表

URI方案注意事项

该科SDK将从您的列表不是一个拉头URI方案fbdb ,或pin 。将使用此值一次来在“分支仪表板”中的“链接设置”下设置iOS URI方案。

有关配置SDK的其他帮助(包括分步说明),请参阅《 iOS快速入门指南

获取Singleton分支实例

所有Branch方法都需要主Branch对象的实例。在这里, ' s如何获得一个。这'小号静态存储和从任何类访问。

方法

Branch *branch = [Branch getInstance];
let branch: Branch = Branch.getInstance()

Testing

测试您的Branch集成

通过在AppDelegate中调用validateSDKIntegration 来测试Branch集成。检查您的Xcode日志,以确保所有SDK集成测试都通过。确保在生产版本中注释掉或删除validateSDKIntegration

Branch.getInstance().validateSDKIntegration()
[[Branch getInstance] validateSDKIntegration];

测试Branch链接的Deeplink路由

?bnc_validate=true 附加到您的任何应用程序的Branch链接上,然后在移动设备(不是Simulator!)上点击它以开始测试。例如,要验证以下链接: "https://<yourapp\>.app.link/NdJ6nFzRbK" 点击: "https://<yourapp\>.app.link/NdJ6nFzRbK?bnc_validate=true"

//TODO: Remove for launch
Branch.setUseTestBranchKey(true)
#warning Remove for launch
[Branch setUseTestBranchKey:YES];

参量

科键 (的NSString *) 可选
如果你不' T商店中plist文件科键之前,必须通过这个密钥作为参数的选项。

初始化分支会话和深度链接路由功能

要进行深层链接,Branch必须初始化会话以检查用户是否源自链接。每次应用打开时,此调用都会初始化一个新的会话 。应用程序打开的时间为100%,它将调用深度链接处理块以通知您用户是否来自链接。如果您的应用在PARAMS键打开,你'会要路由根据您在传递数据的用户。否则,将其发送到通用画面。

方法

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
  let branch: Branch = Branch.getInstance()
  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
        print("params: %@", params.description)
    }
   })
  return true
}

func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
    // Pass the url to the handle deep link call
    let branchHandled = Branch.getInstance().application(
        application,
        open: url,
        options: options
    )
    if (!branchHandled) {
        // If not handled by Branch, do other deep link routing for the
        // Facebook SDK, Pinterest SDK, etc
    }

    return true
}

func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
    let handledByBranch = Branch.getInstance().continue(userActivity)

    return handledByBranch
}

func application(_ application: UIApplication, didReceiveRemoteNotification launchOptions: [AnyHashable: Any]) -> Void {
    Branch.getInstance().handlePushNotification(launchOptions)
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    Branch *branch = [Branch getInstance];
    [branch initSessionWithLaunchOptions:launchOptions andRegisterDeepLinkHandler:^(NSDictionary *params, NSError *error) {
    	// route the user based on what's in params
    }];
    return YES;
}

- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
            options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
    BOOL branchHandled =
        [[Branch getInstance]
            application:application
                openURL:url
                options:options];
    if (!branchHandled) {
        // do other deep link routing for the Facebook SDK, Pinterest SDK, etc
    }
    return YES;
}

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> *restorableObjects))restorationHandler {
    BOOL handledByBranch = [[Branch getInstance] continueUserActivity:userActivity];

    return handledByBranch;
}

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
    [[Branch getInstance] handlePushNotification:userInfo];
}

注意:如果您的应用程序委托声明了该方法:

- (BOOL) application:willFinishLaunchingWithOptions:

在Swift中:

optional func application(_ application: UIApplication, willFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool

它必须返回YES 才能使Branch工作。

参量

初始化会话

launchOptions (NSDictionary *) 必填
这些启动选项通过didFinishLaunchingWithOptions传递给Branch,并将通知我们用户是否来自URI调用。如果应用是通过myapp://之类的URI打开的,则需要遵循特殊的初始化例程。

deepLinkHandler ^(NSDictionary 参数,NSError 错误) 可选
这是在网络调用确定用户来自何处后Branch将执行的回调块。自分支机构注册生命周期通知以来,它被称为应用程序打开时间的100%。

  • NSDictionary *参数
    这些参数将包含与在应用程序会话开始之前单击的Branch链接相关的任何数据。总是有一些键:
    • ' + is_first_session '表示这是第一个会话(安装)还是任何其他会话(打开)
    • ' + clicked_branch_link '表示用户是否单击了触发此会话的分支链接
  • NSError *错误
    除非存在连接或其他错误,否则此错误将为nil。检查!error以确认它是有效的链接。
    • BNCServerProblemError连接到分支服务时出现问题
    • BNCBadRequestError请求的格式不正确

分支每次都返回显式参数。这是一个列表,以及每个代表什么的描述。

  • ~ 表示分析
  • + 表示Branch添加的信息
  • (出于好奇, $ 表示用于控制Branch服务行为的保留关键字)
参数 意义
~channel 在创建链接时指定共享链接的通道
~feature 在链接创建时指定的功能,例如inviteshare
~tags 在链接创建时指定的任何标签
~campaign 与链接关联的广告系列,在链接创建时指定
~stage 在链接创建时指定的阶段
~creation_source 其中链路被创建( ' API ' , '仪表板' , ' SDK ' , '的iOS SDK ' , '的Android SDK ' ,或'的Web SDK ' )
+match_guaranteed 关于匹配是否以100%的准确性进行的判断是对还是错
+referrer 点击链接的引荐来源网址(如果点击了链接)
+phone_number 用户的电话号码(如果用户自己发短信给应用程序)
+is_first_session 表示这是第一个会话(安装)还是任何其他会话(打开)
+clicked_branch_link 表示用户是否点击了触发该会话的Branch链接
+click_timestamp 点击发生的时间时间戳记

isReferrable (BOOL) 可选
此布尔值使您可以控制用户是否有资格被'引荐' 。这适用于信用和影响者跟踪。如果isReferrable设置为NO |如果为false,并且用户在进入应用之前单击链接,则会显示深层链接参数,但该用户将被视为而非 。如果isReferrable设置为YES |。真,并且用户点击的链接,深链接参数将出现,并且用户被认为是称为。删除此参数以访问默认值,该默认值仅允许在全新安装上引用用户,而在打开时不被引用。

automaticDisplayDeepLinkController (BOOL) 可选
此布尔值使您可以控制Branch是否应尝试启动Deep Linked控制器(基于在[branch registerDeepLinkController:forKey:]注册的控制器)。默认值是NO |假。

handleDeepLink

url (NSString *) 必填
此参数将URI字符串传递给我们,以便我们可以解析额外的参数。例如' myapp:// open?link_click_id = 12345 ' 。

continueUserActivity

userActivity (NSUserActivity *) 必需
此参数将用户活动传递给我们,以便我们可以解析原始URL。

退货

初始化会话

没有

handleDeepLink

BOOL handleDeepLink将返回一个布尔值,指示Branch是否已处理URI。如果URI调用是' myapp:// open?link_click_id = 12345 ' ,则handleDeepLink将返回YES,因为存在“分支”单击对象。如果只有' myapp:// ' ,handleDeepLink将返回NO。

continueUserActivity

BOOL continueUserActivity将返回一个布尔值,指示Branch是否已处理通用链接。如果Universal Link由Branch提供支持,则因为存在Branch单击对象,所以continueUserActivity将返回YES。

如果您使用自己的自定义通用链接域,请确保将其Info.plist添加到branch_universal_link_domains 下,如此处所述否则,实际上打开通用链接时,此方法可能会错误地返回NO

注册深度链接控制器

注册一个分支控制器,以显示分支打开/安装字典中是否存在特定键。这是处理自动深层链接的机制,应在initSession之前调用。

方法

Branch.getInstance().registerDeepLinkController(myController forKey:"my-key" withPresentation: .optionShow)
[[Branch getInstance] registerDeepLinkController:myController forKey:@"my-key" withPresentation:BNCViewControllerOptionShow];

参量

控制器 (UIViewController <BranchDeepLinkingController> *) 必需
字典中存在键时显示的控制器。

(NSString *) 必需
在打开/安装词典中检查了键。

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

退货

没有

检索会话(安装或打开)参数

这些会话参数将在此命令的以后随时可用。如果没有可用参数,则Branch将返回一个空字典。每次新会话都会刷新一次(应用安装并打开应用)。

警告:如果Branch SDK正在通过网络调用检索最新的会话参数,则此方法将返回先前的会话' s参数。最佳实践是在Branch初始化时设置回调深层链接处理程序。当处理分支深层链接并且最新的会话参数可用时,将调用该处理程序。

否则,请使用getLatestReferringParamsSynchronous 方法。此方法始终返回最新的会话参数。缺点是可能阻塞调用线程,直到当前结果可用为止。

方法

Objective-C
// This is an example of `getLatestReferringParams`.
// Warning: It may return the previous results.
NSDictionary *sessionParams = [[Branch getInstance] getLatestReferringParams];

// This is an example of `getLatestReferringParamsSynchronous`.
// Warning: It may block the current thread until the latest results are available.
NSDictionary *sessionParams = [[Branch getInstance] getLatestReferringParamsSynchronous];
Swift
// This is an example of `getLatestReferringParams`.
// Warning: It may return the previous results.
let sessionParams = Branch.getInstance().getLatestReferringParams()

// This is an example of `getLatestReferringParamsSynchronous`.
// Warning: It may block the current thread until the latest results are available.
let sessionParams = Branch.getInstance().getLatestReferringParamsSynchronous()

参量

退货

NSDictionary*

当initSession返回在深层链接回调中设置的参数时,在整个会话期间,我们会将其存储在NSUserDefaults中,以备日后检索时使用。小心,将应用最小化并结束会话后,将清除此问题。

检索安装(仅安装)参数

如果要访问原始会话参数(仅为第一个安装事件传递的参数),则可以使用此行。如果您只想奖励来自引荐链接的新安装应用程序的用户,这将很有用。请注意,当调用setIdentity: 并进行身份合并时,可以更新这些参数。

方法

Objective-C
NSDictionary *installParams = [[Branch getInstance] getFirstReferringParams]; // previously getInstallReferringParams
Swift
let installParams = Branch.getInstance().getFirstReferringParams() // previously getInstallReferringParams

参量

持久身份

通常,您可能拥有自己的用户ID,或者希望引用和事件数据在各个平台之间保持不变或进行卸载/重新安装。它' ,如果你知道你的用户从不同的设备访问服务很有帮助。在这里我们介绍'身份'的概念。

方法

要识别用户,只需调用:

Objective-C
// previously identifyUser:
[[Branch getInstance] setIdentity:your user id];    // your user id should not exceed 127 characters
Swift
// previously identifyUser:
Branch.getInstance().setIdentity(your user id)  // your user id should not exceed 127 characters

参量

标识 (NSString *) 必需
这是您' d希望在Branch系统中标记您的用户的别名。请注意,我们仅支持每个用户一个别名。

登出

如果您在应用程序中提供注销功能,请确保在注销完成后清除用户。这将确保清除所有存储的参数,并将所有事件正确地归属于正确的标识。

警告 :此呼叫将清除设备上的促销积分和归属。

方法

Objective-C
[[Branch getInstance] logout];  // previously clearUser
Swift
Branch.getInstance().logout()   // previously clearUser

参量

跟踪用户动作和事件

使用BranchEvent 界面可以跟踪特殊的用户操作或特定于应用程序的事件,而不仅仅是应用程序的安装,打开和共享。您可以跟踪事件,例如用户何时将商品添加到在线购物车或搜索关键字等。

BranchEvent 接口提供一个接口,用于添加BranchUniversalObject表示的内容,以便将应用程序内容与事件相关联。

可以在Branch仪表板上找到有关您的应用程序BranchEvents的分析,并且BranchEvents还提供与许多第三方分析提供程序的紧密集成。

BranchEvent 类可以很容易使用。例如:

Objective-C
[[BranchEvent standardEvent:BranchStandardEventAddToCart] logEvent];
Swift
BranchEvent.standardEvent(.addToCart).logEvent()

为了获得最佳结果,请使用BranchEvent.h定义的Branch标准事件名称。但是您也可以使用自己的自定义事件名称:

Objective-C
[[BranchEvent customEventWithName:@"User_Scanned_Item"] logEvent];
Swift
BranchEvent.customEventWithName("User_Scanned_Item").logEvent()

额外的事件特定数据也可以通过事件进行跟踪:

Objective-C
BranchEvent *event    = [BranchEvent standardEvent:BranchStandardEventPurchase];
event.transactionID   = @"tx-12344555";
event.currency        = BNCCurrencyUSD;
event.revenue         = [NSDecimalNumber decimalNumberWithString:@"12.70"];
event.shipping        = [NSDecimalNumber decimalNumberWithString:@"10.20"];
event.tax             = [NSDecimalNumber decimalNumberWithString:@"2.50"];
event.coupon          = @"coupon_code";
event.affiliation     = @"store_affiliation";
event.eventDescription= @"Shopper made a purchase.";
event.searchQuery     = @"Fashion Scarf";
event.contentItems    = @[ branchUniversalObject ];
event.customData      = (NSMutableDictionary*) @{
    @"Item_Color": @"Red",
    @"Item_Size":  @"Large"
};
[event logEvent];
Swift
let event = BranchEvent.standardEvent(.purchase)
event.transactionID    = "tx-12344555"
event.currency         = .USD
event.revenue          = 12.70
event.shipping         = 10.20
event.tax              = 2.50
event.coupon           = "coupon_code"
event.affiliation      = "store_affiliation"
event.eventDescription = "Shopper made a purchase."
event.searchQuery      = "Fashion Scarf"
event.contentItems     = [ branchUniversalObject ]
event.customData       = [
    "Item_Color": "Red",
    "Item_Size":  "Large"
]
event.logEvent()

注册自定义事件(不建议使用)

对于使用引荐的客户

如果您使用的是Branch '的推荐功能,请使用userCompletedAction 方法使用下面提供的旧版文档。不要升级到新的BranchEvent 方法跟踪上述用户操作。

方法

Objective-C(已弃用)
[[Branch getInstance] userCompletedAction:@"your_custom_event"]; // your custom event name should not exceed 63 characters
迅捷(已淘汰)
Branch.getInstance().userCompletedAction("your_custom_event") // your custom event name should not exceed 63 characters

或者,如果您想与事件一起存储某些状态:

Objective-C(已弃用)
[[Branch getInstance] userCompletedAction:@"your_custom_event" withState:(NSDictionary *)appState]; // same 63 characters max limit
迅捷(已淘汰)
Branch.getInstance().userCompletedAction("your_custom_action", withState: [String: String]()) // same 63 characters max limit; replace [String: String]() with params dictionary

您可能要跟踪的一些示例事件:

@"complete_purchase"
@"wrote_message"
@"finished_level_ten"

参量

事件 (NSString *) 必需
这是您'想要发送给Branch的事件字符串。您可以在分析中查看导致事件发生的链接的归属。

状态 (NSDictionary *) 可选
如果' d等,以与事件一起传递附加的元数据,则应该使用此字典。例如,这就是使用BNCPurchaseAmount常量作为键将收入传递到Branch的方法。

Apple Search Ads

Branch可以通过在安装应用时从
Apple中获取搜索广告的归因来帮助跟踪您的Apple搜索广告活动。然后,您可以使用您的参数'已经在苹果的搜索广告仪表板设置,
参数,如活动名称,并采取特别行动,你的应用后的安装,或者干脆
轨道运动中科仪表盘的有效性,以及其他您的Branch
其他统计信息,例如总安装,引荐和应用链接统计信息。

方法

- (void) delayInitToCheckForSearchAds

调用此方法以启用在分支初始化之前检查Apple Search Ads。在初始化分支会话之前,必须调用此方法

请注意,由于Apple '的延迟,从调用到initSession到回调,这最多可能需要10秒钟。

Objective-C
[[Branch getInstance] delayInitToCheckForSearchAds];
Swift
Branch.getInstance().delayInitToCheckForSearchAds

启用或禁用用户跟踪

为了符合跟踪要求,您可以在SDK级别禁用跟踪。只需致电:

[Branch setTrackingDisabled:YES];
Branch.setTrackingDisabled(true)

这将防止发送任何Branch网络请求(深度链接除外)。如果有人点击“Branch”链接,但又不想被跟踪,我们会将深度链接接数据返回给应用程序,但不会捕获任何跟踪信息。

在“不追踪”模式下,您仍然可以创建&共享链接。链接将没有可识别的信息,将是长格式链接。如果用户表示不被跟踪,则事件跟踪不会将数据传递回服务器。您可以随时通过调用上述函数来更改此行为。 trackingDisabled状态已保存并在应用程序运行期间持续存在。

分支通用对象(用于深层链接,内容分析和索引编制)

随着越来越多的方法在iOS的进化,我们'已经找到了,这是越来越难以管理他们所有。我们尽可能多地抽象了一个分支通用对象的概念。这是与您要共享的事物(内容或用户)关联的对象。您可以设置与该对象关联的所有元数据,然后在其上调用操作方法以在Spotlight中获取链接或索引。

Branch通用对象最佳做法

这是一组最佳实践,可确保您的分析正确无误,并且您的内容在Spotlight上有效地排名。

  1. 跨应用实例将canonicalIdentifier 设置为唯一的重复数据消除值
  2. 确保titlecontentDescriptionimageUrl 适当地表示对象
  3. 初始化Branch通用对象,并使用页面加载上的BNCRegisterViewEvent 调用userCompletedAction
  4. 当用户执行需要链接的操作时,请在生命周期的稍后阶段调用showShareSheetcreateShortLink
  5. 当采取相应的用户操作时,调用其他对象事件(购买,共享完成等)
  6. contentIndexMode 设置为ContentIndexModePublicContentIndexModePrivate 。如果BranchUniversalObject设置为ContentIndexModePublic ,则将在Spotlight上使用NSUserActivity内容编制索引,否则将使用CSSearchableIndex 内容编制索引。

注意:使用CSSearchableItem 索引的内容可以从Spotlight中删除,但是如果使用NSUserActivity索引则不能删除。

练习避免

  1. 唐' t将相同titlecontentDescriptionimageUrl 在所有的对象。
  2. 不要等待'初始化对象并注册视图,直到用户开始共享。
  3. 在您方便地需要链接之前,不要等待'初始化对象。
  4. Don ' t一次创建许多对象,并在for 循环中注册视图。

Branch通用对象

方法和性质

Objective-C
#import "BranchUniversalObject.h"
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.contentMetadata.contentSchema = BranchContentSchemaCommerceProduct;
branchUniversalObject.contentMetadata.customMetadata[@"property1"] = @"blue";
branchUniversalObject.contentMetadata.customMetadata[@"property2"] = @"red";
Swift
let branchUniversalObject: BranchUniversalObject = BranchUniversalObject(canonicalIdentifier: "item/12345")
branchUniversalObject.title = "My Content Title"
branchUniversalObject.contentDescription = "My Content Description"
branchUniversalObject.imageUrl = "https://example.com/mycontent-12345.png"
branchUniversalObject.contentMetadata.contentSchema = .product;
branchUniversalObject.contentMetadata.customMetadata["property1"] = "blue"
branchUniversalObject.contentMetadata.customMetadata["property2"] = "red"

性质

canonicalIdentifier :这是内容的唯一标识符,可帮助Branch在同一事物的许多实例之间进行重复数据删除。如果您的网站带有路径,请随时使用。或者,如果您具有实体的数据库标识符,请使用这些标识符。

title :这是内容的名称,将自动用于OG标签。它将$og_title 插入到创建的任何链接的数据字典中。

contentDescription :这是内容的描述,将自动用于OG标签。它将$og_description 插入到创建的任何链接的数据字典中。

imageUrl :这是内容的图像URL,将自动用于OG标签。它将$og_image_url 插入到创建的任何链接的数据字典中。

关键字 :描述对象的关键字。这些用于Spotlight搜索和Web抓取,以便用户可以找到您的内容。

localIndex :如果设置为true,则Branch将在用户'的手机上的Spotlight上为该内容编制索引。

publiclyIndex :如果设置为true,Branch将在Google,Branch等上将该内容编入索引。

expirationDate :内容将不再可用或有效的日期。目前,此功能仅用于Spotlight索引编制,但将来会被Branch使用。

contentMetadata :进一步描述您的内容的详细信息。根据与您的内容相关的内容类型设置此子对象的属性:

BranchUniversalObject.contentMetadata

BranchUniversalObject.contentMetadata 属性进一步描述了您的内容。这些属性在“Branch”仪表板中是可跟踪的,并将自动导出到您连接的第三方应用程序智能合作伙伴,如Adjust或Mixpanel。

根据与您的内容相关的内容类型设置此子对象的属性。 BranchUniversalObject.contentMetadata.contentSchema 属性描述对象内容的类型。设置其他与类型相关的属性。

contentMetadata.contentSchema :将此属性设置为BranchContentSchema 最能描述内容类型的枚举。它接受BranchContentSchemaCommerceProductBranchContentSchemaMediaImage类的值。

contentMetadata.customMetadata :该词典包含您'想要与Branch Universal Object关联的任何其他参数。用户单击链接并打开应用程序后,即可使用这些功能。

contentMetadata.price :与以下与商业相关的事件结合使用的商品价格。

contentMetadata.currency :以 ISO 4217货币代码表示价格的货币。默认值为美元。

contentMetadata.quantity :数量。

contentMetadata.sku :供应商SKU。

contentMetadata.productName :产品名称。

contentMetadata.productBrand :产品品牌。

contentMetadata.productCategory BNCProductCategory 值,例如BNCProductCategoryAnimalSuppliesBNCProductCategoryFurniture

contentMetadata.productVariant :产品变体。

contentMetadata.condition BranchCondition 值,例如BranchConditionNewBranchConditionRefurbished

ratingAverage,ratingCount,ratingMax :您的内容的评分。

addressStreet,addressCity,addressRegion,addressCountry,addressPostalCode :您内容的地址。

经度,纬度 :内容的经度和纬度。

imageCaptions :内容' s图像的图像标题。

跟踪与对象的用户交互

我们已经添加了一系列的自定义事件,您会要开始跟踪的丰富的分析和定位。下面的列表列出了一个示例片段,该片段调用了注册视图事件。

Key
BranchStandardEventViewItem 用户查看了对象
BranchStandardEventAddToWishlist 用户将该对象添加到他们的愿望清单
BranchStandardEventAddToCart 用户将对象添加到购物车
BranchStandardEventInitiatePurchase 用户开始签出
BranchStandardEventPurchase 用户购买了该物品
BranchStandardEventShare 用户完成了分享

方法

Objective-C
[branchUniversalObject userCompletedAction:BranchStandardEventViewItem];
Swift
branchUniversalObject.userCompletedAction(BranchStandardEventViewItem)

参量

退货

缩短链接

一旦创建了Branch Universal Object ,即对感兴趣的内容的引用,则可以使用下面描述的机制返回到该链接。

编码说明

关于编码的简要说明。由于NSJSONSerialization 支持有限的类集,因此我们进行一些自定义编码以允许其他类型。当前支持的类型包括NSDictionaryNSArrayNSURLNSStringNSNumberNSNull ,和NSDate (编码为ISO8601字符串时区)。如果参数的类型未知,它将被忽略。

方法

Objective-C
#import "BranchLinkProperties.h"
BranchLinkProperties *linkProperties = [[BranchLinkProperties alloc] init];
linkProperties.feature = @"sharing";
linkProperties.channel = @"facebook";
[linkProperties addControlParam:@"$desktop_url" withValue:@"http://example.com/home"];
[linkProperties addControlParam:@"$ios_url" withValue:@"http://example.com/ios"];
[branchUniversalObject getShortUrlWithLinkProperties:linkProperties andCallback:^(NSString *url, NSError *error) {
    if (!error) {
        NSLog(@"success getting url! %@", url);
    }
}];
Swift
let linkProperties: BranchLinkProperties = BranchLinkProperties()
linkProperties.feature = "sharing"
linkProperties.channel = "facebook"
linkProperties.addControlParam("$desktop_url", withValue: "http://example.com/home")
linkProperties.addControlParam("$ios_url", withValue: "http://example.com/ios")
branchUniversalObject.getShortUrl(with: linkProperties) { (url, error) in
    if error == nil {
        NSLog("got my Branch link to share: %@", url)
    }
}

链接属性参数

通道 :链接的通道。示例可能是Facebook,Twitter,SMS等,具体取决于共享位置。

功能 :将与生成的链接相关联的功能。例如。 sharing

controlParams :建立“分支”链接时要使用的字典。您可以在此处指定自定义行为控件,如下表所述。

您可以通过在字典插入以下可选键来进行自定义重定向:

Key
"$fallback_url" 未安装应用程序时将所有平台的用户发送到何处。请注意,Branch会将所有机械手转发到此URL,从而覆盖在链接中输入的所有OG标签。
"$desktop_url" 在台式机或笔记本电脑上将用户发送到何处。默认情况下,它是Branch托管的text-me服务。
"$android_url" 对于Play商店中的替换URL发送用户,如果他们没有应用。 仅当您想要移动网络启动时才需要。
"$ios_url" 为App Store替换URL发送用户,如果他们没有应用。 仅当您想要移动网络启动时才需要。
"$ipad_url" 与上述相同,但适用于iPad Store。
"$fire_url" 与上述相同,但适用于Amazon Fire Store。
"$blackberry_url" 与上述相同,但适用于Blackberry Store。
"$windows_phone_url" 与上述相同,但适用于Windows Store。
"$after_click_url" 当用户转到应用程序后返回浏览器时,将其带到该URL。仅限 iOS; Android即将面世

通过在字典插入以下可选键,您可以控制每个链接的直接深度链接接:

Key
"$deeplink_path" 您希望我们追加到您的URI的深度链接接路径的值。例如,您可以指定" $ deeplink_path " : " radio / station / 456 "然后我们将使用URI " yourapp:// radio / station / 456?link_click_id = branch-identifier "打开应用程序。这主要是为了支持旧版深度链接接基础结构。
"$always_deeplink" 对或错。 (默认为不深链接第一)此键可以指定有我们的链接服务力量试图打开该应用程序,即使我们不能确定用户已安装的应用程序。如果未安装该应用程序,我们将退回到相应的应用程序商店或$ platform_url密钥。默认情况下,我们只有当我们打开应用程序见过用户在您的应用程序从一个Branch链路发起会话(已的Cookie和Branch深链接)。

别名 :链接的别名。例如。 myapp.com/customalias

matchDuration :来自此链接的点击的归因窗口(以秒为单位)。

阶段 :用于生成链接的阶段,指示用户位于渠道的哪个部分。

标签 :要与链接关联的标签字符串数组。

获取简短网址参数

linkProperties :上面创建的链接属性,描述了您喜欢的链接的类型'

callback :成功时使用url调用的回调,如果出现问题则返回错误。请注意,我们'在100%的时间内返回链接。如果网络可用,则是一个短的网络;如果网络不可用,则一个长的网络。

UIActivityView共享表

UIActivityView是允许用户共享您的应用程序中的内容的标准方法。一旦你'已经创建你的Branch Universal Object ,这是参考给您的内容'重新感兴趣的,则可以自动地分享 ,而不必建立一个链路使用以下机制。

示例UIActivityView共享表

UIActivityView共享表

Branch iOS SDK在UIActivityViewController上包含包装器,该包装器将生成Branch短URL,并使用用户选择的渠道(Facebook,Twitter等)自动对其进行标记。请注意,某些通道限制对某些字段的访问。例如,Facebook禁止您预填充消息。

方法

Objective-C
#import "BranchLinkProperties.h"
BranchLinkProperties *linkProperties = [[BranchLinkProperties alloc] init];
linkProperties.feature = @"sharing";
[linkProperties addControlParam:@"$desktop_url" withValue:@"http://example.com/home"];
[linkProperties addControlParam:@"$ios_url" withValue:@"http://example.com/ios"];
[branchUniversalObject showShareSheetWithLinkProperties:linkProperties
                                           andShareText:@"Super amazing thing I want to share!"
                                     fromViewController:self
                                             completion:^(NSString *activityType, BOOL completed){
    NSLog(@"finished presenting");
}];
Swift
let linkProperties: BranchLinkProperties = BranchLinkProperties()
linkProperties.feature = "sharing"
linkProperties.addControlParam("$desktop_url", withValue: "http://example.com/home")
linkProperties.addControlParam("$ios_url", withValue: "http://example.com/ios")
branchUniversalObject.showShareSheet(with: linkProperties,
                                     andShareText: "Super amazing thing I want to share!",
                                     from: self) { (activityType, completed) in
    NSLog("done showing share sheet!")
}

显示共享表参数

linkProperties :将与生成的链接关联的功能。

andShareText :建立“分支”链接时要使用的字典。

fromViewController

完成

进一步定制

大多数共享选项仅包含一串文本,但电子邮件除外,该电子邮件具有主题和正文。共享文本将填充在正文中,您可以在链接属性中指定电子邮件主题,如下所示。

[linkProperties addControlParam:@"$email_subject" withValue:@"This one weird trick."];
linkProperties.addControlParam("$email_subject", withValue: "Therapists hate him.")

您还可以选择将HTML添加到电子邮件选项并自定义链接文本。如果链接文本被忽略,则使用URL本身

[linkProperties addControlParam:@"$email_html_header" withValue:@"<style>your awesome CSS</style>\nOr Dear Friend,"];
[linkProperties addControlParam:@"$email_html_footer" withValue:@"Thanks!"];
[linkProperties addControlParam:@"$email_html_link_text" withValue:@"Tap here"];
linkProperties.addControlParam("$email_html_header", withValue: "<style>your awesome CSS</style>\nOr Dear Friend,")
linkProperties.addControlParam("$email_html_footer", withValue: "Thanks!")
linkProperties.addControlParam("$email_html_link_text", withValue: "Tap here")

快速更改共享文本

您可以根据用户在共享表活动中所做的选择来更改链接shareText和其他链接参数。首先,使用遵循BranchShareLinkDelegate 协议的对象设置BranchShareLink 委托。

在用户选择共享操作之后(例如,通过电子邮件共享),然后在向用户显示共享操作之前(例如,向电子邮件用户显示共享文本时),将调用可选的- (void) branchShareLinkWillShare: 委托方法。这是根据用户操作更改共享文本的理想时间。

用户完成共享操作后,将调用可选的- (void) branchShareLink:didComplete:withError: 委托方法。如果用户共享该项目,则didComplete 布尔值将为YES ,如果用户取消则为NOerror 值将指示可能发生的任何错误。

Objective-C
@interface ViewController () <BranchShareLinkDelegate>

覆盖branchShareLinkWillShare函数以更改您的shareText

- (void) branchShareLinkWillShare:(BranchShareLink*)shareLink {
    // Link properties, such as alias or channel can be overridden here based on the users'
    // choice stored in shareSheet.activityType.
    shareLink.shareText = [NSString stringWithFormat:
        @"Shared through '%@'\nfrom Branch's Branch-TestBed\nat %@.",
        shareLink.linkProperties.channel,
        [self.dateFormatter stringFromDate:[NSDate date]]];
}
Swift
class ViewController: UITableViewController, BranchShareLinkDelegate

覆盖branchShareLinkWillShare函数以更改您的shareText

func branchShareLinkWillShare(_ shareLink: BranchShareLink) {
    // Link properties, such as alias or channel can be overridden here based on the users'
    // choice stored in shareSheet.activityType.
    shareLink.shareText =
        "Shared through '\(shareLink.linkProperties.channel!)'\nfrom Branch's TestBed-Swift" +
        "\nat \(self.dateFormatter().string(from: Date()))."
}

退货

在Spotlight上列出内容

如果' d喜欢列出您的科通用对象在聚光灯本地和云索引,这是方法,你'会打电话。您'会想每次注册欣赏到页面加载,因为这有助于你在全球的搜索排名。

方法

Objective-C
branchUniversalObject.automaticallyListOnSpotlight = YES;
[branchUniversalObject userCompletedAction:BranchStandardEventViewItem];
Swift
branchUniversalObject.automaticallyListOnSpotlight = true
branchUniversalObject.userCompletedAction(BranchStandardEventViewItem)

参量

回调 :将返回用来列出聚焦的内容,如果你的URL ' d喜欢将其保存为自己的记录。

退货

使用链接属性在Spotlight上列出内容

如果' d喜欢在聚光灯本地和云索引与链接属性列出你的店通用的对象,这是方法,你'会打电话。您'会想每次注册欣赏到页面加载,因为这有助于你在全球的搜索排名。

方法

Objective-C
[universalObject listOnSpotlightWithLinkProperties:linkProperties callback:^(NSString * _Nullable url, NSError * _Nullable error) {
    if (!error) {
         NSLog(@"Successfully indexed on spotlight");
    }
}];
Swift
universalObject.listOnSpotlight(with: linkProperty) { (url, error) in
    if (error == nil) {
        print("Successfully indexed on spotlight")
    }
}

参量

回调 :将返回用来列出聚焦的内容,如果你的URL ' d喜欢将其保存为自己的记录。

退货

使用CSSearchableIndex在Spotlight上列出多个分支通用对象

在Branch共享实例上调用此方法以在Spotlight中列出多个Branch通用对象:

方法

Objective-C
[[Branch getInstance] indexOnSpotlightUsingSearchableItems:universalObjects
                                                    completion:^(NSArray<BranchUniversalObject *> *universalObjects,
                                                                 NSError *error) {
        if (!error) {
            // Successfully able to index all the BUO on spotloght
        }
    }];
Swift
Branch.getInstance().indexOnSpotlight(usingSearchableItems: universalObjects,
                                                completion: { (universalObjects, error) in
      if (error) {
           // Successfully able to index all the BUO on spotloght
      }
})

参量

UniversalObjects :将使用CSSearchableIdex索引的所有Branch Universal Object的数组

完成 :索引完成后,将返回带有动态URL的Branch Universal对象作为Spotlight标识符。

退货

如果已私有索引,则从Spotlight中删除分支通用对象

可以从聚光灯下删除私有索引的分支通用对象

方法

Objective-C
[universalObject removeFromSpotlightWithCallback:^(NSError * _Nullable error) {
        if (!error) {
            NSLog(@"universal Object removed from spotlight");
        }
    }];
Swift
universalObject.removeFromSpotlight { (error) in
            if(error == nil) {
                print("BUO successfully removed")
            }
        }

参量

回调 :将分支通用对象从聚光灯中移除后将返回。如果移除了Spotlight,则“分支通用对象”的spotlightIdentifier变量将为nil。

退货

如果已私有索引,则从Spotlight中删除多个分支通用对象

可以从聚光灯下删除私有索引的多个分支通用对象

方法

Objective-C
[[Branch getInstance] removeSearchableItemsWithBranchUniversalObjects:@[BUO1,BUO2] callback:^(NSError *error) {
    if (!error) {
        NSLog(@"An array of BUOs removed from spotlight");
    }
}]
Swift
Branch.getInstance().removeSearchableItems(with: [BUO1,BUO2]) { (error) in
    if (error == nil) {
        print("An array of BUOs removed from spotlight")
    }
}

参量

回调 :将所有分支通用对象从聚光灯中删除后将返回。如果移除了Spotlight,则所有“分支通用对象”的spotlightIdentifier变量将为nil。

退货

如果已私有索引,则从Spotlight中删除所有分支通用对象

可以从聚光灯下删除所有私有索引的分支通用对象

方法

Objective-C
[[Branch getInstance] removeAllPrivateContentFromSpotLightWithCallback:^(NSError *error) {
    if (!error) {
      NSLog(@"All branch privately indexed content removed from spotlight");
    }
}];
Swift
Branch.getInstance().removeAllPrivateContentFromSpotLight { (error) in
    if (error == nil) {
        print("All branch privately indexed content removed from spotlight")
    }
}

参量

回调 :将所有分支通用对象从聚光灯中删除后将返回。
注意:SpotlightIdentifer不会是从Spotlight中删除的所有Branch Universal对象的零,因为Branch SDK不会'缓存Branch Universal对象。

退货

推荐系统奖励功能

获得奖励余额

当采取某些操作(由您的规则定义)时,奖励余额在后端随机变化,因此您将需要进行'异步调用来检索余额。语法如下:

方法

Objective-C
[[Branch getInstance] loadRewardsWithCallback:^(BOOL changed, NSError *error) {
    // changed boolean will indicate if the balance changed from what is currently in memory

    // will return the balance of the current user's credits
    NSInteger credits = [[Branch getInstance] getCredits];
}];
Swift
Branch.getInstance().loadRewards { (changed, error) in
    // changed boolean will indicate if the balance changed from what is currently in memory

    // will return the balance of the current user's credits
    let credits = Branch.getInstance().getCredits()
}

参量

callback :请求完成后调用的回调。

兑换全部或部分奖励余额(商店状态)

兑换积分可让用户兑现自己已获得的'积分。成功兑现后,用户'的余额将更新,以反映扣除额。

方法

Objective-C
// Save that the user has redeemed 5 credits
[[Branch getInstance] redeemRewards:5];
Swift
// Save that the user has redeemed 5 credits
Branch.getInstance().redeemRewards(5)

参量

数量 :兑换的积分数。

获取信用记录

该呼叫将检索单个用户的全部贷记和赎回历史。要使用此调用,请像下面这样实现:

方法

Objective-C
[[Branch getInstance] getCreditHistoryWithCallback:^(NSArray *history, NSError *error) {
    if (!error) {
        // process history
    }
}];
Swift
Branch.getInstance().getCreditHistory { (creditHistory, error) in
    if error == nil {
        // process history
    }
}

响应将返回一个已从以下JSON解析的数组:

[
    {
        "transaction": {
                           "date": "2014-10-14T01:54:40.425Z",
                           "id": "50388077461373184",
                           "bucket": "default",
                           "type": 0,
                           "amount": 5
                       },
        "event" : {
            "name": "event name",
            "metadata": { your event metadata if present }
        },
        "referrer": "12345678",
        "referree": null
    },
    {
        "transaction": {
                           "date": "2014-10-14T01:55:09.474Z",
                           "id": "50388199301710081",
                           "bucket": "default",
                           "type": 2,
                           "amount": -3
                       },
        "event" : {
            "name": "event name",
            "metadata": { your event metadata if present }
        },
        "referrer": null,
        "referree": "12345678"
    }
]

参量

推荐人
此信贷交易的推荐人的ID。如果不涉及引荐来源,则返回null。请注意,此ID是开发人员'自己的系统中的用户ID,之前传递给Branch '的'用户ID标识了用户API调用。

Referree
此信用交易的引荐用户的ID。如果不涉及裁判,则返回null。请注意,此ID是开发人员'自己的系统中的用户ID,之前传递给Branch '的'用户ID标识了用户API调用。

type
这是信贷交易的类型。

  1. 0 用户完成动作或促销会自动添加的奖励。
  2. 1 手动添加的奖励。
  3. 2 通过我们的API或SDK兑换的积分。
  4. 3 这是一个非常特殊的情况,当我们检测到欺诈时,我们将自动扣除信用额。

大约一个月前更新

iOS完整参考


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

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