Mensajería push

El SDK de Adobe Mobile y Adobe Mobile permiten enviar mensajes push a sus usuarios. El SDK también le permite informar fácilmente sobre los usuarios que han abierto la aplicación como resultado de hacer clic en un mensaje push.

IMPORTANTE

La información de este tema es una sugerencia para una posible implementación. Recomendamos encarecidamente que revise la documentación de iOS de Apple para determinar la mejor implementación para su aplicación. Su implementación debería determinarse por los marcos que está usando y las versiones de iOS a las que se dirigirá su aplicación.

Para utilizar la mensajería push necesita la versión 4.6 o posterior del SDK.

IMPORTANTE

No establezca de forma manual el Experience Cloud ID dentro de la aplicación. Esto provoca la creación de un nuevo usuario único que no recibirá mensajes push debido a su estado de inclusión. Por ejemplo, supongamos que un usuario que ha elegido recibir mensajes push inicia sesión en la aplicación. Después de iniciar sesión, si establece manualmente el ID dentro de la aplicación, se crea un nuevo usuario único que no ha elegido recibir mensajes push. Este nuevo usuario no recibirá ningún mensaje push.

Requisitos previos

IMPORTANTE

No está permitido migrar la aplicación a un nuevo grupo de informes. En caso de hacerlo, podría desajustarse la configuración de push y los mensajes no se enviarían.

Habilitar la mensajería push

  1. Compruebe que el archivo ADBMobileConfig.json contiene la configuración necesaria para la mensajería push.

    El objeto "marketingCloud" debe tener la propiedad "org" configurada para la mensajería push.

    "marketingCloud": { 
        "org": "3CE342C92046435B0A490D4C@AdobeOrg" 
    }
    
  2. Importe la biblioteca en su AppDelegate.

    #import "ADBMobile.h"
    
  3. Para determinar la configuración para la que la aplicación necesita solicitar permiso, consulte Configuración de notificaciones remotas.

    Aquí tiene un ejemplo de una posible implementación que está pidiendo permiso para usar Alertas, Distintivos, Sonidos y Notificación remota:

    // iOS 10 and newer 
    if (NSClassFromString(@"UNUserNotificationCenter")) { 
        UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];   
        [center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert + UNAuthorizationOptionSound + UNAuthorizationOptionBadge) 
            completionHandler:^(BOOL granted, NSError * _Nullable error) { 
            if (granted) { NSLog(@"authorization given"); } 
            else { NSLog(@"authorization rejected"); } 
            if (error) { NSLog(@"error during authorization: %@", error.localizedDescription); } 
        }]; 
        // have to ask for permission for remote notifications separately  
        [application registerForRemoteNotifications]; 
        // make this class the delegate for user notification handling  
        center.delegate = self; 
    } 
    // iOS 8.0 to iOS 9.3.5 
    else if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) { 
    #pragma GCC diagnostic push 
    #pragma GCC diagnostic ignored "-Wdeprecated-declarations" 
        UIUserNotificationTypetypes = UIUserNotificationTypeAlert | UIUserNotificationTypeBadge| UIUserNotificationTypeSound; 
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:types categories:nil]; 
        [application registerUserNotificationSettings:settings]; 
        // have to ask for permission for remote notifications separately  
        [application registerForRemoteNotifications]; 
    } 
    // older than iOS 8.0  
    else { 
        [application registerForRemoteNotificationTypes:UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge| UIRemoteNotificationTypeSound];  
    #pragma GCC diagnostic pop 
    }
    
  4. Se debe pasar el token push al SDK empleando el método setPushIdentifier: en la clase ADBMobile.

    - (void) application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { 
        ... 
        [ADBMobile setPushIdentifier:deviceToken]; 
        ... 
    }
    
  5. Para determinar la implementación correcta para su entorno, vaya a UserNotifications.

    Este paso le ayuda a habilitar los informes push pasando el diccionario de userInfo al SDK cuando el usuario abre la aplicación haciendo clic en un mensaje push.

    La siguiente muestra de código es un ejemplo de una posible implementación:

    // device running < iOS 7 
    - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { 
        // only send the hit if the app is inactive 
        if (application.applicationState == UIApplicationStateInactive) {  
            [ADBMobile trackPushMessageClickThrough:userInfo]; 
        } 
    } 
    // device running between iOS 7 and iOS 9.3.5 
    - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult)) completionHandler { 
        // only send the hit if the app is inactive 
        if (application.applicationState == UIApplicationStateInactive) { 
            // only run this code if the UNUserNotificationCenterclass is not available or its delegate is not set (pre iOS 10) 
            if (!NSClassFromString(@"UNUserNotificationCenter") || ![UNUserNotificationCenter currentNotificationCenter].delegate) {  
                [ADBMobiletrackPushMessageClickThrough:userInfo]; 
            } 
        } 
        completionHandler(UIBackgroundFetchResultNoData); 
    } 
    // device running >= iOS 10 
    - (void) userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler { 
        if ([response.notification.request.trigger isKindOfClass:UNPushNotificationTrigger.class]) { 
            [ADBMobile trackPushMessageClickThrough:response.notification.request.content.userInfo]; 
        } 
        completionHandler(); 
    }
    
  6. Para mantener con exactitud la audiencia de push estimada, notifique al SDK cuando un usuario deshabilite manualmente la mensajería push para su aplicación llamando a [ADBMobile setPushIdentifier: nil] en el método applicationDidBecomeActive: de su AppDelegate.

    // device running < iOS 7 
    - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { 
        // only send the hit if the app is inactive 
        if (application.applicationState == UIApplicationStateInactive) {  
            [ADBMobile trackPushMessageClickThrough:userInfo]; 
        } 
    } 
    // device running between iOS 7 and iOS 9.3.5 
    - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult)) completionHandler { 
        // only send the hit if the app is inactive 
        if (application.applicationState == UIApplicationStateInactive) { 
            // only run this code if the UNUserNotificationCenterclass is not available or its delegate is not set (pre iOS 10) 
            if (!NSClassFromString(@"UNUserNotificationCenter") || ![UNUserNotificationCenter currentNotificationCenter].delegate) {  
                [ADBMobiletrackPushMessageClickThrough:userInfo]; 
            } 
        } 
        completionHandler(UIBackgroundFetchResultNoData); 
    } 
    // device running >= iOS 10 
    - (void) userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler { 
        if ([response.notification.request.trigger isKindOfClass:UNPushNotificationTrigger.class]) { 
            [ADBMobile trackPushMessageClickThrough:response.notification.request.content.userInfo]; 
        } 
        completionHandler(); 
    }
    

