【问题标题】:iOS Universal Links and GET parametersiOS 通用链接和 GET 参数
【发布时间】:2016-02-17 13:29:43
【问题描述】:

我们正在尝试使用 Apple 通用链接在 iOS 上实现应用索引(我正在查看https://developer.apple.com/library/ios/documentation/General/Conceptual/AppSearch/UniversalLinks.html#//apple_ref/doc/uid/TP40016308-CH12-SW2)。

在“创建和上传关联文件”部分,我看到我可以将索引限制到特定页面,这很好。

我想将索引限制为https://www.mywebsite.com?parameter=something,我该怎么做?

我正在考虑类似的事情:

{
  "applinks": {
    "apps": [],
    "details": [
      {
        "appID": "MYID",
        "paths":[ "*?parameter=*" ]
      }
    ]
  }
}

你认为它可以工作吗?我还不能测试它,因为它需要时间来获得在网站根目录上上传文件的授权,这就是为什么我问你是否认为它可以工作,如果我想只上传一次文件可以。

谢谢

【问题讨论】:

    标签: ios ios-universal-links google-app-indexing


    【解决方案1】:

    ,目前Universal Links 不支持 #(inline-links) 和 ?(query-parmeter)。 Apple 未在apple-app-site-association 文件中提供任何格式来支持Inline-LinksQuery-Parmeter

    为了对https://www.mywebsite.com?parameter=something 进行索引,我使用了以下 JSON 文件。

    {
      "applinks": {
        "apps": [],
        "details": [
          {
            "appID": "TEAMID.BUNDLEID",
            "paths":[ "*" ]
          }
        ]
      }
    }
    

    如果您只想将索引限制为某些参数,例如 query_parmeter1query_parmeter2,那么您需要在 UIApplicationDelegate 方法 [UIApplicationDelegate application: continueUserActivity: restorationHandler:] 中处理这个问题

    目标-C:

    -(BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler{
        if ([userActivity.activityType isEqualToString: NSUserActivityTypeBrowsingWeb]) {
            NSURL *url = userActivity.webpageURL;
            if ([url.query containsString:@"query_parmeter1"]) {
               //handle code for query_parmeter1
            }else if ([url.query containsString:@"query_parmeter2"]){
               //handle code for query_parmeter2
            }
    
            return YES;
        }
        return NO;
    } 
    

    斯威夫特:

    func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool {
        if userActivity.activityType == NSUserActivityTypeBrowsingWeb {
            let url = userActivity.webpageURL!
            let query = url.query ?? ""
    
            if query.contains("query_parmeter1") {
                // handle code for query_parmeter1
            } else if query.contains("query_parmeter2") {
                // handle code for query_parmeter2
            }
    
            return true
        }
    
        return false
    }
    

    注意:当点击网站链接时,此技巧不会阻止应用打开。但是您可以检查 URL 是否满足您的要求,如果没有,您可以再次在 Web 浏览器中打开您的 URL。类似于亚马逊应用 -

    参考资料 - Handle query parameters in universal links

    【讨论】:

    • 这是在通用链接中处理参数的绝佳答案。值得一提的是通用链接App IndexingSpotlight Web Search 的索引内容之间的区别,因为作者显然想要做后者(这在基本的通用链接实现中不是自动的)
    • 谢谢你 Vineet Choudhari。这是一个很好的技巧,但它不会阻止应用程序在单击网站链接时打开,对吧?如果没有设置任何参数,在默认情况下如何处理网站重定向?谢谢
    • @AlexBauer 感谢您的评论和链接。其实我不太关心applebot,但我想让我们的应用程序符合谷歌应用程序索引(developers.google.com/app-indexing)。事实是,我正在为实现这一目标而发疯。通用链接、自定义 url、应用索引、标记网页内容之间的混淆每天都在增加:-/
    • @MarcoZanetti 在 Branch.io,我们刚刚开始通过自动生成的内容映射支持 app indexing。可能值得一看?
    • 这是一个很好的答案,谢谢。但是通过指定通配符“*”,应用程序将始终为每条路径启动。我希望仅当我们的内部参数“app_deeplinking=true”附加到 url 时才启动应用程序。目前,即使将 continueUserActivity 函数返回为 false,我也无法阻止应用程序启动。有什么想法吗?
    【解决方案2】:

    在 iOS 13 中,现在可以在定义通用链接 URL 时指定查询和片段值。遗憾的是,Apple 没有对此进行详细记录,但在 WWDC 2019 中提到了这一点:https://developer.apple.com/videos/play/wwdc2019/717/

    对于您只想匹配 https://www.mywebsite.com?parameter=something 的原始示例,您的 apple-app-site-association 文件应如下所示:

    {
      "applinks": {
        "apps": [],
        "details": [
          {
            "appID": "MYID",
            "components": [
              {
                "/" : "",
                "?": { "parameter": "something" }
              }
            ]
          }
        ]
      }
    }
    

    请注意,如果您想在 iOS 12 中继续支持通用链接,您仍然需要指定 paths 数组,如果您指定 components 数组,iOS 13 设备将忽略 paths 数组。

    【讨论】:

      【解决方案3】:

      对于附加到基本域(即https://www.mywebsite.com/pathOffOfTheBaseDomain?parameter=something)的路径关闭的查询参数,请使用:

      {
        "applinks": {
          "apps": [],
          "details": [
            {
              "appID": "TEAMID.BUNDLEID",
              "paths":[ "/pathOffOfTheBaseDomain" ]
            }
          ]
        }
      }
      

      根据Apple Universal Link documentation

      Note that only the path component of the URL is used for comparison. Other components, such as the query string or fragment identifier, are ignored.

      完整的 URL 将成熟并准备好在 AppDelegate 的 continueUserActivity 方法中解析。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-04-03
        • 2021-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多