AppboyKit (también conocido como SDK Objective-C) ya no recibe soporte y ha sido sustituido por el SDK Swift. Ya no recibirá nuevas características, correcciones de errores, actualizaciones de seguridad ni soporte técnico; sin embargo, la mensajería y los análisis seguirán funcionando con normalidad. Para obtener más información, consulta Presentación del nuevo SDK Swift de Braze.
Vinculación en profundidad para iOS
Para obtener información introductoria sobre los vínculos profundos, consulta el artículo de nuestra Guía del usuario. Si quieres implementar vínculos en profundidad por primera vez en tu aplicación Braze, los pasos siguientes te ayudarán a empezar.
Paso 1: Registrar un esquema
Debes indicar un esquema personalizado en el archivo Info.plist
. La estructura de navegación está definida por una matriz de diccionarios. Cada uno de esos diccionarios contiene una matriz de cadenas.
Utiliza Xcode para editar tu archivo Info.plist
:
- Añade una nueva clave,
URL types
. Xcode lo convertirá automáticamente en una matriz que contiene un diccionario llamadoItem 0
. - Dentro de
Item 0
, añade una claveURL identifier
. Ajusta el valor a tu esquema personalizado. - Dentro de
Item 0
, añade una claveURL Schemes
. Será automáticamente una matriz que contendrá una cadenaItem 0
. - Configura
URL Schemes
»Item 0
a tu esquema personalizado.
Alternativamente, si deseas editar tu archivo Info.plist
directamente, puedes seguir esta especificación:
1
2
3
4
5
6
7
8
9
10
11
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string>{YOUR.SCHEME}</string>
<key>CFBundleURLSchemes</key>
<array>
<string>{YOUR.SCHEME}</string>
</array>
</dict>
</array>
Paso 2: Permitir el esquema personalizado (iOS 9+)
A partir de iOS 9, las aplicaciones deben tener una lista de esquemas personalizados que la aplicación puede abrir. Si intentas llamar a esquemas que están fuera de esta lista, el sistema registrará un error en los registros del dispositivo y el vínculo profundo no se abrirá. Un ejemplo de este error es el siguiente
1
<Warning>: -canOpenURL: failed for URL: "yourapp://deeplink" – error: "This app is not allowed to query for scheme yourapp"
Por ejemplo, si un mensaje dentro de la aplicación debe abrir la aplicación de Facebook al tocarlo, la aplicación tiene que tener el esquema personalizado de Facebook (fb
) en la lista de permitidos. De lo contrario, el sistema rechazará el deep link. Los vínculos profundos que dirigen a una página o vista dentro de tu propia aplicación siguen requiriendo que el esquema personalizado de tu aplicación aparezca en el sitio Info.plist
de tu aplicación.
Debes añadir todos los esquemas a los que la aplicación necesita vincularse en profundidad en una lista de permitidos en la página Info.plist
de tu aplicación con la clave LSApplicationQueriesSchemes
. Por ejemplo:
1
2
3
4
5
6
<key>LSApplicationQueriesSchemes</key>
<array>
<string>myapp</string>
<string>facebook</string>
<string>twitter</string>
</array>
Para más información, consulta la documentación de Apple sobre la tecla LSApplicationQueriesSchemes
.
Paso 3: Implementa un controlador
Tras activar tu aplicación, iOS llamará al método application:openURL:options:
. El argumento importante es el objeto NSURL.
1
2
3
4
5
6
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options {
NSString *path = [url path];
NSString *query = [url query];
// Here you should insert code to take some action based upon the path and query.
return YES;
}
1
2
3
4
5
6
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
let path = url.path
let query = url.query
// Here you should insert code to take some action based upon the path and query.
return true
}
Enlaces universales
Para utilizar los enlaces universales, asegúrate de haber añadido un dominio registrado a las capacidades de tu aplicación y de haber subido un archivo apple-app-site-association
. A continuación, implementa el método application:continueUserActivity:restorationHandler:
en tu AppDelegate
. Por ejemplo:
1
2
3
4
5
6
7
8
9
- (BOOL)application:(UIApplication *)application
continueUserActivity:(NSUserActivity *)userActivity
restorationHandler:(void (^)(NSArray *restorableObjects))restorationHandler {
if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
NSURL *url = userActivity.webpageURL;
// Handle url
}
return YES;
}
1
2
3
4
5
6
7
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
if (userActivity.activityType == NSUserActivityTypeBrowsingWeb) {
let url = userActivity.webpageURL
// Handle url
}
return true
}
Consulta Apple para más información.
La integración predeterminada del enlace universal no es compatible con las notificaciones push de Braze ni con los mensajes dentro de la aplicación. Consulta la personalización de enlaces para manejar enlaces universales dentro de tu aplicación. Alternativamente, recomendamos utilizar vínculos en profundidad basados en esquemas con notificaciones push y mensajes dentro de la aplicación.
Seguridad en el transporte de aplicaciones (ATS)
iOS 9 introdujo un cambio de última hora que afecta a las URL web incrustadas en mensajes dentro de la aplicación y notificaciones push.
Requisitos ATS
De la documentación de Apple: “App Transport Security” es una característica que mejora la seguridad de las conexiones entre una aplicación y los servicios Web. La característica consiste en requisitos de conexión predeterminados que se ajustan a las mejores prácticas para conexiones seguras. Las aplicaciones pueden anular este comportamiento predeterminado y desactivar la seguridad del transporte”.
El ATS se aplica por predeterminado en iOS 9+. Requiere que todas las conexiones utilicen HTTPS y estén encriptadas mediante TLS 1.2 con confidencialidad directa. Consulta los Requisitos para conectarse mediante ATS para obtener más información. Todas las imágenes servidas por Braze a dispositivos finales son gestionadas por una red de entrega de contenidos (“CDN”) que admite TLS 1.2 y es compatible con ATS.
A menos que se especifiquen como excepciones en la página Info.plist
de tu aplicación, las conexiones que no sigan estos requisitos fallarán con errores parecidos a éste:
1
2
CFNetwork SSLHandshake failed (-9801)
Error Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred, and a secure connection to the server cannot be made."
1
NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802)
El cumplimiento de la ATS se aplica a los enlaces abiertos dentro de la aplicación móvil (nuestro tratamiento predeterminado de los enlaces en los que se hace clic) y no se aplica a los sitios abiertos externamente a través de un navegador web.
Gestión de los requisitos ATS
Puedes manejar ATS de una de las tres formas siguientes:
Confirma que todos los enlaces cumplen la normativa ATS (recomendado)
Tu integración con Braze puede satisfacer los requisitos de ATS asegurándote de que cualquier enlace existente al que dirijas a los usuarios (mediante campañas de mensajería dentro de la aplicación y push) satisfaga los requisitos de ATS. Aunque hay formas de eludir las restricciones de la ATS, te recomendamos que compruebes que todas las URL enlazadas cumplen la ATS. Dado el creciente énfasis de Apple en la seguridad de las aplicaciones, no está garantizado que Apple admita los siguientes enfoques para permitir excepciones ATS.
Una herramienta SSL puede ayudarte a detectar problemas de seguridad del servidor Web. Esta prueba de servidor SSL de Qualys, Inc. proporciona una partida específica para el cumplimiento de Apple ATS 9 e iOS 9.
Desactiva parcialmente el ATS
Puedes permitir que un subconjunto de enlaces con determinados dominios o esquemas sean tratados como excepciones a las normas ATS. Tu integración Braze satisfará los requisitos de ATS si cada enlace que utilices en un canal de mensajería Braze es compatible con ATS o se gestiona mediante una excepción.
Para añadir un dominio como excepción del ATS, añade lo siguiente al archivo Info.plist
de tu aplicación:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
<key>NSExceptionDomains</key>
<dict>
<key>example.com</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<false/>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
</dict>
</dict>
Consulta el artículo de Apple sobre las claves de seguridad para el transporte de aplicaciones para obtener más información.
Desactiva por completo el ATS
Puedes desactivar ATS por completo. Ten en cuenta que no es una práctica recomendada, tanto por la pérdida de protecciones de seguridad como por la futura compatibilidad con iOS. Para desactivar ATS, inserta lo siguiente en el archivo Info.plist
de tu aplicación:
1
2
3
4
5
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
Consulta Enviar una aplicación con seguridad de transporte de aplicaciones para obtener más información sobre cómo depurar fallos de ATS.
Codificación URL
A partir del SDK v2.21.0 de Braze para iOS, el SDK codifica porcentualmente los enlaces para crear NSURL
válidos. Todos los caracteres de enlace que no estén permitidos en una URL correctamente formada, como los caracteres Unicode, se escaparán en porcentaje.
Para descodificar un enlace codificado, utiliza el método NSString
stringByRemovingPercentEncoding
. Ten en cuenta que también debes devolver YES
en ABKURLDelegate
y que es necesaria una llamada a la acción para desencadenar la manipulación de la URL por parte de la aplicación. Por ejemplo:
1
2
3
4
5
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary<NSString *, id> *)options {
NSString *urlString = url.absoluteString.stringByRemovingPercentEncoding;
// Handle urlString
return YES;
}
1
2
3
4
5
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
let urlString = url.absoluteString.removingPercentEncoding
// Handle urlString
return true
}
Personalización
Personalización predeterminada de WebView
La clase personalizable ABKModalWebViewController
muestra las URL web abiertas por el SDK, normalmente, cuando se selecciona “Abrir URL web dentro de la aplicación” para un vínculo profundo web.
Puedes declarar una categoría para la clase ABKModalWebViewController
, o modificarla directamente, para aplicar la personalización a la vista Web. Consulta el archivo .h y el archivo .m de la clase para obtener más detalles.
Personalización de la gestión de enlaces
El protocolo ABKURLDelegate
puede utilizarse para personalizar el tratamiento de las URL, como los vínculos profundos, las URL web y los vínculos universales. Para configurar el delegado durante la inicialización de Braze, pasa un objeto delegado a ABKURLDelegateKey
en la dirección appboyOptions
de startWithApiKey:inApplication:withAppboyOptions:
. A continuación, Braze llamará a la implementación de handleAppboyURL:fromChannel:withExtras:
de tu delegado antes de gestionar cualquier URI.
Ejemplo de integración: ABKURLDelegado
1
2
3
4
5
6
7
8
- (BOOL)handleAppboyURL:(NSURL *)url fromChannel:(ABKChannel)channel withExtras:(NSDictionary *)extras {
if ([[url.host lowercaseString] isEqualToString:@"MY-DOMAIN.com"]) {
// Custom handle link here
return YES;
}
// Let Braze handle links otherwise
return NO;
}
1
2
3
4
5
6
7
8
func handleAppboyURL(_ url: URL?, from channel: ABKChannel, withExtras extras: [AnyHashable : Any]?) -> Bool {
if (url.host == "MY-DOMAIN.com") {
// Custom handle link here
return true;
}
// Let Braze handle links otherwise
return false;
}
Para más información, consulta ABKURLDelegate.h
.
Casos de uso frecuentes
Vinculación en profundidad con la configuración de la aplicación
iOS puede llevar a los usuarios de tu aplicación a su página en la aplicación de configuración de iOS. Puedes aprovechar UIApplicationOpenSettingsURLString
para vincular en profundidad a los usuarios a la configuración desde las notificaciones push y los mensajes dentro de la aplicación.
- En primer lugar, asegúrate de que tu aplicación está configurada para enlaces profundos basados en esquemas o enlaces universales.
- Decide un URI para la vinculación en profundidad a la página de configuración (por ejemplo,
myapp://settings
ohttps://www.braze.com/settings
). - Si utilizas vínculos profundos personalizados basados en esquemas, añade el siguiente código a tu método
application:openURL:options:
:
1
2
3
4
5
6
7
8
9
10
- (BOOL)application:(UIApplication *)app
openURL:(NSURL *)url
options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
NSString *path = [url path];
if ([path isEqualToString:@"settings"]) {
NSURL *settingsURL = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
[[UIApplication sharedApplication] openURL:settingsURL];
}
return YES;
}
1
2
3
4
5
6
7
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
let path = url.path
if (path == "settings") {
UIApplication.shared.openURL(URL(string:UIApplicationOpenSettingsURLString)!)
}
return true
}