具有自定义网址方案的iOS 9 Safari iframe src无法正常工作

问题描述 投票:32回答:2

我使用此解决方案https://gist.github.com/davidwkeith/2662899从网页重定向到我的应用程序(如果已安装应用程序)。但它不适用于iOS9。它仍适用于Google-chrome。但是具有自定义URL方案的iframe无法从Safari启动应用程序。

如果我替换

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

((其中加载程序为iframe)和

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

它将起作用。

操作系统:iOS 9 beta4和beta5

有人知道这个问题吗?是iOS 9 Beta错误吗?还是不能解决?

ios safari ios9
2个回答
17
投票

先前的答案是通用链接的部分实现,该实现缺少关键细节,并且不包括对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。配置您的应用程序以注册批准的域

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

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

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

“权利”

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

“applinks”

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

I。购买域名或从您现有的域名中选择]

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

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]中大量借用]

是的,现在可以在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
                }

1
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.