we\'re trying to implement app indexing on iOS using the Apple Universal Links (I\'m looking at https://developer.apple.com/library/ios/documentation/General/Conceptual/AppS
In iOS 13, it's now possible to specify query and fragment values when defining universal link URLs. Sadly this isn't well documented by Apple, but it was mentioned in WWDC 2019: https://developer.apple.com/videos/play/wwdc2019/717/.
For your original example where you'd just like to match https://www.mywebsite.com?parameter=something
, your apple-app-site-association
file should look like:
{
"applinks": {
"apps": [],
"details": [
{
"appID": "MYID",
"components": [
{
"/" : "",
"?": { "parameter": "something" }
}
]
}
]
}
}
Note that you'll still need to specify a paths
array if you want to continue supporting universal links in iOS 12, and iOS 13 devices will ignore the paths
array if you specify a components
array.
NO, Currently #(inline-links) and ?(query-parmeter) not supported by Universal Links
. Apple not provided any format to support Inline-Links
& Query-Parmeter
in apple-app-site-association
file.
In order to do indexing to https://www.mywebsite.com?parameter=something, I'm using the following JSON file.
{
"applinks": {
"apps": [],
"details": [
{
"appID": "TEAMID.BUNDLEID",
"paths":[ "*" ]
}
]
}
}
If you want to limit the indexing only to some parameter for example query_parmeter1
and query_parmeter2
then you need to handle this in UIApplicationDelegate method [UIApplicationDelegate application: continueUserActivity: restorationHandler:]
something like this
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;
}
Swift:
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
}
Note: This trick won't prevent the app from opening when a link to the website is clicked. But you can check If URL meets your requirement or not if not then you can open your URL in the web browser again. Similar to Amazon App -
References - Handle query parameters in universal links
For query parameters appended to a path off of the base domain (i.e. https://www.mywebsite.com/pathOffOfTheBaseDomain?parameter=something) use:
{
"applinks": {
"apps": [],
"details": [
{
"appID": "TEAMID.BUNDLEID",
"paths":[ "/pathOffOfTheBaseDomain" ]
}
]
}
}
According to 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.
The full URL will be ripe and ready for parsing in AppDelegate's continueUserActivity
method.