Branch 打不开 App Store 链接

Posted

技术标签:

【中文标题】Branch 打不开 App Store 链接【英文标题】:Branch does not open the App Store link 【发布时间】:2017-07-23 14:01:15 【问题描述】:

我使用Branch 创建深层链接。我添加了一个新的控制参数 ios_has_app_url 和 ios_url。安装应用程序时单击深层链接,然后一切正常,但是如果您在设备上未安装应用程序时单击深层链接,然后在启动期间,我看到浏览器而不是打开 ios_url(App Store 链接) ,它会尝试打开 ios_has_app_url。我该如何解决?

private func createDeepLink(_ card: CardModel) -> (branchUniversalObject: BranchUniversalObject, branchLinkProperties: BranchLinkProperties) 
    let branchUniversalObject = BranchUniversalObject(canonicalIdentifier: ("cardId/\(card.id)"))
    branchUniversalObject.title = card.title
    branchUniversalObject.contentDescription = ""
    branchUniversalObject.imageUrl = card.photoURLsProperties.originalURL

    branchUniversalObject.addMetadataKey(CardKeys.cardID.rawValue, value: card.id)

    branchUniversalObject.addMetadataKey("placeAvatarURLString", value: card.photoURLsProperties.originalURL)

    branchUniversalObject.addMetadataKey("title", value: card.title)
    branchUniversalObject.addMetadataKey("isAutoGeneratedCard", value: "false")

    let fullLocationName = card.location.fullLocationName
    branchUniversalObject.addMetadataKey("fullLocationName", value: fullLocationName)

    branchUniversalObject.addMetadataKey(CardKeys.ownerID.rawValue, value: card.ownerID)
    branchUniversalObject.addMetadataKey(ParametersKeywords.type.rawValue, value: ModeKeywords.shareCard.rawValue)

    branchUniversalObject.addMetadataKey("availableSeats", value: card.peopleProperties.availableSeats.description)

    let coordinate = card.location.coordinate
    branchUniversalObject.addMetadataKey("latitude", value: coordinate.latitude.description)
    branchUniversalObject.addMetadataKey("longitude",value: coordinate.longitude.description)

    let linkProperties = BranchLinkProperties()
    linkProperties.feature = "sharing"
    linkProperties.addControlParam("$desktop_url", withValue: "http://www.appname.com")
    linkProperties.addControlParam("$ios_has_app_url", withValue: "appname://")
    linkProperties.addControlParam("$ios_url", withValue: "https://itunes.apple.com/app/idXXXXXXXXXXXXXXX")

    return (branchUniversalObject: branchUniversalObject, branchLinkProperties: linkProperties)

更新:我的目标是,当点击深层链接时,如果安装了应用程序,则打开应用程序,如果没有,则打开应用商店链接。

更新 1: 我像这样更改了我的代码,如果我只是点击链接,它会打开 App Store,如果我使用 3D Touch,那么我可以选择在哪里打开这个链接。如果安装了应用程序并单击链接立即打开应用程序(或至少浏览器中的一个链接,但有一个打开应用程序的选项)并且如果未安装应用程序,那么是否可以这样做点击链接,进入 App Store 应用页面。

let linkProperties = BranchLinkProperties()
        linkProperties.feature = "sharing"
        linkProperties.addControlParam("$desktop_url", withValue: "http://www.appname.com")
        linkProperties.addControlParam("$ios_has_app_url", withValue: "https://appname.app.link/")
        linkProperties.addControlParam("$ios_url", withValue: "itms-apps://itunes.apple.com/app/idXXXXXX")

【问题讨论】:

将您的 https 更改为 itms,看看是否有帮助。 @MwcsMac 我做了,但没有帮助 【参考方案1】:

来自 Branch.io 的 Alex 在这里:

好消息是这比您预期的要容易得多。不过,既然你做了如此完整的报告,我会详细介绍所有细节,以便你确切了解幕后发生的事情。

简短说明

要在安装时处理启动应用程序,您无需手动将自定义 URI 方案设置为 $ios_has_app_url 的值 — Branch 和 iOS 通过设计为您实现此行为.

