分支没有打开 App Store link
Branch does not open the App Store link
我使用 Branch 创建深度 links。我添加了一个新的控制参数 ios_has_app_url 和 ios_url。安装应用程序时单击深度 link 然后一切正常,但是如果在设备上未安装应用程序时单击深度 link 然后在启动过程中,我会看到浏览器打开 ios_url(App Store link)时,它会尝试打开 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)
}
更新:我的目标是点击深度link时,如果安装了应用,则打开应用,如果没有,则打开应用商店 link.
更新 1: 我这样更改了我的代码,如果我只需单击 link,它就会打开 App Store,如果我使用 3D Touch,那么我可以选择在哪里打开这个link。如果安装了应用程序并单击 link 立即打开应用程序(或者至少在浏览器中有一个 link,但有一个打开应用程序的选项)和如果应用程序未安装,则单击 link,转到 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")
I see that the browser instead of opening ios_url (App Store link), it
tries to open ios_has_app_url. How can I fix it?
通过让 link 为:
"itms-apps://itunes.apple.com/app/idxxxxxxxxxx"
Alex 来自 Branch.io 这里:
好消息是这比您预期的要容易得多。不过,既然你做了这么完整的报告,我会把所有的细节都讲一遍,让你知道幕后发生了什么。
简短说明
要在安装时启动您的应用程序,您无需手动将自定义 URI 方案设置为 $ios_has_app_url
的值 — 分支和 iOS 通过设计为您实现此行为。
如果您的 links 没有启动您的应用程序,则您的通用 Links 配置可能有问题。我建议查看 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 本身仍然可以对其进行操作。 Universal Links 正是这样做的——当用户打开 Universal Link(其中包括 Branch links,假设您已完成所有配置)时,如果安装了该应用程序,该应用程序将打开.如果没有安装,用户会被传送到link的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.
- 将 link 粘贴到带有智能横幅代码的页面到笔记中。
- 卸载应用程序。
- 设置 > 通用 > Safari > 清除历史记录和网站数据。
- 设置 > 通用 > Safari > 高级 > 网站数据 > 向左滑动并删除所有条目。
- 设置 > 通用 > 隐私 > 广告 > 重置广告标识符...
- 单击注释中的 link(来自第 1 步)。
- 横幅应始终显示 "Download"(如果不显示,那是因为清除网站数据不成功)。
- 点击下载。
- 运行 通过 Xcode 的应用程序(用于安装)。
- 在 Xcode 中停止应用程序,然后从 phone 中启动它。
- 再次单击“备忘录”中的 link - 该按钮现在应显示 "Open" 并打开应用程序。
我使用 Branch 创建深度 links。我添加了一个新的控制参数 ios_has_app_url 和 ios_url。安装应用程序时单击深度 link 然后一切正常,但是如果在设备上未安装应用程序时单击深度 link 然后在启动过程中,我会看到浏览器打开 ios_url(App Store link)时,它会尝试打开 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)
}
更新:我的目标是点击深度link时,如果安装了应用,则打开应用,如果没有,则打开应用商店 link.
更新 1: 我这样更改了我的代码,如果我只需单击 link,它就会打开 App Store,如果我使用 3D Touch,那么我可以选择在哪里打开这个link。如果安装了应用程序并单击 link 立即打开应用程序(或者至少在浏览器中有一个 link,但有一个打开应用程序的选项)和如果应用程序未安装,则单击 link,转到 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")
I see that the browser instead of opening ios_url (App Store link), it tries to open ios_has_app_url. How can I fix it?
通过让 link 为:
"itms-apps://itunes.apple.com/app/idxxxxxxxxxx"
Alex 来自 Branch.io 这里:
好消息是这比您预期的要容易得多。不过,既然你做了这么完整的报告,我会把所有的细节都讲一遍,让你知道幕后发生了什么。
简短说明
要在安装时启动您的应用程序,您无需手动将自定义 URI 方案设置为 $ios_has_app_url
的值 — 分支和 iOS 通过设计为您实现此行为。
如果您的 links 没有启动您的应用程序,则您的通用 Links 配置可能有问题。我建议查看 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 本身仍然可以对其进行操作。 Universal Links 正是这样做的——当用户打开 Universal Link(其中包括 Branch links,假设您已完成所有配置)时,如果安装了该应用程序,该应用程序将打开.如果没有安装,用户会被传送到link的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.
- 将 link 粘贴到带有智能横幅代码的页面到笔记中。
- 卸载应用程序。
- 设置 > 通用 > Safari > 清除历史记录和网站数据。
- 设置 > 通用 > Safari > 高级 > 网站数据 > 向左滑动并删除所有条目。
- 设置 > 通用 > 隐私 > 广告 > 重置广告标识符...
- 单击注释中的 link(来自第 1 步)。
- 横幅应始终显示 "Download"(如果不显示,那是因为清除网站数据不成功)。
- 点击下载。
- 运行 通过 Xcode 的应用程序(用于安装)。
- 在 Xcode 中停止应用程序,然后从 phone 中启动它。
- 再次单击“备忘录”中的 link - 该按钮现在应显示 "Open" 并打开应用程序。