Deep linking unifié pour iOS
En bref : le deep linking unifié (DLU) vous permet d'envoyer les utilisateurs nouveaux et existants vers une activité spécifique dans l'app (par exemple, une page spécifique) dès son ouverture.
Protection de la vie privée DLU
For new users, the UDL method only returns parameters relevant to deferred deep linking:
deep_link_value
anddeep_link_sub1-10
. If you try to get any other parameters (media_source
,campaign
,af_sub1-5
etc.), ils renvoient null.
Exemple pas-à-pas
Flux
Le flux est le suivant :
- L'utilisateur clique sur un lien OneLink.
- Si l'utilisateur a installé l'app, les liens universels ou le schéma d'URI ouvre cette dernière.
- Si l'utilisateur n'a pas installé l'app, il est redirigé vers l'app store. L'utilisateur ouvre l'app après le téléchargement.
- L'ouverture de l'app déclenche le SDK AppsFlyer.
- Le SDK AppsFlyer exécute l'API de DLU.
- L'API de DLU récupère les données OneLink des serveurs AppsFlyer.
- The UDL API calls back the
didResolveDeepLink()
in theDeepLinkDelegate
. - The
didResolveDeepLink()
method gets aDeepLinkResult
object. - The
DeepLinkResult
object includes:- Statut (Trouvé/Non trouvé/Erreur)
- A
DeepLink
object that carries thedeep_link_value
anddeep_link_sub1-10
parameters that the developer uses to route the user to a specific in-app activity, which is the main goal of OneLink.
Conditions préalables
- Le DLU nécessite le SDK iOS AppsFlyer V6.1+.
Planification
Lors de la configuration des OneLink, le marketeur utilise les paramètres pour créer des deep links, et le développeur personnalise le comportement de l'app en fonction de la valeur reçue. Il incombe au développeur de vérifier que les paramètres sont traités correctement dans l'app, tant pour le routage in-app que pour la personnalisation des données dans le lien.
Pour planifier le OneLink :
- Demandez au marketeur le comportement souhaité et l'expérience personnelle qu'un utilisateur obtient en cliquant sur l'URL.
- Based on the desired behavior, plan the
deep_link_value
and other parameters that are needed to give the user the desired personal experience.- The
deep_link_value
is set by the marketer in the URL and used by the developer to redirect the user to a specific place inside the app. For example, if you have a fruit store and want to direct users to apples, the value ofdeep_link_value
can beapples
. - The
deep_link_sub1-10
parameters can also be added to the URL to help personalize the user experience. For example, to give a 10% discount, the value ofdeep_link_sub1
can be10
.
- The
Implémentation
Implémentez l'API de DLU en fonction des paramètres et valeurs choisis.
- Assign the
AppDelegate
usingself
toAppsFlyerLib.shared().deepLinkDelegate
. - Implémenter la fonction d'app pour permettre :
- Prise en charge des Liens universels avec
continue
. - Prise en charge des schémas d'URI avec
handleOpen
.
- Prise en charge des Liens universels avec
- Create
DeepLinkDelegate
as an extension ofAppDelegate
. - Add
application
functions to support Universal Links and URI schemes. - In
DeepLinkDelegate
, make sure you override the callback function,didResolveDeepLink()
.
didResolveDeepLink()
accepts aDeepLinkResult
object as an argument. - Use
DeepLinkResult.status
to query whether the deep linking match is found. - For when the status is an error, call
DeepLinkResult.error
and run your error flow. - For when the status is found, use
DeepLinkResult.deepLink
to retrieve theDeepLink
object.
TheDeepLink
object contains the deep linking information arranged in public variables to retrieve the values from well-known OneLink keys, for example,DeepLink.deeplinkValue
fordeep_link_value
. - Use
deepLinkObj.clickEvent["deep_link_sub1"]
to retrievedeep_link_sub1
. Do the same fordeep_link_sub2-10
parameters, changing the string value as required. - Once
deep_link_value
anddeep_link_sub1-10
are retrieved, pass them to an in-app router and use them to personalize the user experience.
Supporting legacy OneLink links
Les OneLink hérités sont des liens qui ne contiennent pas les paramètres recommandés pour le deep linking unifié : deep_link_value
and deep_link_sub1-10
.
En général, il s'agit de liens existants qui sont utilisés dans le champ lors de la migration des méthodes traditionnelles vers le DLU.
Les nouveaux utilisateurs utilisant des liens hérités sont pris en charge par onConversionDataSuccess
dans le contexte du deep linking différé étendu.
Le DLU gère le deep linking pour les utilisateurs existants. Dans ce cas, il est recommandé d'ajouter un support dans l'appel DLU didResolveDeepLink
pour les paramètres hérités.
Exemple de code Swift
Code example
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
...
AppsFlyerLib.shared().deepLinkDelegate = self
...
}
// For Swift version < 4.2 replace function signature with the commented out code
// func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool { // this line for Swift < 4.2
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
AppsFlyerLib.shared().continue(userActivity, restorationHandler: nil)
return true
}
// Open URI-scheme for iOS 9 and above
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
AppsFlyerLib.shared().handleOpen(url, options: options)
return true
}
extension AppDelegate: DeepLinkDelegate {
func didResolveDeepLink(_ result: DeepLinkResult) {
var fruitNameStr: String?
switch result.status {
case .notFound:
NSLog("[AFSDK] Deep link not found")
return
case .failure:
print("Error %@", result.error!)
return
case .found:
NSLog("[AFSDK] Deep link found")
}
guard let deepLinkObj:DeepLink = result.deepLink else {
NSLog("[AFSDK] Could not extract deep link object")
return
}
if deepLinkObj.clickEvent.keys.contains("deep_link_sub2") {
let ReferrerId:String = deepLinkObj.clickEvent["deep_link_sub2"] as! String
NSLog("[AFSDK] AppsFlyer: Referrer ID: \(ReferrerId)")
} else {
NSLog("[AFSDK] Could not extract referrerId")
}
let deepLinkStr:String = deepLinkObj.toString()
NSLog("[AFSDK] DeepLink data is: \(deepLinkStr)")
if( deepLinkObj.isDeferred == true) {
NSLog("[AFSDK] This is a deferred deep link")
}
else {
NSLog("[AFSDK] This is a direct deep link")
}
fruitNameStr = deepLinkObj.deeplinkValue
walkToSceneWithParams(fruitName: fruitNameStr!, deepLinkData: deepLinkObj.clickEvent)
}
}
// User logic
fileprivate func walkToSceneWithParams(deepLinkObj: DeepLink) {
let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
UIApplication.shared.windows.first?.rootViewController?.dismiss(animated: true, completion: nil)
guard let fruitNameStr = deepLinkObj.clickEvent["deep_link_value"] as? String else {
print("Could not extract query params from link")
return
}
let destVC = fruitNameStr + "_vc"
if let newVC = storyBoard.instantiateVC(withIdentifier: destVC) {
print("AppsFlyer routing to section: \(destVC)")
newVC.deepLinkData = deepLinkObj
UIApplication.shared.windows.first?.rootViewController?.present(newVC, animated: true, completion: nil)
} else {
print("AppsFlyer: could not find section: \(destVC)")
}
}
⇲ Liens Github : Swift
Deferred Deep Linking after network consent
In some cases the application might require consent from the user in order to connect to the network, in a dialog similar to this one:

