【问题标题】:iOS 9 safari iframe src with custom url scheme not working带有自定义 url 方案的 iOS 9 Safari iframe src 不起作用
【发布时间】:2015-08-08 09:42:35
【问题描述】:

如果安装了应用程序,我使用此解决方案 https://gist.github.com/davidwkeith/2662899 从网页重定向到我的应用程序。 但它不适用于 iOS 9。它仍在 Google-chrome 中运行。但是带有自定义 URL 方案的 iframe 无法从 Safari 启动应用程序。

如果我替换

document.getElementById('loader').src = 'custom-protocol://my-app'

(其中 loader 是 iframe)与

window.location = 'custom-protocol://my-app'

它会起作用的。

操作系统:iOS 9 beta4 和 beta5

有人知道这个问题吗?是 iOS 9 测试版的错误吗?还是不会修复?

【问题讨论】:

  • 这在以后的任何时候都可能行不通。 Apple 可能意识到禁用此功能将推动 Universal Links 的更高采用率。请参阅下面的较长回复

标签: ios safari ios9


【解决方案1】:

上一个答案是通用链接的部分实现,它缺少关键细节并且不包括对 App Store 的回退。

首先,您不能再设置 iframe src 来触发 URI 方案。您已经正确识别了该问题。正如您所指出的,您仍然可以设置window.location = 'custom-protocol://my-app';。因此,如果您知道某个用户拥有您的应用,因为您之前已经从浏览器打开了他们的应用,并且存储了一个可以在后端查找的 cookie,那么您仍然可以安全地触发 custom-protocol://。

其次,您可以使用 navigator.userAgent 检测用户代理字符串。在 iOS 9 之前,您仍然可以使用 iframe 触发 URI 方案,然后在超时后回退。在 iOS 9 上,您可以根据 cookie 选择是否触发 URI 方案,然后将用户带到 App Store。我在Branch 从事这项工作,并利用 cookie 来回忆用户是否可能拥有该应用程序,这是我们已经实现的。如果您对此有更多疑问,请随时与我们联系,或直接使用我们的解决方案。


实现通用链接并不像其他答案描述的那么简单。实际上,复杂性要高得多。以下是完整的步骤列表(最近几周我使用这些步骤帮助了几个应用程序集成):

1.配置您的应用以注册批准的域

我。如果您还没有,请在 developer.apple.com 上注册您的应用

二。在 developer.apple.com 上为您的应用标识符启用“关联域”

三。在您的 Xcode 项目中启用“关联域”

四。在您的应用中添加正确的域权利applinks:yourdomain.com

2。配置您的网站以托管“apple-app-site-association”文件

我。购买域名或从您现有的域名中挑选

二。获取域名的 SSL 认证(可以使用 CloudFlare!)

三。创建结构化的“apple-app-site-association”JSON 文件

{
   "applinks": {
       "apps": [ ],
       "details": {
           "TEAM-IDENTIFIER.YOUR.BUNDLE.IDENTIFIER": {
               "paths": [
                   "*"
               ]
           }
       }
   }
}

四。使用 SSL 认证对 JSON 文件进行签名


v.配置文件服务器

apple-app-site-association 文件: - 必须与标头“application/pkcs7-mime”一起发送 - 必须从端点 youdomain.com/apple-app-site-association 发送 - 必须返回一个 200 http 代码。

示例 Express+Node:

var aasa = fs.readFileSync(__dirname + '/static/apple-app-site-association');
app.get('/apple-app-site-association', function(req, res, next) {
     res.set('Content-Type', 'application/pkcs7-mime');
     res.status(200).send(aasa);
});

信用:大量借用this blog post

【讨论】:

  • 设置window.location = 'custom-protocol://my-app'; 的问题是,如果用户没有安装您的应用程序,他们会看到来自 Safari 的“无法打开页面”警报。
  • 没错。这就是 iOS 7 和 8 上的 iframe 技巧如此出色的原因。仅当您对错误消息没有问题或您相当确定用户拥有您的应用时,才设置 window.location='custom-protocol://';。
  • 我还注意到,从 iOS9 (Safari 601) 开始,当识别到一个 url scheme 时,Safari 也会提醒用户是去还是留。反正有警报,何必呢
【解决方案2】:

是的,现在您可以使用 iOS9 进行深度链接。检查链接以获取详细说明,但我列出了基础知识。

http://blog.hokolinks.com/how-to-implement-apple-universal-links-on-ios-9/

首先你必须去你的目标和点击功能。添加关联的域。

接下来您必须上传 apple-app-site-association 文件。

基本上打开一个JSON编辑器并构造类似这样的东西

{
  "applinks": {
"apps": [],
"details": {
  "TBEJCS6FFP.com.domain.App": {
    "paths":[ "*" ]
  }
}
  }
}

接下来,您必须在应用中支持通用链接。你需要实现

extension AppDelegate {
func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool {
    if userActivity.activityType == NSUserActivityTypeBrowsingWeb {
        let webpageURL = userActivity.webpageURL! // Always exists
        if !handleUniversalLink(URL: webpageURL) {
            UIApplication.sharedApplication().openURL(webpageURL)
        }
    }
    return true
}

private func handleUniversalLink(URL url: NSURL) -> Bool {
    if let components = NSURLComponents(URL: url, resolvingAgainstBaseURL: true), let host = components.host, let pathComponents = components.path?.pathComponents {
        switch host {
        case "domain.com":
            if pathComponents.count >= 4 {
                switch (pathComponents[0], pathComponents[1], pathComponents[2], pathComponents[3]) {
                case ("/", "path", "to", let something):
                    if validateSomething(something) {
                        presentSomethingViewController(something)
                        return true
                    }
                default:
                    return false
                }

【讨论】:

    猜你喜欢
    • 2017-01-29
    • 1970-01-01
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    • 2014-05-02
    • 2014-04-02
    • 2014-10-22
    • 2016-10-23
    相关资源
    最近更新 更多