Esta web ya no recibe mantenimiento. Por favor, visita documentation.indigitall.com para leer nuestra documentación actualizada.

SDK de iOS

guía avanzada para configurar el SDK de iOS

Indice

1. Propiedades configurables

En esta sección encontrarás una serie de funcionalidades más avanzadas y que requieren de un desarrollo más complejo. Aconsejamos que sea un desarrollador el encargado de esta configuración.

1.1. Activar las notificaciones geolocalizadas

El SDK de indigitall puede gestionar la localización del usuario. Esto te permite usar los filtros de localización en la pantalla de enviar campaña push (Campañas>Push>Nueva campaña push>Filtros>Filtros geográficos)


Location path on console

Una vez hayamos habilitado esta funcionalidad, el usuario final tendrá que dar su consentimiento al permiso de localización y habilitar los servicios de localización de su smartphone, para que la aplicación obtenga la ubicación exacta del usuario.


Añade las siguientes claves en el archivo Info.plist de la aplicación.


<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Can we always use your location?</string>

<key>NSLocationAlwaysUsageDescription</key>
<string>Can we always use your location?</string>

<key>NSLocationWhenInUseUsageDescription</key>
<string>Can we use your location when using the apps?</string>


Las claves NSLocationAlwaysUsageDescription, NSLocationWhenInUseUsageDescription y NSLocationAlwaysAndWhenInUseUsageDescription se pueden personalizar editando el contenido de la etiqueta .

Opciones que debes tener en cuenta

Hay dos modos de gestionar los permisos de localización:

  • Manual: Es la opción por defecto y es el desarrolador el encargado de gestionar los permisos de localización.
  • Automática: Es el SDK el que gestiona los permisos de localización.


A continuación te explicamos cómo configurar los permisos de localización en modo automático.


Hay que añadir el parámetro locationPermissionMode cuando se inicialice el SDK. Esto se hace mediante el siguiente extracto de código:


let config = INConfig(appKey: "<YOUR-APP-KEY>")
config.locationPermissionMode = .automatic
Indigitall.initialize(with: config, onIndigitallInitialized: nil, onErrorInitialized: nil);
INConfig *config;
config.appKey = @"<YOUR-APP-KEY>";
config.locationPermissionMode = PermissionModeAutomatic;
[Indigitall initializeWithConfig:config onIndigitallInitialized:nil onErrorInitialized:nil];

1.2. Asociar el dispositivo a un usuario

Puedes asociar tu propio ID a cada dispositivo. De esta forma te será más sencillo e intuitivo trabajar con nuestra herramienta. Por ejemplo:

  • Si tus usuarios se han identificado, podrías usar tu ID de usuario, o el email, o cualquier otro dato con el que estés acostumbrado a trabajar.
  • Si tus usuarios son anónimos porque no se han logado en la app, quizá dispongas de un sistema de métricas tipo Google Analytics o Commscore. Podrías usar el ID proporcionado por estas herramientas.


Para realizar esta asociación entre tu ID personalizado (externalId), y el identificador que maneja indigitall (deviceId), hay que invocar el método setExternalCode:


//Recuerda poner aquí tu código externo
Indigitall.setExternalCode("", onSuccess: { (device) in
        //DO SOMETHING
    }) { (error) in
        //LOG ERROR
    }
//Recuerda poner aquí tu código externo
[IndigitallObjc setExternalCodeWithCode:@"YOUR_EXTERNAL_ID" 
    success:^(INDevice *device) {
        //DO SOMETHING
    } failed:^(INError* error){
        //LOG ERROR
    }];


No te preocupes por nada. Tus IDs se cifran de forma irreversible en el propio teléfono y se mandan de forma segura a nuestros servidores. Ni siquiera el equipo de indigitall puede conocer esta información.

1.3. Filtro WiFi

Si se requiere recoger la información de la WiFi del usuario, además de la configuración del panel de Indigitall, deberás añadir en las opciones del proyecto, en Signing & Capabilities la opción Access WiFi Information:


Access WiFi Information


Y añadir el parámetro wifiFilterEnabled cuando se inicialice el SDK:


let config = INConfig(appKey: "<YOUR-APP-KEY>")
config.wifiFilterEnabled = true
Indigitall.initialize(with: config, onIndigitallInitialized: nil, onErrorInitialized: nil);
INConfig *config;
config.appKey = @"<YOUR-APP-KEY>";
config.wifiFilterEnabled = true
[Indigitall initializeWithConfig:config onIndigitallInitialized:nil onErrorInitialized:nil];


  • El permiso de localización debe ser aceptado por el usuario

  • Tenga en cuenta que el tiempo de escaneo de la WiFi cuando la aplicación está en segundo plano o cerrada puede ser inexacto.

2. Callbacks que ofrece el SDK

Nuestro SDK ofrece diversos callbacks que te ayudan tener mayor control del flujo de ejecución y a implementar comportamientos personalizados.


Para suscribirte a estos callbacks tienes que:

  • Pasar las funciones como parámetros en la inicialización.


Indigitall.initialize(withAppKey: "<YOUR_APP_KEY>", onIndigitallInitialized: { (permissions, device) in
        //DO SOMETHING
    }) { (error) in
        //LOG ERROR
    }
[Indigitall initializeWithAppKey:@"<YOUR_APP_KEY>" onIndigitallInitialized:^(NSArray<INPermissions *> * _Nonnull permissions, INDevice * _Nonnull device) {
         //DO SOMETHING
    } onErrorInitialized:^(INError * _Nonnull onError) {
        //LOG ERROR
    }];


