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_app
。 has_app
值在典型的实际使用中相当准确(足以在智能应用横幅上显示 Open 或 Install 标签之间切换按钮,例如示例),但它并非在所有情况下都 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 链接的主要内容,如果未能解决你的问题,请参考以下文章