草庐IT

ios - 如何在 iOS 应用程序中支持通用链接并为其设置服务器?

coder 2023-07-25 原文

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

最佳答案

支持通用链接

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

在这里,如何设置您自己的服务器,并在您的应用程序中处理相应的链接。

设置服务器

您需要有一台在线运行的服务器。为了安全地将您的 iOS 应用程序与服务器关联,Apple 要求您提供一个名为 apple-app-site-association 的配置文件。 .这是一个 JSON描述域和支持的路由的文件。
apple-app-site-association文件需要通过 HTTPS 访问,没有任何重定向,在 https://{domain}/apple-app-site-association。

该文件如下所示:

{
"applinks": {
    "apps": [ ],
    "details": [
        {
            "appID": "{app_prefix}.{app_identifier}",
            "paths": [ "/path/to/content", "/path/to/other/*", "NOT /path/to/exclude" ]
        },
        {
            "appID": "TeamID.BundleID2",
            "paths": [ "*" ]
        }
    ]
}
}

注意 - 不要附加 .jsonapple-app-site-association文档名称。

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

定义路径有 3 种方式:Static :整个支持的路径被硬编码以识别特定链接,例如/静态/条款Wildcards : A * 可用于匹配动态路径,例如/books/* 可以匹配任何作者页面的路径。 ?在特定路径组件内,例如书/1?可用于匹配任何 ID 以 1 开头的书籍。Exclusions : 在路径前面加上 NOT 排除匹配的路径。

数组中提及路径的顺序很重要。较早的索引具有更高的优先级。一旦路径匹配,评估就会停止,其他路径将被忽略。每个路径都区分大小写。

支持多域

应用程序支持的每个域都需要提供自己的 apple-app-site-association 文件。如果每个域提供的内容不同,那么文件的内容也会改变以支持各自的路径。否则,可以使用相同的文件,但它需要在每个受支持的域中都可以访问。

签署 App-Site-Association 文件

备注 : 如果你的服务器使用 HTTPS,你可以跳过这部分提供内容并跳转到应用程序设置指南。

如果您的应用面向 iOS 9 并且您的服务器使用 HTTPS要提供内容,您无需签署文件。如果没有(例如在 iOS 8 上支持 Handoff),则必须使用 SSL 签名。来自认可的证书颁发机构的证书。

备注 :这不是 Apple 提供的用于将您的应用程序提交到 App Store 的证书。应由第三方提供,建议使用与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

这将输出当前目录中的签名文件。 example.com.key , example.com.pem , 和 intermediate.pem是由您的认证机构提供给您的文件。

备注 : 如果文件是未签名的,它应该有一个 Content-Typeapplication/json .否则,应该是 application/pkcs7-mime .

使用 Apple App 搜索验证工具验证您的服务器
针对 iOS 9 搜索 API 测试您的网页。输入一个 URL,Applebot 将抓取您的网页并展示您如何优化以获得最佳结果
https://search.developer.apple.com/appsearch-validation-tool/

网站代码

网站代码可以在 gh-pages 分支上找到
https://github.com/vineetchoudhary/iOS-Universal-Links/tree/gh-pages

设置 iOS 应用程序

应用程序将针对 iOS 9,并将使用 Xcode 7.2 和 Objective-C .

启用通用链接

应用端的设置需要两件事:
1. 配置应用权限,开启通用链接。
2. 处理您的 AppDelegate 中的传入链接.

1. 配置应用权限,开启通用链接。
配置应用程序权利的第一步是为您的应用程序 ID 启用它。在 Apple 开发人员成员(member)中心执行此操作。单击证书、标识符和配置文件,然后单击标识符。选择您的 App ID(如果需要,首先创建它),单击编辑并启用关联域权利。



接下来,通过单击相应的 App ID 获取 App ID 前缀和后缀。

App ID 前缀和后缀应与 apple-app-site-association 文件中的匹配。

下一步在 Xcode ,选择您的应用程序的目标,单击功能并将关联域切换为开。为您的应用支持的每个域添加一个条目,以 applinks: 为前缀。

例如:applinks:vineetchoudhary.github.io

示例应用程序如下所示:


备注 :确保您选择了与成员(member)中心注册的 App ID 相同的团队并输入了相同的 Bundle ID。还要确保通过选择文件并在文件检查器中确保 Xcode 包含权利文件,确保选中您的目标。


处理 AppDelegate 中的传入链接
[UIApplicationDelegate application: continueUserActivity: restorationHandler:] AppDelegate.m 中的方法处理传入链接。您解析此 URL 以确定应用程序中的正确操作。

例如,在示例应用程序中:

objective-C
-(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;
}  

swift :
func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool {
      if userActivity.activityType == NSUserActivityTypeBrowsingWeb {
          let url = userActivity.webpageURL!
          //handle url
      }
      return true
  }

iOS 应用程序代码

应用程序代码可以在 master 分支上找到
https://github.com/vineetchoudhary/iOS-Universal-Links/

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

  • 完毕。这都是关于通用链接的。

    引用
  • Support Universal Links in your iOS App
  • 关于ios - 如何在 iOS 应用程序中支持通用链接并为其设置服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35609667/

    有关ios - 如何在 iOS 应用程序中支持通用链接并为其设置服务器?的更多相关文章

    1. ruby - 如何在 Ruby 中顺序创建 PI - 2

      出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits

    2. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

      我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

    3. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

      我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

    4. ruby - 将差异补丁应用于字符串/文件 - 2

      对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

    5. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

      如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

    6. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

      我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

    7. ruby - 如何指定 Rack 处理程序 - 2

      Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

    8. ruby - 在 Ruby 中编写命令行实用程序 - 2

      我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

    9. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

      exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

    10. ruby-on-rails - Rails 应用程序之间的通信 - 2

      我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

    随机推荐