1.4. Dominio personalizado

Si eres CLIENTE ENTERPRISE tienes que añadir este parámetro en la configuración para que la SDK apunte al entorno correcto:


let config = INConfig(appKey: "<YOUR-APP-KEY>")
config.domain = "YOUR_DEVICE_API_DOMAIN"
config.domainInApp = "YOUR_INAPP_API_DOMAIN"
config.domainInbox = "YOUR_INBOX_API_DOMAIN"
Indigitall.initialize(with: config, onIndigitallInitialized: nil, onErrorInitialized: nil);
INConfig *config = [[INConfig alloc]initWithAppKey:@"<YOUR-APP-KEY>"];
config.domain = "YOUR_DEVICE_API_DOMAIN"
config.domainInApp = "YOUR_INAPP_API_DOMAIN"
config.domainInbox = "YOUR_INBOX_API_DOMAIN"
[Indigitall initializeWithConfig:config onIndigitallInitialized:nil onErrorInitialized:nil];


2.1. SDK inicializado

El método onIndigitallInitialized se ejecutará cuando el SDK termine de inicializarse y el dispositivo esté preparado para recibir notificaciones de indigitall.


Recibe como parámetro:

  • Un array de String. El primer elemento es el estado del permiso de notificaciones. El segundo elemento es el estado del permiso de localización.
  • Un objecto Device con la información asociada al dispositivo.


A continuación te mostramos un elemento que imprime logs sobre el estado de los permisos y la información del dispositivo.