Ejemplo

El siguiente es un ejemplo de implementación de AppDelegate.m:

#import "AppDelegate.h" 
#import "ADBMobile.h" 
 
@implementation AppDelegate 
  
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    if (NSClassFromString(@"UNUserNotificationCenter")) { 
        UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; 
        [center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert + UNAuthorizationOptionSound + UNAuthorizationOptionBadge) 
                              completionHandler:^(BOOL granted, NSError * _Nullable error) {  
            if (granted) { NSLog(@"authorization given"); } 
            else { NSLog(@"authorization rejected"); } 
            if (error) { NSLog(@"error during authorization: %@", error.localizedDescription); } 
        }]; 
        center.delegate = self; 
        [application registerForRemoteNotifications]; 
    } 
    else if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) { 
#pragma GCC diagnostic push 
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"  
        UIUserNotificationType types = UIUserNotificationTypeAlert | UIUserNotificationTypeBadge| UIUserNotificationTypeSound; 
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:types categories:nil]; 
        [application registerUserNotificationSettings:settings];  
        [application registerForRemoteNotifications]; 
    } 
    else { 
        [application registerForRemoteNotificationTypes:UIRemoteNotificationTypeAlert| UIRemoteNotificationTypeBadge| UIRemoteNotificationTypeSound]; 
#pragma GCC diagnostic pop 
    } 
 
    return YES; 
} 
 
- (void) applicationDidBecomeActive:(UIApplication *)application {  
    if (NSClassFromString(@"UNUserNotifcationCenter")) { 
        UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; 
        [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) { 
            if (settings.authorizationStatus != UNAuthorizationStatusAuthorized) {  
                [ADBMobile setPushIdentifier:nil]; 
            } 
        }]; 
    } 
#pragma GCC diagnostic push 
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"  
    else if ([application respondsToSelector:@selector(isRegisteredForRemoteNotifications)]) { 
        if (![application isRegisteredForRemoteNotifications]) {  
            [ADBMobile setPushIdentifier:nil]; 
        } 
    } 
    else if ([application enabledRemoteNotificationTypes] == UIRemoteNotificationTypeNone) { 
        [ADBMobile setPushIdentifier:nil]; 
    } 
#pragma GCC diagnostic pop 
} 
 
- (void) application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { 
    [ADBMobile setPushIdentifier:deviceToken]; 
} 
 
- (void) application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error { 
    [ADBMobile setPushIdentifier:nil]; 
} 
 
- (void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { 
    if (application.applicationState == UIApplicationStateInactive) {  
        [ADBMobile trackPushMessageClickThrough:userInfo];  
    } 
} 
 
- (void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { 
    if (application.applicationState == UIApplicationStateInactive) {  
        if (!NSClassFromString(@"UNUserNotificationCenter") || ![UNUserNotificationCenter currentNotificationCenter].delegate) {  
            [ADBMobile trackPushMessageClickThrough:userInfo]; 
        } 
    } 
 
    completionHandler(UIBackgroundFetchResultNoData); 
} 
 
- (void) userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler { 
    if ([response.notification.request.trigger isKindOfClass:UNPushNotificationTrigger.class]) { 
        [ADBMobile trackPushMessageClickThrough:response.notification.request.content.userInfo]; 
    } 
 
    completionHandler(); 
} 
 
@end

En esta página