Deep linking unificado para iOS
Visão geral: Unified deep linking (UDL) permite enviar usuários novos e existentes para uma atividade in-app específica (por exemplo, uma determinada página no aplicativo) assim que o aplicativo for aberto.
Proteção de privacidade do UDL
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.), eles retornam null.
Fluxo
O fluxo funciona da seguinte maneira:
- O usuário clica em um link do OneLink.
- Se o usuário tiver o aplicativo instalado, o esquema de links universais ou URI abrirá o aplicativo.
- Se o usuário não tiver o aplicativo instalado, ele será redirecionado para a loja de aplicativos e, após o download, o usuário abrirá o aplicativo.
- O aplicativo aberto aciona o SDK da AppsFlyer.
- O SDK da AppsFlyer executa a API UDL.
- A API UDL recupera dados do OneLink dos servidores AppsFlyer.
- The UDL API calls back the
didResolveDeepLink()
in theDeepLinkDelegate
. - The
didResolveDeepLink()
method gets aDeepLinkResult
object. - The
DeepLinkResult
object includes:- Status (Encontrado/Não encontrado/Falha)
- 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.
Planejamento
- O UDL requer o SDK iOS da AppsFlyer V6.1+.
Ao configurar o OneLink, o profissional de marketing usa parâmetros para criar os links e o desenvolvedor personaliza o comportamento do aplicativo com base nos valores recebidos. É responsabilidade do desenvolvedor garantir que os parâmetros sejam tratados corretamente no aplicativo, tanto para roteamento in-app quanto para personalizar dados no link.
Para planejar o OneLink:
- Obtenha do profissional de marketing o comportamento desejado e a experiência pessoal que um usuário obtém ao clicar na 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
Implementação
Let's save you some time >>
Set Deep Linking with our SDK integration wizard
Implemente a lógica da API UDL com base nos parâmetros e valores escolhidos.
- Assign the
AppDelegate
usingself
toAppsFlyerLib.shared().deepLinkDelegate
. - Implementar a função do aplicativo para permitir:
- Compatibilidade de links universais com
continue
. - Compatibilidade do esquema de URI com
handleOpen
.
- Compatibilidade de links universais com
- 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
Os links legados do OneLink são links que não contêm os parâmetros recomendados para Unified Deep Linking: deep_link_value
and deep_link_sub1-10
.
Geralmente são links que já existem no campo ao migrar de métodos legados para UDL.
Os usuários de notícias que usam links legados são manipulados por onConversionDataSuccess
no contexto de deferred deep linking estendidos.
UDL manipula deep linking para usuários existentes. É recomendável adicionar suporte no retorno de chamada UDL didResolveDeepLink
para parâmetros legados.
Exemplo de código Swift
Code example
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Replace 'appleAppID' and 'appsFlyerDevKey' with your Apple App ID (eg 69999999, without id prefix) and DevKey
// The App ID and the DevKey must be set prior to the calling of the deepLinkDelegate
AppsFlyerLib.shared().appleAppID = appleAppID
AppsFlyerLib.shared().appsFlyerDevKey = appsFlyerDevKey
...
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)")
}
}
⇲ Links do 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:
- Implement eDDL to allow UDL to handle the deferred deep linking
Testando deferred deep linking
Prerequisites
- Integração UDL completa.
- Registre seu dispositivo de teste.
- Ative o modo de depuração no aplicativo.
- Verifique se o aplicativo não está instalado no seu dispositivo.
- Peça ao seu profissional de marketing um template do OneLink.
- Será algo parecido com isso
https://onelink-basic-app.onelink.me/H5hv
. - Este exemplo usa o subdomínio OneLink
onelink-basic-app.onelink.me
e o ID do template do OneLinkH5hv
.
- Será algo parecido com isso
The test link
Você pode usar um link do OneLink existente ou pedir ao seu profissional de marketing para criar um novo para teste. Podem ser usadas URLs curtas e longas do OneLink.
Adicionando parâmetros ad hoc a um link existente
- Use apenas o domínio e o template do OneLink do seu link. Por exemplo:
https://onelink-basic-app.onelink.me/H5hv
. - Adicionar parâmetros do OneLink
deep_link_value
anddeep_link_sub1-10
conforme esperado pelo seu aplicativo. Os parâmetros devem ser adicionados como parâmetros de consulta.- Exemplo:
https://onelink-basic-app.onelink.me/H5hv?pid=my_media_source&deep_link_value=apples&deep_link_sub1=23
- Exemplo:
Perform the test
- Clique no link no seu dispositivo.
- O OneLink redireciona você de acordo com a configuração do link, para a App Store ou um site.
- Instale o aplicativo.
Importante
- Se o aplicativo ainda estiver em desenvolvimento e ainda não tiver sido carregado na loja, você verá esta imagem:
- Instale o aplicativo do Xcode.
- Se o aplicativo ainda estiver em desenvolvimento e ainda não tiver sido carregado na loja, você verá esta imagem:
- O UDL detecta o deferred deep linking, corresponde a instalação ao clique e recupera os parâmetros do OneLink para o callback
didResolveDeepLink
.
Expected logs results
Os logs a seguir estão disponíveis apenas quando o modo de depuração está ativado.
- SDK inicializado:
[AppsFlyerSDK] [com.apple.main-thread] AppsFlyer SDK version 6.6.0 started build
- A API UDL começa:
D/AppsFlyer_6.9.0: [DDL] start
- UDL envia consulta para a AppsFlyer para consultar uma correspondência com esta instalação:
[AppsFlyerSDK] [com.appsflyer.serial] [DDL] URL: https://dlsdk.appsflyer.com/v1.0/ios/id1512793879?sdk_version=6.6&af_sig=efcecc2bc95a0862ceaa7b62fa8e98ae1e3e022XXXXXXXXXXXXXXXX
- UDL obteve uma resposta e chama o callback
didResolveDeepLink
comstatus=FOUND
e dados de link do 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":""}
Testando deep linking (Links Universais)
Prerequisites
- Integração UDL completa.
- Registre seu dispositivo de teste.
- Ative o modo de depuração no aplicativo.
- Verifique se o aplicativo já está instalado no seu dispositivo.
- Peça ao seu profissional de marketing um template do OneLink.
- Será algo parecido com isso
https://onelink-basic-app.onelink.me/H5hv
. - Este exemplo usa o subdomínio OneLink
onelink-basic-app.onelink.me
e o ID do template do OneLinkH5hv
- Será algo parecido com isso
- Configurar links universais.
Create the test link
Use o mesmo método do deferred deep linking.
Perform the test
- Clique no link no seu dispositivo.
- UDL detecta o Universal Link e recupera os parâmetros do OneLink para
didResolveDeepLink
.
Expected logs results
Os logs a seguir estão disponíveis apenas quando o modo de depuração está ativado.
- Se o link for um link curto do OneLink (por exemplo, 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; }
- chamadas UDL
didResolveDeepLink
comstatus=FOUND
e dados de link do 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}
Atualizado 12 dias atrás