Indigitall.initialize(appKey: "<YOUR_APP_KEY>", 
    onIndigitallInitialized: { (permission, device) in
        print("onIndigitallInitialized Push \(permissions[0].permissionType) permission: \(permissions[0].permissionStatus)")
        print("onIndigitallInitialized Location \(permissions[0].permissionType) permission: \(permissions[1].permissionStatus)")
        print("onIndigitallInitialized DEVICE: \(device.deviceID )")
    }, onErrorInitialized: { (error) in
        //LOG ERROR
    }
[Indigitall initializeWithAppKey:@"<YOUR_APP_KEY>" onIndigitallInitialized:^(NSArray<INPermissions *> * _Nonnull permissions, INDevice * _Nonnull device) {
        NSLog(@"onIndigitallInitialized Device: %@",device.deviceID);
        NSLog(@"onIndigitallInitialized Permission push: %u : %u", permissions[0].permissionType, permissions[0].permissionStatus );
        NSLog(@"onIndigitallInitialized Permission location: %u: %u",permissions[1].permissionType, permissions[1].permissionType)
    } onErrorInitialized:^(INError * _Nonnull onError) {
        //LOG ERROR
    }];

2.2. Nuevo dispositivo registrado

El método onNewUserRegistered se ejecutará cuando el dispositivo se le ha asignado el push token para recibir notificaciones, es decir, en la primera ejecución de la app tras ser instalada y al haber aceptado permisos. Éste va definido en el AppDelegate como callback de la llamada al setDeviceToken descrito anteriormente


Recibe como parámetro el objeto Device con la información asociada al dispositivo.


Indigitall.setDeviceToken(deviceToken) { (token) in
    print("NewUserRegistered: \(token)")
}
[Indigitall setDeviceToken:deviceToken onNewUserRegistered:^(INDevice * _Nonnull device) {
        NSLog(@"Device: %@",device);
    }];

2.3. Se ha producido un error

El método onErrorInitialized se ejecutará sólo si se produce un error durante la incialización del SDK.


Recibe como parámetro la descripción del error.


Indigitall.initialize(appKey: "<YOUR_APP_KEY>", 
    onIndigitallInitialized: { (permission, device) in
        //DO SOMETHING
    }, onErrorInitialized: { (error) in
        print("ERROR: \(error.message)")
    }
[Indigitall initializeWithAppKey:@"<YOUR_APP_KEY>" onIndigitallInitialized:^(NSArray<INPermissions *> * _Nonnull permissions, INDevice * _Nonnull device) {
        //DO SOMETHING    
     } onErrorInitialized:^(INError * _Nonnull onError) {
        NSLog(@"Error Initialized: %@",onError);
    }];

3. Administrar dispositivo

3.1. Consultar información y estado del dispositivo

Puedes usar el método getDevice para obtener la información que ha registrado el SDK en referencia al dispositivo.


El callback de este método recibirá como parámetro el objeto device que contiene toda la información asociada al dispositivo.


Indigitall.getDeviceWith(onSuccess: { (device) in
        print("Device: \(device.deviceID ?? "")\nStatus: \(device.enabled ?? false)")
    }, onError: { (error) in
        print("Error: \(error.message)")
    })
[Indigitall getDeviceWithOnSuccess:^(INDevice * _Nonnull device) {
        NSLog(@"DEVICE: %@ \nStatus: %d", device.deviceID, device.enabled);
    } onError:^(INError * _Nonnull error) {
        NSLog(@"ERROR: %@", error.message);
    }];

3.2. Habilitar / deshabilitar el dispositivo

Puedes elegir deshabilitar el dispositivo para bloquear la recepción de notificaciones. Es un método muy útil para:

  • Implementar una pantalla de preferencias para que el usuario pueda habilitar / deshabilitar la recepción de notificaciones.
  • Evitar la recepción de notificaciones si el usuario no se ha logado, o no ha aceptado los términos de uso, etc.
  • Gestionar la Lista Robinson.


Para ello, dispones de los métodos enableDevice y disableDevice.


El callback de estos métodos recibirá como parámetro el objeto device que contiene toda la información asociada al dispositivo.


Indigitall.enableDeviceWith(onSuccess: { (device) in
        print("Device: \(device.deviceID ?? "")\nStatus: \(device.enabled ?? false)")
    }, onError: { (error) in
        print("Error: \(error.message)")
    })

Indigitall.disableDeviceWith(onSuccess: { (device) in
        print("Device: \(device.deviceID ?? "")\nStatus: \(device.enabled ?? false)")
    }) { (error) in
        print("Error: \(error.message)")
    }
[Indigitall enableDeviceWithOnSuccess:^(INDevice * _Nonnull device) {
        NSLog(@"Device: %@ \nStatus: %d",device.deviceID,device.enabled);
    } onError:^(INError * _Nonnull error) {
        NSLog(@"ERROR: %@", error.message);
    }];

[Indigitall disableDeviceWithOnSuccess:^(INDevice * _Nonnull device) {
        NSLog(@"Device: %@ \nStatus: %d",device.deviceID,device.enabled);
    } onError:^(INError * _Nonnull error) {
        NSLog(@"ERROR: %@", error.message);
    }];

4. Grupos de interés

Nuestro SDK te permite clasificar a los usuarios en diferentes grupos personalizables. Esto es muy útil para:

  • Implementar una pantalla de preferencias para que el usuario pueda elegir los temas para los que quiere recibir notificaciones.
  • Etiquetar según la navegación o acciones que realice el usuario.
  • Segmentar las comunicaciones según si el usuario se ha identificado o es anónimo.
  • Segmentar en base al idioma, cultura, categoría de cliente, o en base a cualquier otro criterio que necesites.


Recuerda que primero debes definir los grupos con los que quieres trabajar en la consola de indigitall (Herramientas > Grupos de interés). Consulta nuestro manual de usuario para más info.

4.1. Listar grupos

Usa el método topicsList para obtener la lista de grupos que están configurados en tu proyecto de indigitall. El callback de este método recibe como parámetro un array de INTopics, que contiene la información de todos los grupos disponibles, además de un flag que indica si el usuario está incluido en alguno de ellos.


Indigitall.topicsListWith(onSuccess: { (topics) in
        print("TOPICS: \(topics)")
    }) { (error) in
        print("Error: \(error.message)")   
    }
[Indigitall topicsListWithOnSuccess:^(NSArray<INTopic *> * _Nonnull topics) {
        NSLog(@"TOPICS: %@",topics);
    } onError:^(INError * _Nonnull error) {
        NSLog(@"ERROR: %@", error.message);
    }];

4.2. Gestionar suscripción

Para gestionar la suscripción del dispositivo a uno o varios grupos, existen dos métodos: subscribe y unsubscribe.

Opcionalmente ambos reciben un objeto TopicsCallback como tercer parámetro, que devolverá el listado de todos los Topic del proyecto.


Indigitall.topicsSubscribe(withTopic: [Topic.code, Topic.code], onSuccess: { (topics) in
        self?.topics = topics
    }) { (error) in
        print(error.message)
    }

Indigitall.topicsUnSubscribe(withTopic: [Topic.code, Topic.code], onSuccess: { (topics) in
        self?.topics = topics
    }) { (error) in
        print(error.message)
    }
[Indigitall topicsSubscribeWithTopic:@[Topic[0], Topic[1]] onSuccess:^(NSArray<INTopic *> * _Nonnull topics) {
        topics = topics.self;
    } onError:^(INError * _Nonnull error) {
        NSLog(@"ERROR: %@", error.message);
    }];
[Indigitall topicsUnSubscribeWithTopic:@[Topic[0], Topic[1]] onSuccess:^(NSArray<INTopic *> * _Nonnull topics) {
        topics = topics.self;
    } onError:^(INError * _Nonnull error) {
        NSLog(@"ERROR: %@", error.message);
    }];

5. Enviar eventos personalizados

Tu app puede mandar información a los servidores de indigitall para identificar las acciones y eventos que suceden en ella. Esto te permite automatizar acciones de retargeting.


Para registrar estos eventos hay que llamar al método sendCustomEvent, pasando como parámetro un ID descriptivo (puedes inventarte el que más te guste) y añadir los datos que necesites.


Indigitall.sendCustomEvent("YOUR_CUSTOM_EVENT", customData: []) {
    //Do something in success function
} onError: { (error) in
    //ERROR DO SOMETHING
}
[Indigitall sendCustomEvent:@"YOUR_CUSTOM_EVENT" customData:@[] onSuccess:^{
// Do something in success function
} onError:^(INError * _Nonnull error) {
//ERROR DO SOMETHING
}];

6. Mensajes In-App

Si quieres integrar los mensajes In-App en tu aplicación, puedes hacerlo con varios formatos complementarios:

  • Banner. Contenido estático que está siempre visible, pero permite al usuario seguir utilizando la aplicación.
  • Popup. Contenido a pantalla completa que obliga al usuario a pulsar o descartar la información.

6.1. Formato banner

A continuación te contamos como instanciar uno o varios mensajes In-App en formato banner.

Recuerda que primero deberías tenerlos definidos en la consola de indigitall. Consulta nuestro manual de usuario para más info.

6.1.1. Un único banner

Crea una vista de UIView en tu storyboard. El tamaño debe coincidir con el que hayas definido en la consola de indigitall (Herramientas > Esquemas In-App/In-Web). Recuerda traducir las unidades de PX a iOS points.

@IBOutlet weak var myBanner: UIView!
@property (weak, nonatomic) IBOutlet UIView *myBanner;


Instancia los mensajes In-App usando el método showInApp.


Indigitall.show(inApp: "myBanner_CODE", view: myBanner) { actions in
    print("Did touch with actions")
} onShowTimeFinished: { inApp, showTime) in
    //DO SOMETHING
} didExpired: { inApp, error in
    //DO SOMETHING
} didShowMoreThanOnce: { inApp, error in
    //DO SOMETHING
} didClickOut: { inApp, error in
    //DO SOMETHING
} success: { inApp in
    //DO SOMETHING
} failed: { error in
    // LOG ERROR
}

[Indigitall showInApp:myBanner_CODE view:myBanner didTouch:(INInAppAction *action^{
    // DO SOMETHING    
} onShowTimeFinished:^(INInApp * _Nonnull inApp, int showTime) {
    // DO SOMETHING    
} didExpired:^(INInApp * _Nonnull inApp, INError * _Nonnull error) {
    // DO SOMETHING    
} didShowMoreThanOnce:^(INInApp * _Nonnull inApp, INError * _Nonnull error) {
    // DO SOMETHING    
} didClickOut:^(INInApp * _Nonnull inApp, INError * _Nonnull error) {
    // DO SOMETHING    
} success:^(INInApp * _Nonnull) {
    // DO SOMETHING    
} failed:^(INError * _Nonnull error) {
    // LOG ERROR
}];

6.1.2. Mútiples banner

Crea varias vistas de UIView en tu storyboard. El tamaño debe coincidir con el que hayas definido en la consola de indigitall (Herramientas > Esquemas In-App/In-Web). Recuerda traducir las unidades de PX a iOS points.


    @IBOutlet weak var viewBanner: UIView!
    @IBOutlet weak var viewBannerTwo: UIView!
    @IBOutlet weak var viewBannerThree: UIView!
    ...
    @property (weak, nonatomic) IBOutlet UIView *viewBanner;
    @property (weak, nonatomic) IBOutlet UIView *viewBannerTwo;
    @property (weak, nonatomic) IBOutlet UIView *viewBannerThree;
    ...


Crea un array de las vistas y de los códigos de los inApp que defines en la consola e instancia los mensajes In-App usando el método showMultipleInApp.


    var viewList = [UIView]()
    viewList.append(viewBanner)
    viewList.append(viewBannerTwo)
    viewList.append(viewBannerThree)

    var webViewCodes = [String]()
    webViewCodes.append("myInApp_code_banner")
    webViewCodes.append("myInApp_code_banner_two")
    webViewCodes.append("myInApp_code_banner_three")

Indigitall.showMultiple(inApp: webViewCodes, listView: viewList) { inApp, view, action in
        print("INAPP didTouch: \(inApp.inAppId) y vista: \(view)")
    } onShowTimeFinished: { (inApp, view, showTime) in
        print("INAPP onShowTimeFinished: \(inApp.inAppId) y vista: \(view) en \(showTime)ms")
        view.isHidden = true
    } didExpired: { inApp, error in
        print("INAPP didExpired: \(inApp.inAppId) error: \(error.message)")
    } didShowMoreThanOnce: { inApp, error in
        print("INAPP didShowMoreThanOnce: \(inApp.inAppId) error: \(error.message)")
    } didClickOut: { inApp, error in
        print("INAPP didClickOut: \(inApp.inAppId) error: \(error.message)")
    } success: { inApp, view in
        print("INAPP success: \(inApp.inAppId) y vista: \(view)")
    } failed: { error in
        print("ERROR: \(error.message)")
    }
   NSMutableArray <UIView *> *viewList;
    [viewList addObject:yourCustomView];
    [viewList addObject:yourCustomViewTwo];
    [viewList addObject:yourCustomViewThree];

    NSMutableArray <NSString *> *webViewCodes;
    [webViewCodes addObject:@"myInApp_code_banner"];
    [webViewCodes addObject:@"myInApp_code_banner_two"];
    [webViewCodes addObject:@"myInApp_code_banner_three"]; 

    [Indigitall showMultipleInApp:webViewCodes listView:viewList didTouch:^(INInApp * _Nonnull inApp, UIView * _Nonnull webView, INInAppAction *action) {
        // DO SOMETHING
    } onShowTimeFinished:^(INInApp * _Nonnull inApp, UIView * _Nonnull webView, int showtime) {
        // DO SOMETHING
    } didExpired:^(INInApp * _Nonnull inApp, INError * _Nonnull error) {
        // DO SOMETHING
    } didShowMoreThanOnce:^(INInApp * _Nonnull inApp, INError * _Nonnull error) {
        // DO SOMETHING
    } didClickOut:^(INInApp * _Nonnull inApp, INError * _Nonnull error) {
        // DO SOMETHING
    } success:^(INInApp * _Nonnull inapp, UIView * _Nonnull view) {
        // DO SOMETHING
    } failed:^(INError * _Nonnull error) {
        // LOG ERROR
    }];
}];

