web-dev-qa-db-ja.com

iOSユニバーサルリンクとGETパラメーター

Apple Universal Links(私が見ている https://developer.Apple.com/library/ios/documentation/)を使用してiOSにアプリのインデックスを実装しようとしています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=*" ]
      }
    ]
  }
}

あなたはそれがうまくいくと思いますか?ウェブサイトのルートディレクトリにファイルをアップロードするための認証を取得するのに時間がかかるため、まだテストできません。そのため、機能するかどうかを尋ねています。ファイルを1回だけアップロードしたいのですが、できる。

ありがとうございました

12
Marco Zanetti

[〜#〜] no [〜#〜]、現在#(inline-links)と?(query-parmeter)はUniversal Linksでサポートされていません。 Apple Inline-LinksファイルのQuery-ParmeterApple-app-site-associationをサポートする形式は提供されていません。

https://www.mywebsite.com?parameter=something へのインデックス作成を行うために、次のJSONファイルを使用しています。

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

インデックス作成をquery_parmeter1query_parmeter2などの一部のパラメーターのみに制限する場合は、UIApplicationDelegateメソッド[UIApplicationDelegate application: continueUserActivity: restorationHandler:]で次のように処理する必要があります。

Objective-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
}

注:このトリックは、Webサイトへのリンクがクリックされたときにアプリが開くのを妨げることはありません。ただし、URLが要件を満たしているかどうかを確認できます。満たされていない場合は、WebブラウザでURLを再度開くことができます。 Amazonアプリに似ています-

enter image description here

参照- ユニバーサルリンクでクエリパラメータを処理する

13

ベースドメインのパスoffに追加されたクエリパラメータの場合(つまり https://www.mywebsite.com/pathOffOfTheBaseDomain ?parameter = something )use:

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

Apple Universal Linkのドキュメント によると:

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メソッドで解析できるようになります。

3
Tom Howard

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配列を指定する必要があり、paths配列を指定すると、iOS13デバイスはcomponents配列を無視することに注意してください。

1
Jamie A