如果您的链接未启动您的应用,则您的通用链接配置可能存在问题。我建议查看this troubleshooting guide。

详细说明

我们的$ios_has_app_url 控制参数依赖于我们的服务器跟踪的布尔值has_apphas_app 值在典型的实际使用中相当准确(足以在智能应用横幅上显示 OpenInstall 标签之间切换按钮,例如示例),但它并非在所有情况下都 100% 准确。

这是 iOS 的限制:Apple 不允许网页查询设备上安装了哪些应用程序(出于明显的隐私原因),因此 Branch 必须依赖 cookie 匹配。这意味着如果我们无法匹配 cookie,或者最近没有看到用户,或者用户清除了他们的设备缓存,或者用户在 Branch 上次看到他们后卸载了应用程序,has_app 的值将不正确。当has_app 的值不正确时,$ios_has_app_url 的行为也会出错。

但是,即使 Apple 不允许网页查询访问这些数据,iOS 本身仍然可以对其进行操作。通用链接正是这样做的——当用户打开一个通用链接(包括分支链接,假设你完成了所有配置)时,如果安装了应用程序,它将打开。如果未安装,用户将被发送到链接的 URL。

$ios_has_app_url 的预期用途

Branch $ios_has_app_url 参数适用于高级实现中非常具体的用例; 绝大多数我们的合作伙伴从不使用它。以下是您可能需要的潜在情况:

您有一个极端情况,Universal Links are not supported,如果 Branch 知道他们已经安装了您的应用程序,您希望将您的用户发送到一个不同的网页,而不是让他们选择打开它。显然这是一种罕见的情况,通常只与企业级应用相关。

调试has_app

如果您在尝试调试 has_app 返回错误值的情况时遇到困难,您有几个选择:

    如果您收到true 并且想要false,请在Safari 中使用隐私浏览模式。这可以防止 Branch 进行 cookie 匹配,这意味着您将总是得到false。 或者,执行以下步骤:
      确保正在测试的应用具有setDebug enabled。 将带有智能横幅代码的页面的链接粘贴到 Notes 中。 卸载应用程序。 设置 > 常规 > Safari > 清除历史记录和网站数据。 设置 > 常规 > Safari > 高级 > 网站数据 > 向左滑动并删除所有条目。 设置 > 常规 > 隐私 > 广告 > 重置广告标识符... 单击 Notes 中的链接(从第 1 步开始)。 横幅应始终显示“下载”(如果不显示,是因为清除网站数据不成功)。 点击下载。 通过 Xcode 运行应用程序(用于安装它)。 在 Xcode 中停止应用程序,然后从手机启动它。 再次单击 Notes 中的链接 - 按钮现在应显示“打开”并打开应用程序。

【讨论】:

【参考方案2】:

我看到浏览器没有打开 ios_url(App Store 链接),它 尝试打开 ios_has_app_url。我该如何解决?

通过让链接成为:

"itms-apps://itunes.apple.com/app/idxxxxxxxxxx"

【讨论】:

我做了,但没有帮助 您可以尝试在您的项目中以某种方式运行此代码-if let url = URL(string: "itms-apps://itunes.apple.com/app/idxxxxxxxxxx"), UIApplication.shared.canOpenURL(url) if #available(iOS 10.0, *) UIApplication.shared.open(url, options: [:], completionHandler: nil) else UIApplication.shared.openURL(url) 看,问题是如果有应用程序本身的链接,并且应用程序没有安装,那么应该打开第一个指向App Store App Page的链接,如果ios_has_app_url被移除,然后一切都打开了。但后来发现,即使安装了应用程序,它仍然会打开 App Store App Page。

以上是关于Branch 打不开 App Store 链接的主要内容,如果未能解决你的问题,请参考以下文章

chrono24 app打不开

youversion 打不开

手机app打不开是啥原因

微信电脑版里面的链接电脑打不开,以前可以打开,现在打不开了是怎么回事?请高手赐教

上网用IE6打不开链接怎么办?

iphone短信链接打不开,复制到微信就可以打开