6.2. Formato Popup

A continuación te contamos como instanciar un mensaje In-App en formato popup.

Recuerda que primero deberías tenerlo definido en la consola de indigitall. Consulta nuestro manual de usuario para más info.


Crea una vista de WebView en tus layouts. El tamaño debe coincidir con el que hayas definido en la consola de indigitall (Herramientas > Esquemas In-App/In-Web). Recuerda traducir las unidades de PX a iOS points.


Indigitall.showPopup("myInApp_code_popup", didAppear: {
    // DO SOMETHING
} didCancel: {
    print("Did cancel")
} didTouchWithAction: {
    print("Did touch")
} didDismissed: {
    print("Did dissmised")
} onShowTimeFinished: { inApp, showTime in
    print("Did onShowtimeFinished \(inApp.inAppId) on \(showTime)ms")
} didExpired: { inApp, error in
    print("Did didExpired")
} didShowMoreThanOnce: { inApp, error in
    print("Did didShowMoreThanOnce")
} didClickOut: { inApp, error in
    print("Did didClickOut")
} didDismissForever: { inApp, error in
    print("Did didDismissForever")
} failed: {error in
    print("Did failed \(error.description) with message: \(error.message)")
} 
[Indigitall showPopup:@"myInApp_code_popup-Inapp" didAppear:^{
        // DO SOMETHING 
    } didCancel:^{
        // DO SOMETHING 
    } didTouchWithAction:^(INInAppAction *action){
        // DO SOMETHING 
    } didDismissed:^{
        // DO SOMETHING 
    } onShowTimeFinished:^(INInApp *inApp, int showTime){
        // DO SOMETHING 
    } didExpired:^(INInApp *inApp, INError *error){
        // DO SOMETHING 
    } didShowMoreThanOnce:^(INInApp *inApp, INError *error){
        // DO SOMETHING 
    } didClickOut:^(INInApp *inApp, INError *error){
        // DO SOMETHING 
    } didDismissForever:^(INInApp *inApp, INError *error){
        // DO SOMETHING 
    } failed:^(INError * _Nonnull error) {
       // LOG ERROR
    }];


Si quieres personalizar el icono de cerrar el Popup, puedes hacerlo con el siguiente método al que le podrás pasar un UIButton personalizado, si quisieras usar nuestro icono, bastaría con pasar un null. El parámetro closeIconDisabled es por si no quieres mostrar ningún icono, definiendo éste a true para ocultarlo o false para mostrarlo.


let closeButton = UIButton()
.
.//set UIButton params
.
Indigitall.showPopup("myInApp_code_popup-InApp", closeIcon: closeButton, closeIconDisabled: false) {
        print("Did appear")
    } didCancel: {
        print("Did cancel")
    } didTouchWithAction: { action in
        print("Did didTouchWithAction")
    } didDismissed: {
        print("Did dissmised")
    } onShowTimeFinished: { inApp, showTime in
        print("Did onShowtimeFinished \(inApp.inAppId) on \(showTime)ms")
    } didExpired: { inApp, error in
        print("Did didExpired")
    } didShowMoreThanOnce: { inApp, error in
        print("Did didShowMoreThanOnce")
    } didClickOut: { inApp, error in
        print("Did didClickOut")
    } didDismissForever: { inApp, error in
        print("Did didDismissForever")
    } failed: {error in
        print("Did failed \(error.description) with message: \(error.message)")
    }         
[Indigitall showPopup:@"myInApp_code_popup-InApp", closeIcon: closeButton, closeIconDisabled: false, didAppear:^{
        // DO SOMETHING 
    } didCancel:^{
        // DO SOMETHING 
    } didTouchWithAction:^(INInAppAction *action){
        // DO SOMETHING 
    } didDismissed:^{
        // DO SOMETHING 
    } onShowTimeFinished:^(INInApp *inApp, int showTime){
        // DO SOMETHING 
    } didExpired:^(INInApp *inApp, INError *error){
        // DO SOMETHING 
    } didShowMoreThanOnce:^(INInApp *inApp, INError *error){
        // DO SOMETHING 
    } didClickOut:^(INInApp *inApp, INError *error){
        // DO SOMETHING 
    } didDismissForever:^(INInApp *inApp, INError *error){
        // DO SOMETHING 
    } failed:^(INError * _Nonnull error) {
       // LOG ERROR
    }];

6.3. Utilidades del InApp

En el caso de que quieras mostrar el esquema InApp de diferente manera a como lo pinta nuestra SDK, ponemos a tu disposición unos métodos para que podáis customizar el "pintado", sin que se vean afectadas ni las estadísticas ni las funcionalidades del InApp.

Recogida del objeto InApp

InAppHandler.init().getInApp(inAppId) { content, inApp in
    //DO SOMETHING
} errorLoad: { error in
    //Show error
}
[[[InAppHandler alloc]init] getInApp:inAppId success:^(NSString *content, INInApp *inApp) {
    //DO SOMETHING
} errorLoad:^(INError *error) {
    //Show error
}];

Comprobación si debería mostrarse el InApp

Gracias a las funcionalidades de InApp, se puede indicar que el inApp se muestre o se pulse un número de veces máximo, o si en el caso del popUp, tras realizar una acción, como pulsar al botón cerrar, no se vuelva a mostrar. Para ello podríamos hacer lo siguiente dentro del método inAppGet que hemos visto anteriormente:

InAppHandler.init().getInApp(inAppId) { content, inApp in
    if (inApp.properties.dismissForever &&
        InAppUtils.is(inAppDismissForever: inApp)) {
        //Dismiss Forever
    } else {
        InAppUtils.inAppWasShownWith(in: inApp) { inApp, error in
            //did expired
        } didShowMoreThanOnce: { inApp, error in
            //show more than x times
        } didClickOut: { inApp, error in
            //click more than x times
        } onSuccess: {
            //show inApp
        }
    }
} errorLoad: { error in
    //Show error
}
[[[InAppHandler alloc]init] getInApp:inAppId success:^(NSString *content, INInApp *inApp) {
    if (inApp.properties.dismissForever &&
        [InAppUtils isInAppDismissForever:inApp]){
        //Dissmis Forever
    } else {
        [InAppUtils inAppWasShownWithInApp:inApp didExpired:^(INInApp * _Nonnull inApp, INError * _Nonnull error) {
            //did expired
        } didShowMoreThanOnce:^(INInApp * _Nonnull inApp, INError * _Nonnull error) {
            //show more than x times
        } didClickOut:^(INInApp * _Nonnull inApp, INError * _Nonnull error) {
            //click more than x times
        } onSuccess:^{
            //show inApp
        }];
    }
} errorLoad:^(INError *error) {
    //Show error
}];

Acciones para contabilizar clicks o para no mostrar InApp nunca más

Para el caso de lo que llamamos Dismiss Forever, una vez que se realiza la acción, se debe llamar a este método:

InAppUtils.addNewInApp(toDismissForever: inApp)
[InAppUtils addNewInAppToDismissForever: inApp];

Para mandar las estadísticas en el caso de que se haya pulsado sobre el inApp y controlar los clicks del inApp:

InAppUtils.inAppWasTappedWith(inApp)
[InAppUtils inAppWasTappedWithInApp: inApp];


7. Recogida de los datos de la push

En el caso de que quisieras obtener el objeto push de tipo json para realizar comprobaciones o acciones que tu aplicación requiera, te dejamos este código que ayudará a su obtención:



@available(iOS 10.0, *)
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
    Indigitall.handle(with: response ,withCompletionHandler: { (push, action) in
        print("Push object:", push)
        print("Push action app:", action.app)
    })
}