In order to support deferred deep linking once the network consent is given we recommend:
- Deferring the SDK
start
once the consent is given. - Implement eDDL to allow UDL to handle the deferred deep linking
Test du deep linking différé
Before you begin
- Intégration complète du DLU.
- Enregistrer votre appareil de test.
- Activez le mode débogage dans l'app.
- Assurez-vous que l'app n'est pas installée sur votre appareil.
- Demandez un template OneLink à votre marketeur.
- Il ressemblera à ceci :
https://onelink-basic-app.onelink.me/H5hv
. - Cet exemple utilise le sous-domaine OneLink
onelink-basic-app.onelink.me
et l'ID du template OneLinkH5hv
.
- Il ressemblera à ceci :
The test link
Vous pouvez utiliser un lien OneLink existant ou demander à votre marketeur d'en créer un nouveau pour le tester. Des URL OneLink courtes et longues peuvent être utilisées.
Ajout des paramètres ad-hoc à un lien existant
- Utilisez uniquement le domaine et le template OneLink de votre lien. Par exemple :
https://onelink-basic-app.onelink.me/H5hv
. - Ajouter des paramètres OneLink
deep_link_value
anddeep_link_sub1-10
comme prévu par votre app. Les paramètres doivent être ajoutés en tant que paramètres de requête.- Exemple :
https://onelink-basic-app.onelink.me/H5hv?deep_link_value=apples&deep_link_sub1=23
- Exemple :
Perform the test
- Cliquez sur le lien de votre appareil.
- OneLink vous redirige en fonction de la configuration du lien, soit vers l'App Store, soit vers un site web.
- Installez l'app.
Important
- Si l'app est encore en cours de développement et qu'elle n'a pas encore été importée dans le store, vous verrez cette image s'afficher :
- Installez l'app à partir de Xcode.
- Si l'app est encore en cours de développement et qu'elle n'a pas encore été importée dans le store, vous verrez cette image s'afficher :
- Le DLU détecte le deep linking différé, fait correspondre l'installation au clic et récupère les paramètres OneLink pour
didResolveDeepLink
.
Expected logs results
Les journaux suivants sont disponibles uniquement lorsque le mode débogage est activé.
- SDK initialisé :
[AppsFlyerSDK] [com.apple.main-thread] AppsFlyer SDK version 6.6.0 started build
- L'API UDL démarre :
D/AppsFlyer_6.9.0: [DDL] start
- Le DLU envoie une requête à AppsFlyer pour rechercher une correspondance avec cette installation :
[AppsFlyerSDK] [com.appsflyer.serial] [DDL] URL: https://dlsdk.appsflyer.com/v1.0/ios/id1512793879?sdk_version=6.6&af_sig=efcecc2bc95a0862ceaa7b62fa8e98ae1e3e022XXXXXXXXXXXXXXXX
- Le DLU a obtenu une réponse et appelle
didResolveDeepLink
avecstatus=FOUND
et les données de lien OneLink :[AppsFlyerSDK] [com.appsflyer.serial] [DDL] Calling didResolveDeepLink with: {"af_sub4":"","click_http_referrer":"","af_sub1":"","click_event":{"af_sub4":"","click_http_referrer":"","af_sub1":"","af_sub3":"","deep_link_value":"peaches","campaign":"","match_type":"probabilistic","af_sub5":"","campaign_id":"","media_source":"","deep_link_sub1":"23","af_sub2":""},"af_sub3":"","deep_link_value":"peaches","campaign":"","match_type":"probabilistic","af_sub5":"","media_source":"","campaign_id":"","af_sub2":""}
Test du deep linking (liens universels)
Before you begin
- Intégration complète du DLU.
- Enregistrer votre appareil de test.
- Activez le mode débogage dans l'app.
- Assurez-vous que l'app est déjà installée sur votre appareil.
- Demandez un template OneLink à votre marketeur.
- Il ressemblera à ceci :
https://onelink-basic-app.onelink.me/H5hv
. - Cet exemple utilise le sous-domaine OneLink
onelink-basic-app.onelink.me
et l'ID du template OneLinkH5hv
- Il ressemblera à ceci :
- Configurez les liens universels.
Create the test link
Utilisez la même méthode que celle utilisée pour le deep linking différé.
Perform the test
- Cliquez sur le lien de votre appareil.
- Le DLU détecte le lien universel et récupère les paramètres OneLink pour le callback
didResolveDeepLink
.
Expected logs results
Les journaux suivants sont disponibles uniquement lorsque le mode débogage est activé.
- Si le lien est un lien court OneLink (ex. https://onelink-basic-app.onelink.me/H5hv/apples) :
[AppsFlyerSDK] [com.apple.main-thread] NSUserActivity `webpageURL`: https://onelink-basic-app.onelink.me/H5hv/apples [AppsFlyerSDK] [com.appsflyer.serial] UniversalLink/Deeplink found: https://onelink-basic-app.onelink.me/H5hv/apples [AppsFlyerSDK] [com.appsflyer.serial] Shortlink found. Executing: https://onelink.appsflyer.com/shortlink-sdk/v2/H5hv?id=apples ... [AppsFlyerSDK] [com.appsflyer.serial] [Shortlink] OneLink:{ c = test1; campaign = test1; "deep_link_sub1" = 23; "deep_link_value" = peaches; "is_retargeting" = true; "media_source" = SMS; pid = SMS; }
- Le DLU appelle
didResolveDeepLink
avecstatus=FOUND
et les données de lien OneLink :[AppsFlyerSDK] [com.appsflyer.serial] [DDL] Calling didResolveDeepLink with: {"af_sub4":null,"click_http_referrer":null,"af_sub1":null,"click_event":{"campaign":"test1","deep_link_sub1":"23","deep_link_value":"peaches","media_source":"SMS"},"af_sub3":null,"deep_link_value":"peaches","campaign":"test1","match_type":null,"af_sub5":null,"media_source":"SMS","campaign_id":null,"af_sub2":null}
Mis(e) à jour il y a 2 jours