【问题标题】:iOS Custom Url Scheme XCodeiOS 自定义 URL 方案 XCode
【发布时间】:2016-05-04 02:20:14
【问题描述】:

首先,我知道如何在 iOS 中制作自定义方案,并且我知道如何使用 javascript setTimeout 方法从网站打开我的应用程序。

我有一个使用自定义 URL 方案的应用程序,它运行良好。它的作用是,它向联系人列表(预定义)中的其他用户发送http://testsite.com/QueryStrings 消息,并在单击短信中的这些网络链接时,会发生以下情况:

  1. 在 Safari 中打开链接
  2. 如果使用 setTimeout 使用自定义 url 打开应用程序
  3. 如果未安装,请移至正常网站页面

我实际上想要的是直接从 SMS 中打开我的应用程序(如果已安装),但为此我必须在 SMS 中发送我的自定义 url 方案,这不是一个选项,因为如果未安装应用程序,那么此 SMS 将无法工作,所以weblink 是目前唯一的选择。

今天,我安装了SoundCloud,无意中注意到这个东西是http://m. soundcloud .com /... url 以 SMS 的形式发送,单击链接时,它会直接打开应用程序(如果已安装)而不是 Safari(对我来说很奇怪)。

所以我想知道如何在不打开 Safari 的情况下从 Web 链接打开他们的应用程序。我用谷歌搜索了它,但我找不到解决我的问题的方法。我也从我的手机中附加了一个屏幕截图,其中按住消息应用程序中的链接也会在“SoundCloud”选项中打开。那么 SoundCloud 如何注册一个 http 链接以在应用程序中自动处理。请大家帮忙

Screenshot of SoundCloud Open

【问题讨论】:

  • 在我安装了 Soundcloud 的手机中进行了测试,无法像您的图片一样在“SoundCloud”中打开您的链接。这是诡计吗?
  • 不,这不是技巧。只需通过 SMS 或 iMessage 发送链接,然后点击它。

标签: ios xcode


【解决方案1】:

这个问题的答案是使用Associated Domains(但在9.2之后我们必须使用Universal Links来实现这一点)。

在通用链接之前,在安装应用时打开应用的主要机制是尝试在 Safari 中重定向到应用的 URI 方案(像这样在应用的 PLIST 中注册)。这将路由逻辑放在 Safari 中,但无法检查应用程序是否已安装。

iOS 9 通用链接旨在解决此问题。当点击链接时,iOS 不会首先打开 Safari,而是会检查是否已为与链接关联的域注册了通用链接,然后检查是否安装了相应的应用程序。如果当前安装了该应用程序,它将被打开。如果不是,Safari 将打开并加载 http(s) 链接。

从功能上讲,它允许您使用一个链接来打开您的应用或打开您的移动网站。

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

  1. 在developers.apple.com 上注册了您的应用
  2. 在您的应用标识符上启用“关联域”
  3. 在您的 Xcode 项目中启用“关联域”
  4. 添加适当的域权利
  5. 确保构建时包含权利文件

将您的网站配置为托管“apple-app-site-association”文件

  1. 购买域名或从现有域名中挑选
  2. 获取域名的 SSL 认证
  3. 创建结构化的“apple-app-site-association”JSON 文件
  4. 使用 SSL 认证签署 JSON 文件
  5. 配置文件服务器

Apple 在 iOS 9.0 中推出了 Universal Links,它将应用程序路由转移到操作系统中,因此开发人员无需担心在 Javascript 中进行路由。

在应用程序中接收通用链接 URL

URI 方案通过 App Delegate 中的 openUrl 接收深层链接 URL。通用链接通过不同的代码路径接收数据:continueUserActivity。这种新的委托方法用于许多应用程序转换,从 Spotlight 到 Universal Links,并且可能会在未来的操作系统版本中引入更多用例。

下面是一段代码,您可以使用它来检索打开应用程序的完整通用链接 URL。

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray *))restorationHandler {
    if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
        NSString *myUrl = [userActivity.webpageURL absoluteString];
        // parse URL string or access query params
    }
    return YES;
}

来源:https://blog.branch.io/how-to-setup-universal-links-to-deep-link-on-apple-ios-9

【讨论】:

  • 始终欢迎提供指向潜在解决方案的链接,但请add context around the link,以便您的其他用户知道它是什么以及为什么存在。始终引用重要链接中最相关的部分,以防目标站点无法访问或永久离线。考虑到仅仅是指向外部站点的链接Why and how are some answers deleted? 的一个可能原因。
  • @Sarmad Makhdoom,通用链接是否支持动态链接?对我来说,我将拥有基本 url 和端点文本(这是一种兑换代码)。