//@DEPRECATED
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
    print("Push notification received: \(userInfo)")
    let data = userInfo["data"]
    let push = INPush(data as! NSMutableDictionary)
    print("Push object : \(push)")

- (void) userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler{
    [Indigitall handleWithResponse:response withCompletionHandler:^(INPush * _Nonnull push, INPushAction * _Nonnull action) {
        NSLog(@"Push object: %@", push);
        NSLog(@"Push object app: %@", action.app);
    }];
}

//@DEPRECATED
- (void) application:(UIApplication *)application didReceiveRemoteNotification:(nonnull NSDictionary *)userInfo fetchCompletionHandler:(nonnull void (^)(UIBackgroundFetchResult))completionHandler{
    NSLog(@"Push notification received: %@", userInfo);
    NSMutableDictionary *data = userInfo[@"data"];
    INPush *push = [[INPush alloc]init:data];
    NSLog(@"Push object: %@",push);
}

7.1. Registrar estadísticas si se trata la acción de la Push.


Si se decide por tratar la acción de la Push de manera independiente sin pasar por nuestra SDK, una vez recogida la push como explicamos en el apartado anterior, en el método userNotificationCenter:didReceive del propio AppDelegate, para poder registrar las estadísticas hay que añadir el siguiente método:


Indigitall.registerStatistics(response)
[Indigitall registesStatistics: response];


