Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在iOS应用程序和安装服务器中支持通用链接?_Ios_Ios Universal Links - Fatal编程技术网

如何在iOS应用程序和安装服务器中支持通用链接?

如何在iOS应用程序和安装服务器中支持通用链接?,ios,ios-universal-links,Ios,Ios Universal Links,如何在我的iOS应用程序中支持并设置我的服务器以支持通用链接?支持通用链接 当您支持通用链接时,iOS 9用户可以点击指向您网站的链接,无缝重定向到您已安装的应用程序,而无需通过Safari。如果您的应用程序未安装,点击指向您网站的链接将在Safari中打开您的网站 这里,介绍如何设置您自己的服务器,以及如何处理应用程序中的相应链接 安装服务器 您需要让服务器联机运行。为了安全地将iOS应用程序与服务器关联,苹果要求您提供一个名为苹果应用程序站点关联的配置文件。这是一个描述域和支持的路由的JS

如何在我的
iOS
应用程序中支持并设置我的服务器以支持通用链接?

支持通用链接 当您支持通用链接时,iOS 9用户可以点击指向您网站的链接,无缝重定向到您已安装的应用程序,而无需通过Safari。如果您的应用程序未安装,点击指向您网站的链接将在Safari中打开您的网站

这里,介绍如何设置您自己的服务器,以及如何处理应用程序中的相应链接


安装服务器 您需要让服务器联机运行。为了安全地将iOS应用程序与服务器关联,苹果要求您提供一个名为
苹果应用程序站点关联的配置文件。这是一个描述域和支持的路由的
JSON
文件

apple app site association
文件需要通过HTTPS://{domain}/apple app site association通过
HTTPS
访问,无需任何重定向

该文件如下所示:

{
"applinks": {
    "apps": [ ],
    "details": [
        {
            "appID": "{app_prefix}.{app_identifier}",
            "paths": [ "/path/to/content", "/path/to/other/*", "NOT /path/to/exclude" ]
        },
        {
            "appID": "TeamID.BundleID2",
            "paths": [ "*" ]
        }
    ]
}
}
注意-不要将
.json
附加到
苹果应用程序站点关联
文件名中

按键如下:
应用程序
:应该有一个空数组作为其值,并且它必须存在。这就是苹果想要的。
详细信息
:是一组字典,每个字典对应于网站支持的iOS应用程序。每个字典都包含有关应用程序、团队和捆绑包ID的信息

定义路径有3种方法:
Static
:对整个受支持路径进行硬编码,以识别特定链接,例如/Static/terms
通配符
:A*可用于匹配动态路径,例如/books/*可匹配任何作者页面的路径?内部特定路径组件,例如书籍/1?可用于匹配ID以1开头的任何书籍。
排除
:在路径前面加上NOT,不排除该路径被匹配

在数组中提及路径的顺序很重要。更早的指数具有更高的优先级。一旦路径匹配,计算将停止,其他路径将被忽略。每个路径都区分大小写

支持多个域 应用程序中支持的每个域都需要提供自己的apple应用程序站点关联文件。如果每个域提供的内容不同,则文件的内容也将更改以支持各自的路径。否则,可以使用相同的文件,但它需要在每个受支持的域中都可以访问

正在签名应用程序站点关联文件 注意:如果您的服务器使用
HTTPS
提供内容并跳转到应用程序设置指南,则可以跳过此部分

如果您的应用程序以iOS 9为目标,并且您的服务器使用
HTTPS
提供内容,则您无需签署该文件。如果没有(例如,当支持iOS 8上的切换时),则必须使用来自公认证书颁发机构的
SSL
证书对其进行签名

注意:这不是苹果提供的向应用商店提交应用程序的证书。它应该由第三方提供,建议使用与
HTTPS
服务器相同的证书(尽管不是必需的)

要对文件签名,首先创建并保存一个简单的.txt版本。接下来,在终端中,运行以下命令:

cat <unsigned_file>.txt | openssl smime -sign -inkey example.com.key -signer example.com.pem -certfile intermediate.pem -noattr -nodetach -outform DER > apple-app-site-association
斯威夫特: iOS应用程序代码 应用程序代码可在主分支上找到

注:
  • 通常,在Safari或UIWebView/WKWebView实例中单击的任何受支持链接都应打开应用程序
  • 对于iOS 9.2及以下版本,这将只在设备上工作。iOS 9.3(撰写本文时仍处于测试阶段)也支持模拟器
  • iOS在打开通用链接时会记住用户的选择。如果他们点击右上角的面包屑打开Safari中的链接,所有进一步的点击都会将他们带到Safari,而不是应用程序。他们可以通过在网站上的应用程序横幅中选择Open(打开),在默认情况下切换回打开应用程序
  • 完成。这都是关于通用链接的。
    工具书类

  • 如果您完成了Vinet的所有文章,但仍然不起作用,请尝试使用分发资源调配配置文件。我从上面的帖子中做了所有的事情,但是为了让它工作,我不得不发布一个发布概要

    使用开发配置文件,应用程序成功下载了AASA文件,但当我按下链接时,它从未打开我的应用程序


    希望有帮助。

    以下是处理Swift 3+中通用链接的代码,基于:


    @在HTTP上,您需要已签名的apple应用程序站点关联文件。要签署文件,请阅读poin
    签署应用程序站点关联文件
    ,或者明天尝试。将签名文件上传到HTTP上的staging.domain.com应该可以,对吧?很棒的教程@VineetChoudhary,我有个问题。例如,如果我从Whatsapp打开一个url,会发生什么?通用链接应该起作用吗?谢谢@巴奎克斯:是的。。因为如果任何应用程序试图打开一个外部url,它必须调用
    [[UIApplication sharedApplication]openURL:][/code>,我认为这就是
    通用链接的选择器,由
    苹果公司实施
    感谢@VineetChoudhary。我在我的应用程序中实现了通用链接,但当我尝试从Whatsapp打开一个URL时,例如,它不起作用。但是当我从Safari打开url时,它工作了!我很困惑:如果你有什么建议,我很感激!再次感谢。这可能是另一个有用的提示。您是否使用手动签名,而不是选中常规选项卡中“自动管理签名”的复选框,让Xcode为您进行签名设置?手动。实际上,我们发现配置配置文件的生成不正确。我们将TeamID添加到配置文件ID中,这导致了一个双前缀。无论是开发还是分发profil,删除这些事实上修复了错误
    
    -(BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler{
        if ([userActivity.activityType isEqualToString: NSUserActivityTypeBrowsingWeb]) {
            NSURL *url = userActivity.webpageURL;
            UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
            UINavigationController *navigationController = (UINavigationController *)_window.rootViewController;
            if ([url.pathComponents containsObject:@"home"]) {
                [navigationController pushViewController:[storyBoard instantiateViewControllerWithIdentifier:@"HomeScreenId"] animated:YES];
            }else if ([url.pathComponents containsObject:@"about"]){
                [navigationController pushViewController:[storyBoard instantiateViewControllerWithIdentifier:@"AboutScreenId"] animated:YES];
            }
        }
        return YES;
    }  
    
    func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool {
          if userActivity.activityType == NSUserActivityTypeBrowsingWeb {
              let url = userActivity.webpageURL!
              //handle url
          }
          return true
      }
    
    func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
        if userActivity.activityType == NSUserActivityTypeBrowsingWeb,
            let url = userActivity.webpageURL {
            //handle URL
        }
    
        return true
    }