iOS 9 safari iframe src与自定义网址方案无法正常工作

时间:2015-08-08 09:42:36

标签: ios safari ios9

如果安装了应用,我会使用此解决方案https://gist.github.com/davidwkeith/2662899从网络重定向到我的应用。 但它在ios 9中被破坏了。它仍然可以在谷歌浏览器中使用,但iframe使用自定义网址方案而不是在safari中启动应用程序。

如果我替换

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

(其中loader是iframe)

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

它会起作用。

os:iOS 9 beta4和beta5

有人知道这个问题吗?它是ios 9 beta bug吗?或者它不会被修复?

2 个答案:

答案 0 :(得分:17)

之前的答案是Universal Links的部分实施,它缺少关键细节,并且不包含对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上注册您的应用

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

III。在Xcode项目中启用“关联域”

entitlements

IV。在您的应用中添加适当的域权利applinks:yourdomain.com

applinks

<强> 2。将您的网站配置为托管“apple-app-site-association”文件

我。购买域名或从现有的

中选择

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

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

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

IV。使用SSL认证签署JSON文件

cat apple-app-site-association-unsigned | openssl smime -sign -inkey yourdomain.com.key -signer yourdomain.com.cert -certfile digicertintermediate.cert -noattr -nodetach -outform DER > apple-app-site-association

诉配置文件服务器

apple-app-site-association文件: - 必须使用标题'application / pkcs7-mime'发送 - 必须从端点youdomain.com/apple-app-site-association发送 - 必须返回200个http代码。

示例Express +节点:

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

大量借用

答案 1 :(得分:1)

是的,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":[ "*" ]
  }
}
  }
}

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

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
                }