8. Inbox

8.1. Configuración Inbox

En esta sección encontrarás una serie de funcionalidades más avanzadas y que requieren de un desarrollo más complejo. Aconsejamos que sea un desarrollador el encargado de esta configuración.

8.1.1. Identificación de usuarios

Para poder obtener las notificaciones del Inbox de Indigitall, el usuario debe identificarse. Primero hay que inicializar la SDK de Indigitall para que genere nuestro identificador (deviceId) y poder asociarlo al ID personalizado que asocies a dispositivo, similar a como se explica aquí.


Para realizar las tareas de registro, se usan estos dos métodos:


//Identificación de usuario
Indigitall.logIn(withId: "YOUR_ID", onSuccess: { (device) in
    //DO SOMETHING  
}) { (error) in
    //LOG ERROR
}

//Desconexión
Indigitall.logOut(success: { (device) in
    //DO SOMETHING  
}, onError: { (error) in
    //LOG ERROR    
})
//Identificación de usuario
[Indigitall logInWithId:"YOUR_ID" onSuccess:^(INDevice * _Nonnull device) {
    //DO SOMETHING
} onError:^(INError * _Nonnull error) {
    //LOG ERROR
}];

//Desconexión
[Indigitall logOutWithSuccess:^(INDevice * _Nonnull device) {
    //DO SOMETHING
} onError:^(INError * _Nonnull error) {
    //LOG ERROR
}];

8.1.2. Generar token de autentificación

En esta sección verás cómo se genera un token de validación para una aplicación que tenga configurado una autentificación con webhook. Para generar dicho token, se necesita añadir el JSON con la configuración.


El token tiene una fecha predeterminada de caducidad, una vez caducado en nuestro sistema, se lanzará un evento de tipo 'Protocol', que indicará dicha caducidad y tendrá que devolvernos el JSON de configuración. Para recoger el evento, hay que implementarlo en la clase correspondiente, y sobreescribir el siguiente método:


class YOURCLASS: GetAuthConfig

func getAuthConfig() -> [AnyHashable : Any] {
        ...
        return YOUR_JSON
    }
@interface YOURCLASS: NSObject<GetAuthConfig>

- (NSDictionary *) getAuthConfig;

8.2. Funcionalidades principales del Inbox

Una vez hecho el registro del dispositivo correctamente, se puede empezar a realizar las peticiones del Inbox. Hay que tener en cuenta las siguientes características del Inbox, que opcionalmente son configurables.

8.2.1. Propiedades del Inbox

