Xamarin iOS

iOS 11.2上通用链接行为不一致

将设备更新到iOS 11.2后,我们发现安装应用后,应用的AASA文件不再可靠地下载到用户的设备上。因此,点击通用链接将不再一致地打开该应用程序。您可以在Branch链接上设置强制uri重定向模式 ,以使用URI方案打开应用。在 Apple Bug报告中查看问题的详细信息

配置 Branch

安装 Branch

NuGet

Branch Xamarin SDK可作为NuGet软件包提供。必须将BranchNuGet程序包添加到每个将使用Branch方法的Xamarin项目中。

要将Branch NuGet包添加到项目中:

  1. 右键点击每个项目,然后选择 Add > Add NuGet Packages
  2. 如果尚不存在,请找到Microsoft BCL Build Components 软件包版本1.0.21并将其添加到项目中
  3. 找到Branch Xamarin SDK 软件包版本3.0并将其添加到项目中

手动地

如果不想使用NuGet而是直接构建和引用Branch程序集:

  1. 将此存储库克隆到本地计算机: https://github.com/BranchMetrics/xamarin-branch-deep-linking.git
  2. Branch-Xamarin-SDK 项目添加到解决方案中,并从Android,iOS和Forms(如果适用)项目中引用它
  3. Branch-Xamarin-SDK.Droid 项目添加到解决方案中,并从Android项目中引用(如果有)
  4. 添加Branch-Xamarin-SDK.iOS 项目并从iOS项目中引用(如果有)

配置应用

