如何不以编程方式处理一些通用链接?

Posted

技术标签:

【中文标题】如何不以编程方式处理一些通用链接?【英文标题】:How to NOT handle some Universal Links programmatically? 【发布时间】:2019-10-03 11:02:04 【问题描述】:

我的 ios 应用程序处理 universal links 以将 Safari 用户重定向到我的应用程序。到目前为止,一切都运行良好,如果用户从 Google 点按指向我的网站的链接,我的应用将打开,而不是像这样打开我的网站:

from safari https://my-web-site.com -> my-app

但是我的应用程序没有实现我的网站所具备的某些功能,所以我想以编程方式拒绝一些 URL 并让我的用户在 safari 上而不是在我的应用程序中重定向他,如下所示:

from safari https://my-web-site.com -> my-app

from safari https://my-web-site.com?reject -> safari

根据Apple documentation,这应该是可能的:

请务必了解,如果您的应用使用 openURL: 打开指向您网站的通用链接,则该链接不会在您的应用中打开。在这种情况下,iOS 会识别出调用来自您的应用,因此您的应用不应将其作为通用链接处理。

不幸的是,这不是附加的内容,而是我的用户没有留在 safari 中,而是在短时间内重定向到我的应用程序,然后再次重定向到 safari,如下所示:

from safari https://my-web-site.com?reject -> my-app (briefly) -> safari

这是我的 AppDelegate.swift 代码:

internal func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool 
    guard let url = userActivity.webpageURL else  return false 
    guard let urlComponents = URLComponents(url: url, resolvingAgainstBaseURL: true) else  return false 

    let params = urlComponents.queryItems ?? []

    if params.contains(where:  $0.name == "reject" ) 
        // This line should prevent the app from opening according to Apple's documentation 
        application.open(url)
        return false
     else 
        return true
    

所以任何人都知道我如何按照 Apple 文档中描述的方式拒绝通用链接?

注意:拒绝通用链接需要由应用程序根据本地存储的数据以编程方式完成。因此,在我的情况下,在 apple-app-site-association 文件中添加路径异常不是一种选择


  "applinks": 
    "apps": [],
    "details": [
      
        "appID": "XXXXXXXXX.com.my-app",
        "paths": [
          "*",
        "NOT /reject"
        ]
      
    ]
  

【问题讨论】:

【参考方案1】:

如果您在路径数组中的条目前面加上"NOT",那么您可以显式阻止匹配。因此,在您的示例中,您可以执行类似

的操作
["NOT /settings/*", "NOT /activity/*", "/*"] 

这将阻止带有 /settings/activity 前缀的路径,然后匹配其他所有内容。


Reference

【讨论】:

感谢您的回答,但我需要在应用程序中以编程方式进行。我的应用需要根据本地存储的数据动态处理或拒绝某些 URL。 我不认为这是可能的编程方式 @JulienBaillon 这个由操作系统控制,所以这是正确操作它的唯一方法。 Apple 很清楚,在我的情况下,该应用程序不应该打开:"It’s important to understand that if your app uses openURL: to open a universal link to your website, the link does not open in your app." 所以应该有可能...... @JulienBaillon 不,您在谈论的是您的应用程序无法调用 openURL 并通过一些 url 引导回您的应用程序。您的应用程序只能指向另一个应用程序或浏览器。这就是那些话的意思。

以上是关于如何不以编程方式处理一些通用链接?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 CheckBox 检查不以编程方式与 Kotlin 一起工作?

关于Linux中文件,链接的一些思考

通用编程之快速分页代码实现

为啥不以编程方式快速更改 uibutton 标题?

如何以编程方式启用/禁用网络接口? (Windows XP)

NSScrollview 不以编程方式滚动?