Las notificaciones del Inbox tendrán los siguiente estados de la clase InboxStatus:

  • Sent o enviado: la notificación se ha enviado al cliente, la ha podido leer o no.
  • Click: han pulsado sobre la notificación mostrada en el Inbox.
  • Delete o borrado: se ha borrado por parte del cliente la notificación del Inbox.

Las notificaciones también vendrán con un estado leído o 'read', para ayudar a diferenciar dichos estados.

Cada notificación vendrá asignada con un sendingId entero y único, para poder diferenciarlos y usarlos para algunas de las funcionalidades.

8.2.2. Obtener las notificaciones

Como se ha explicado anteriormente, para obtener las notificaciones se usa el siguiente método:


Inbox.getInboxWithSuccess({ (inbox) in
  //DO SOMETHING
}) { (error) in
   //LOG ERROR
}
[Inbox getInboxWithSuccess:^(INInbox * _Nonnull inbox) {
    //DO SOMETHING
} onError:^(INError * _Nonnull error) {
    //LOG ERROR
}];
8.2.2.1 Siguiente página

Una vez obtenida la instancia Inbox, la usaremos para pedir la siguiente página, que se realizada con el siguiente método, en el caso de que no haya más páginas te lo indicará en el error con el códigoo 410:


inbox.getNextPage(success: { (inbox, newNotifications) in
    //DO SOMETHING
}) { (error) in
    if (error.statusCode == 410){
        //LOG NO HAY MÁS PÁGINAS
    }else{
        //LOG ERROR
    }
}
[inbox getNextPageWithSuccess:^(INInbox * _Nonnull inbox, NSArray<INInboxNotification *>* newNotifications) {
    //DO SOMETHING
} onError:^(INError * _Nonnull error) {
    if (error.statusCode == 410){
        //LOG NO HAY MÁS PÁGINAS
    }
    //LOG ERROR
}];


Ten en cuenta que el callback del Inbox a parte de devolver el Inbox actualizado, devuelve un array que se llama newNotifications, en el que se irán las nuevas notificaciones que añadir al Inbox, para que, en caso de ser necesario, poder utilizar dicho array para moverte entre las páginas sin depender de las llamadas al Inbox.

8.2.3. Obtener la información de una notificación

Para obtener la información de una notificación en particular, hay que hacer la siguiente llamada con el sendingId de cada notificación:


inbox.getInfoFromNotification(withSendingId: SENDING_ID, onSuccess: { (inboxnotification) in
    //DO SOMETHING        
}) { (error) in
    //LOG ERROR
}
[inbox getInfoFromNotificationWithSendingId:SENDING_ID onSuccess:^(INInboxNotification * _Nonnull inboxNotification) {
    //DO SOMETHING    
} onError:^(INError * _Nonnull error) {
    //LOG ERROR
}];

8.2.4. Editar el estado de una o más notificaciones

Para editar el estado de una o más notificaciones a la vez, se realiza con el siguiente método en el que se deben indicar los sendingIds de las notificaciones a editar y el estado al que se quiere cambiar:

//Modificar una notificación
inbox.modifyStatusFromNotification(withSendingId: SENDING_ID, status: STATUS, onSuccess: { (inboxnotification) in
    //DO SOMETHING  
}) { (error) in
    //LOG ERROR
}

//Modificar masivamente
inbox.massiveEditNotifications(withSendingIdsList: [SENDING_IDS], status: STATUS, onSuccess: {
    //DO SOMETHING
}) { (error) in
    //LOG ERROR
}
//Modificar una notificación
[inbox modifyStatusFromNotificationWithSendingId:SENDING_ID status:STATUS onSuccess:^(INInboxNotification * _Nonnull inboxNotification) {
  //DO SOMETHING      
} onError:^(INError * _Nonnull error) {
    //LOG ERROR
}];

//Modificar masivamente
[inbox massiveEditNotificationsWithSendingIdsList:[SENDING_IDS] status:STATUS onSuccess:^{
   //DO SOMETHING 
} onError:^(INError * _Nonnull error) {
   //LOG ERROR 
}];

8.2.5. Contadores de estado de las notificaciones

Para saber el número de notificaciones que hay en el Inbox según su estado, se reliza este método:

Inbox.getMessagesCount(success:  { (counter) in
   //DO SOMETHING  
}) { (error) in
    //LOG ERROR
}
 [Inbox getMessagesCountWithSuccess:^(INInboxCounters * _Nonnull counters) {
    //DO SOMETHING 
} onError:^(INError * _Nonnull error) {
    //LOG ERROR
}];


9. Changelog

[4.15.1] - 03/2022

Correciones

  • Mejorar el rendimiento de las llamadas a la API

[4.15.0] - 03/2022

Añadidos

  • Publicar en SPM

[4.14.0] - 03/2022

Añadidos

  • Callback inApp Touch with actions en inApp

[4.13.6] - 03/2022

Correcciones

  • Utils para poder mostrar el inApp y controlar sus acciones

[4.13.5] - 03/2022

Correcciones

  • Escala del Popup por cambios en iOS

[4.13.4] - 01/2022

Correcciones

  • Corregir llamada Customer updates

[4.13.3] - 01/2022

Correcciones

  • Mandar SendingId siempre en las llamadas

[4.13.2] - 01/2022

Correcciones

  • Añadir un utils para mandar evento de InApp

[4.13.1] - 01/2022

Correcciones

  • Hacer visibles todas las cabeceras .h

[4.13.0] - 01/2022