为该应用创建Apple设备配置配置文件

  1. 打开Xcode并创建一个与您的Xamarin iOS项目同名的新项目
  2. 在Xcode项目 General 选项卡上,验证应用区分大小写的捆绑包标识符正确,然后选择适当的团队(请确保在此处解决所有错误)
  3. 选择Capabilities 标签并启用Associated Domains 授权
  4. 创建'链接: '个分支链接域和备用链接域的条目(链接域可在“分支”仪表板的底部找到' s 链接设置页面)。例如,具有默认链接域' testiosapp.app.link '的应用程序的条目为:
     `applinks:testiosapp.app.link`
     `applinks:testiosapp-alternate.app.link`
    
  5. 使用Xcode在iOS设备上运行此新创建的应用程序。这将在该设备上创建并安装具有适当权利的预配配置文件。
  6. 关闭Xcode

在“Branch”仪表板上输入应用程序的设置

  1. 在“ 链接设置页面上,选中I have an iOS App 复选框
  2. iOS URI Scheme 字段中输入应用程序的URI方案(例如,对于具有URI方案 testbed-xamarin 的应用程序,输入为: testbed-xamarin://
  3. Apple Store Search 字段中输入应用的Apple Store名称(如果该应用尚未在App Store中提供,请选择Custom URL 并输入适当网站的URL作为占位符-确切的网站无关紧要)
  4. 选中Enable Universal Links 复选框
  5. 输入应用程序区分大小写的捆绑包标识符和Apple App前缀,如 Apple Developer Portal 所示。

配置Xamarin项目的Info.plist文件

  1. 打开Info.plist 文件
  2. Apple Developer Portal Bundle Identifier 字段中输入应用程序' s Bundle IdentifierIMPORTANT: Xamarin将自动使用全小写值填充此字段。该值实际上区分大小写,并且必须与 Apple Developer Portal 中的值完全匹配。
  3. 点击Advanced 标签
  4. URL Types 部分中,单击Add URL Type 按钮
    Identifier: 分支方案
    URL Schemes: {例如,应用'的URI方案' testiosapp ' ,} Role: 编辑器

图像

配置Xamarin项目的关联域权利

  1. 打开 Entitlements.plist 文件,然后浏览到关联域
  2. 为app的链接域及其备用链接域创建条目。 TestBed-Xamarin应用程序的条目为:
     `applinks:testiosapp.app.link`
     `applinks:testiosapp-alternate.app.link`
    

图像

更新项目签名身份和配置文件

  1. 右键点击iOS项目,然后选择 Options
  2. 选择 iOS Bundle Signing
  3. Signing IdentityProvisioning Profile values 设置为将Provisioning Profile部署到上述设备时使用的值

初始化 Branch

Branch初始化发生在AppDelegate.cs 文件的FinishedLaunching 方法内。Branch的呼叫,也需要在OpenUrlContinueUserActivityReceiveRemoteNotification 的方法,以确保Branch链接信息处理不当每当应用程序被激活。

只要该应用程序处于活动状态,Branch SDK就会与Branch后端联系,以检索任何可用的链接参数。如果由于点击“Branch”链接而使应用程序处于活动状态,则链接数据将以InitSessionComplete method返回。这是任何深度链接接路由逻辑都应驻留的位置。从后端检索Branch链接数据中的任何错误都将以SessionRequestError 方法返回。

// AppDelegate.cs

using Foundation;
using UIKit;
using BranchXamarinSDK;
using BranchXamarinSDK.iOS;
using System;

namespace TestiOSApp.iOS
{
    [Register("AppDelegate")]
    public class AppDelegate : UIApplicationDelegate, IBranchBUOSessionInterface
    {
        public override UIWindow Window
        {
            get;
            set;
        }

        public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)
        {
            // Debug mode - set to 'false' before releasing to production
            BranchIOS.Debug = true;
            BranchIOS.Init("key_live_cgEguO4UiDJSL4HIyTu85dkkDAdz38ER", launchOptions, this);

            return true;
        }

        // Called when the app is opened via URI scheme
        public override bool OpenUrl(UIApplication application, NSUrl url, string sourceApplication, NSObject annotation)
        {
            return BranchIOS.getInstance().OpenUrl(url);
        }

        // Called when the app is opened from a Universal Link
        public override bool ContinueUserActivity(UIApplication application, NSUserActivity userActivity,
                      UIApplicationRestorationHandler completionHandler)
        {
            return BranchIOS.getInstance().ContinueUserActivity(userActivity);
        }

        // Called when the app receives a push notification
        public override void ReceivedRemoteNotification(UIApplication application, NSDictionary userInfo)
        {
            BranchIOS.getInstance().HandlePushNotification(userInfo);
        }

        // Called when the Branch initialization is completed
        // Put deep-linking logic in this method
        public void InitSessionComplete(BranchUniversalObject buo, BranchLinkProperties blp)
        {
            NSObject[] keys = {
                NSObject.FromObject("+is_first_session")
            };

            NSObject[] values = { NSObject.FromObject(0) };
            if (buo.metadata.ContainsKey("+is_first_session"))
            {
                values[0] = NSObject.FromObject(buo.metadata["+is_first_session"]);
            }

            NSDictionary nsData = NSDictionary.FromObjectsAndKeys(values, keys);
        }

        // Called when there is an error initializing Branch
        public void SessionRequestError(BranchError error)
        {
            Console.WriteLine("Branch error: " + error.ErrorCode);
            Console.WriteLine(error.ErrorMessage);
        }

    }
}

使用Xamarin表单配置Branch

将C#项目的配置文件更改为PCL 4.5-Profile78

  1. 右键点击项目名称,然后选择: Options
  2. 浏览菜单至 Build > General
  3. Current Profile 更改为: PCL 4.5 - Profile78

使用NuGet添加Branch SDK

Branch Xamarin SDK可作为NuGet软件包提供。必须将BranchNuGet程序包添加到每个将使用Branch方法的Xamarin项目中。

  1. 右键点击每个项目,然后选择 Add > Add NuGet Packages
  2. 如果尚不存在,请找到Microsoft BCL Build Components 软件包版本1.0.21并将其添加到项目中
  3. 找到Branch Xamarin SDK 软件包版本3.0并将其添加到项目中

创建用于Branch会话处理的类

Branch异步初始化,在对Branch进行网络调用后返回Branch链接参数。如果初始化成功,则将调用InitSessionComplete方法。如果初始化失败,则将调用SessionRequestError方法。深度链接接路由逻辑应位于InitSessionComplete方法中。

  1. 右键点击C#项目,然后选择 Add > New File...
  2. 选择: General > Empty Class
  3. 重命名文件: TestXamarinFormsApp.cs
  4. 输入以下代码(将' TestXamarinFormsApp '替换为应用程序的实际名称):
using BranchXamarinSDK;
using System.Collections.Generic;
using System.ComponentModel;
using Xamarin.Forms;

namespace TestXamarinFormsApp
{
    public class TestXamarinFormsApp : Application, IBranchSessionInterface
    {

        public TestXamarinFormsApp()
        {
        }

        #region IBranchSessionInterface implementation

        public void InitSessionComplete(Dictionary<string, object> data)
        {
        }

        public void CloseSessionComplete()
        {
        }

        public void SessionRequestError(BranchError error)
        {
        }

        #endregion
    }
}

创建一个用于处理链接数据的类

Branch将链接数据存储在称为Branch Universal ObjectBUO

  1. 右键点击C#项目,然后选择 Add > New File...
  2. 选择: General > Empty Class
  3. 重命名文件: TestXamarinFormsAppBUO.cs
  4. 输入以下代码(将' TestXamarinFormsApp '替换为应用程序的实际名称):
using BranchXamarinSDK;
using System.Collections.Generic;
using System.ComponentModel;
using Xamarin.Forms;

namespace TestXamarinFormsApp
{
    public class TestXamarinFormsAppBUO : Application, IBranchBUOSessionInterface
    {

        public TestXamarinFormsAppBUO()
        {
        }

        #region IBranchBUOSessionInterface implementation

        public void InitSessionComplete(BranchUniversalObject buo, BranchLinkProperties blp)
        {
        }

        public void SessionRequestError(BranchError error)
        {
        }

        #endregion
    }
}

为该应用创建Apple设备配置配置文件

  1. 打开Xcode并创建一个与您的Xamarin iOS项目同名的新项目
  2. 在Xcode项目 General 选项卡上,输入应用' s Bundle Identifier并选择适当的团队(请确保在此处解决所有错误)
  3. 选择Capabilities 标签并启用Associated Domains 授权
  4. 创建'链接: '个分配给应用程序的分支链接域的条目(链接域可在“分支”仪表板的底部' s 链接设置页面中找到)。例如,应用程序TestXamarinFormsApp 的条目为:
     `applinks:testxamarinformsapp.app.link`
     `applinks:testxamarinformsapp-alternate.app.link`
    
  5. 使用Xcode在iOS设备上运行此新创建的应用程序。这将在该设备上创建并安装具有适当权利的预配配置文件。
  6. 关闭Xcode

在“Branch”仪表板上输入应用程序的设置

  1. 在“ 链接设置页面上,选中I have an iOS App 复选框
  2. iOS URI Scheme 字段中输入应用程序的URI方案(例如,对于具有URI方案testxamarinformsapp的应用程序,输入为: testxamarinformsapp://
  3. Apple Store Search 字段中输入应用的Apple Store名称(如果该应用尚未在App Store中提供,请选择Custom URL 并输入适当网站的URL作为占位符-确切的网站无关紧要)
  4. 选中Enable Universal Links 复选框
  5. 输入应用程序的捆绑包标识符和Apple App前缀,如 Apple Developer Portal 所示。

配置Xamarin项目的Info.plist文件

  1. 打开Info.plist 文件
  2. Apple Developer Portal Bundle Identifier 字段中输入应用程序' s Bundle IdentifierIMPORTANT: Xamarin将自动使用全小写值填充此字段。该值实际上区分大小写,并且必须与 Apple Developer Portal 中的值完全匹配。
  3. 点击Advanced 标签
  4. URL Types 部分中,单击Add URL Type 按钮
    Identifier: 分支方案
    URL Schemes: {例如,应用'的URI方案' testxamarinformsapp ' ,}
    Role: 编辑器

图像

配置Xamarin项目的关联域权利

  1. 打开Entitlements.plist 文件并浏览到Associated Domains (如果此文件尚不存在,请创建它)
  2. 为app的链接域及其备用链接域创建条目。 TestBed-Xamarin应用程序的条目为:
     `applinks:testxamarinformsapp.app.link`
    `applinks:testxamarinformsapp-alternate.app.link`
    

图像

将Branch调用添加到AppDelegate.cs文件

为确保Branch SDK在应用启动时初始化,并在应用激活时可以检索链接参数,Branch初始化发生在AppDelegate.cs文件的FinishedLaunching 方法内。 OpenUrl,ContinueUserActivity和ReceiveRemoteNotification方法中也需要Branch调用,以确保只要应用程序处于活动状态,就可以正确处理Branch链接信息。 AppDelegate.cs 文件应如下所示:

using System;
using System.Collections.Generic;
using System.Linq;

using Foundation;
using UIKit;
using BranchXamarinSDK;
using TestXamarinFormsApp;

namespace TestXamarinFormsApp.iOS
{
    [Register("AppDelegate")]
    public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
    {
        public override bool FinishedLaunching(UIApplication app, NSDictionary options)
        {
            global::Xamarin.Forms.Forms.Init();

            // Debug mode - set to 'false' before releasing to production
            BranchIOS.Debug = true;

            TestXamarinFormsAppBUO appBUO = new TestXamarinFormsAppBUO();
            BranchIOS.Init("key_live_liAnF8k7gZUEZv76Rt9a4bffAzlC5zVW", options, appBUO);
            LoadApplication(appBUO);

            return base.FinishedLaunching(app, options);
        }

        // Called when the app is opened via URI scheme
        public override bool OpenUrl(UIApplication application, NSUrl url, string sourceApplication, NSObject annotation)
        {
            return BranchIOS.getInstance().OpenUrl(url);
        }

        // Called when the app is opened from a Universal Link
        public override bool ContinueUserActivity(UIApplication application, NSUserActivity userActivity, UIApplicationRestorationHandler completionHandler)
        {
            return BranchIOS.getInstance().ContinueUserActivity(userActivity);
        }

        // Called when the app receives a push notification
        public override void ReceivedRemoteNotification(UIApplication application, NSDictionary userInfo)
        {
            BranchIOS.getInstance().HandlePushNotification(userInfo);
        }
    }
}

实现功能

创建内容引用

BranchUniversalObject universalObject = new BranchUniversalObject();
universalObject.canonicalIdentifier = "id12345";
universalObject.title = "id12345 title";
universalObject.contentDescription = "My awesome piece of content!";
universalObject.imageUrl = "https://s3-us-west-1.amazonaws.com/branchhost/mosaic_og.png";
universalObject.metadata.Add("foo", "bar");

创建深度链接

BranchLinkProperties linkProperties = new BranchLinkProperties();
linkProperties.tags.Add("tag1");
linkProperties.tags.Add("tag2");
linkProperties.feature = "sharing";
linkProperties.channel = "facebook";
linkProperties.controlParams.Add("$desktop_url", "http://example.com");

Branch.GetInstance().GetShortURL(callback,
                                  universalObject,
                                  linkProperties);

分享深度链接

  • 生成 Branch 深度链接,并通过用户选择的渠道(Channel)进行标记

  • 需要创建内容引用

  • 需要[创建链接参考] / developers-hub / docs / ios-advanced-features#section-create-link-reference)

  • 使用深度链接属性

ShareLink (IBranchLinkShareInterface callback,
           BranchUniversalObject universalObject,
           BranchLinkProperties linkProperties,
           string message)

读取深度链接

  • 从深度链接中提取 Branch 数据

  • 最佳做法是从listener 接收数据(以防止出现race condition)

  • 返回深度链接属性

// latest
Dictionary<string, object> sessionParams = Branch.GetInstance().GetLatestReferringParams();

// first
Dictionary<string, object> installParams = Branch.GetInstance().GetFirstReferringParams();

跟踪用户

  • 设置事件、深度链接和推荐的用户标识(电子邮件、ID 和 UUID 等)

  • 使用 Branch 控制面板进行验证

Branch branch = Branch.GetInstance ();
branch.SetIdentity("the user id", this);  // Where this implements IBranchIdentityInterface
branch.Logout(this); // Where this implements IBranchIdentityInterface

跟踪事件

  • 注册自定义事件

  • 这些事件命名opencloseinstall ,和referred session 都是Branch预留的

  • 最佳方式之前跟踪用户跟踪事件以将自定义事件与用户相关联

  • 使用 Branch 控制面板进行验证

Branch branch = Branch.GetInstance ();
branch.LogEvent("the_custom_event");

追踪商业事件

Branch branch = Branch.GetInstance ();
Dictionary<string, object> data = new Dictionary<string, object>();
data.Add("sku", "123456789");
branch.LogEvent("purchase_event", data);

解决问题

测试深度链接iOS

  • Branch营销仪表板创建深度链接接

  • 从设备中删除您的应用程序

  • 使用Xcode编译您的应用

  • 粘贴深度链接到 Apple Notes

  • 长按深度链接接 (不是3D Touch)

  • 点击Open in "APP_NAME" 打开您的应用程序示例

无法将Branch所需的NuGet软件包添加到C#项目

如果尚未配置要使用的NuGet程序包,则可能无法将其添加到C#项目中 PCL 4.5 - Profile78

  1. 右键点击项目名称,然后选择: Options
  2. 浏览菜单至 Build > General
  3. Current Profile 更改为: PCL 4.5 - Profile78

更改权利后,将iOS应用程序部署到设备失败,并显示Provisioning Profile错误

Xamarin会自动使用从应用程序的名称派生的全小写值填充Info.plist 文件中的Bundle Identifier 字段。实际上,此值区分大小写,并且必须与 Apple Developer Portal 中的值完全匹配。当没有配置权利时,默认的Xamarin配置可能会起作用,然后在添加权利后突然开始失败。

这个问题可以通过确保解决Bundle IdentifierInfo.plist 相匹配的Bundle Identifier 上显示苹果开发者门户网站

  1. 打开Info.plist 文件
  2. Apple Developer Portal Bundle Identifier 字段中输入应用' s Bundle Identifier

示例应用

此存储库中包含四个功能齐全的演示应用程序:适用于iOS和Android平台的Xamarin Native和Xamarin Forms应用程序。将这些应用程序用作集成Branch SDK的参考模型。

  • Testbed-Xamarin (Native apps)

  • Testbed-XamarinForms (Forms apps)

4个月前更新

Xamarin iOS


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

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