Anadido

  • InApp Dismiss Forever
  • Utilidades del InApp (numberOfClicks, numberOfShows)
  • Event custom para iurny

[4.12.6] - 12/2021

Correcciones

  • Añadir campo platform en la petición PUT cuando push secure está activa

[4.12.5] - 12/2021

Correcciones

  • Corregir campo lastVersionId del inApp

[4.12.4] - 11/2021

Correcciones

  • Mensaje de error en caso de que el InApp esté vacío

[4.12.3] - 11/2021

Correcciones

  • Añadir campaignId en click de push

[4.12.2] - 11/2021

Correcciones

  • No ejecutar SDK en caso de recibir una notificación con la app en background

[4.12.1] - 11/2021

Correcciones

  • Ingesta de dispositivos con pushtoken

[4.12.0] - 10/2021

Añadido

  • Campo categoría en las notificaciones del Inbox

[4.11.4] - 10/2021

Correcciones

  • Device disabled

[4.11.3] - 10/2021

Correcciones

  • Guardar info device primer inicio

[4.11.2] - 10/2021

Correcciones

  • Device enabled/disabled

[4.11.1] - 10/2021

Correcciones

  • EndPoints del Customer Service

[4.11.0] - 10/2021

Añadido

  • Customer Service

[4.10.0] - 09/2021

Añadido

  • Contador de clicks en inApp

[4.9.3] - 09/2021

Correciones

  • modificar INInApp model

[4.9.2] - 07/2021

Correciones

  • Corregido model INInApp "number of shows"

[4.9.1] - 07/2021

Correciones

  • Corregido escala de Popup

[4.9.0] - 05/2021

Añadido

  • Nuevo método para enviar evento personalizados con datos

    Correciones

  • Recogida de datos de los dispositivos

[4.8.0] - 05/2021

Añadido

  • InApp se muestra
  • Ocultar inApp transcurrido un tiempo configurado en consola

[4.7.1] - 04/2021

Correciones

  • PopUp con bordes redondeados

[4.7.0] - 04/2021

Añadido

  • InApp mostrar el inApp un número de veces configurado por consola
  • Ocultar PopUp transcurrido un tiempo configurado en consola

[4.6.10] - 03/2021

Correciones

  • Mejorar los logs de las acciones de la push
  • Añadido método público para enviar las estadíticas
  • Corregida acción abrir wallet

[4.6.9] - 12/2020

Correciones

  • Actualizar UIWebView (Deprecado) por WKWebView

[4.6.8] - 12/2020

Correciones

  • Estabilidad en solicitudes
  • Acción compartir en iPad
  • Mostrar botones en notificaciones anteriores

[4.6.7] - 11/2020

Correcciones

  • Corregir si objetos de push vienen vacíos a través de la API.

[4.6.6] - 11/2020

Correcciones

  • Arreglar cierre de aplicación de petición wifi en background

[4.6.5] - 10/2020

Correcciones

  • Escalar popup y añadir callbacks

[4.6.4] - 10/2020

Correcciones

  • Corregir en caso de ExteralCode sea nulo

[4.6.3] - 09/2020

Correcciones

  • Escalar inapp

[4.6.2] - 09/2020

Correcciones

  • Callback de recogida de push.

[4.6.1] - 08/2020

Correcciones

  • Método logOut

[4.6.0] - 08/2020

Añadido

  • Push con datos cifrados

[4.5.2] - 07/2020

Correcciones

  • Callback onIndigitallInitialized sin token creado
  • Creación de token falso en caso de usar simulador

[4.5.1] - 06/2020

Correcciones

  • Refactorizar callbacks error en inbox

[4.5.0] - 06/2020

Añadido

  • Inbox

[4.4.0] - 06/2020

Añadido

  • Abrir archivos *.pkpass

[4.3.0] - 05/2020

Añadido

  • Filtro Wifi
  • Icono de cerrar Popup personalizable

[4.2.4] - 05/2020

Correcciones

  • Evento last visit

[4.2.3] - 04/2020

Correcciones

  • Escala de Popup

[4.2.2] - 03/2020

Correcciones

  • Recogida de datos de dispositivo

[4.2.1] - 03/2020

Correcciones

  • Tamaño Popup y tiempo de muestra

[4.2.0] - 03/2020

Añadido

  • Acciones InApp

Correcciones

  • Petición de localización

[4.1.0] - 03/2020

Añadido

  • Métodos UserCenterNotifification withResponse
  • IndigitallXamarin con arquitecturas de simulador

[4.0.4][4.0.5] - 02/2020

Correcciones

  • Crash si servidor caido
  • Estado background

[4.0.3] - 01/2020

Correcciones

  • Crash con subscripción de topics

[4.0.2] - 01/2020

Correcciones

  • Duplicado de peticiones POST device

[4.0.1] - 01/2020

Añadido

  • Librería indigitallXamarinLib

    Correcciones

  • Extensión de notificationes
  • Callback Initialized

[4.0.0] - 01/2020

Correcciones

  • Push en modo background
  • Configuración CircleCI

[3.1.5][3.1.6] - 11/2019

Correcciones

  • Configuración CircleCI

[3.1.4] - 11/2019

Correcciones

  • Actualizar versión Xcode
  • Configuración CircleCI

[3.1.2][3.1.3] - 10/2019

Correcciones

  • Configuración CircleCI

[3.1.1] - 09/2019

Correcciones

  • Actualziado versión Xcode
  • Añadir arquitecturas de simulador

[3.1.0] - 08/2019

Añadido

  • Método sendCustomEvent para enviar eventos personalizados