Procedure di aggiornamentoUpgrade procedures

Se nell'applicazione è già stata integrata una versione precedente dell'SDK, è necessario considerare i seguenti punti quando si aggiorna l'SDK.If you already have integrated an older version of Engagement into your application, you have to consider the following points when upgrading the SDK.

Per ogni nuova versione dell'SDK è necessario innanzitutto sostituire (rimuovere e importare nuovamente in Xcode) le cartelle EngagementSDK ed EngagementReach.For each new version of the SDK you must first replace (remove and re-import in xcode) the EngagementSDK and EngagementReach folders.

Dalla versione 3.0.0 alla 4.0.0From 3.0.0 to 4.0.0

XCode 8XCode 8

XCode 8 è un componente obbligatorio a partire dalla versione 4.0.0 dell'SDK.XCode 8 is mandatory starting from version 4.0.0 of the SDK.

Nota

Se si dipende davvero da XCode 7, è possibile usare iOS Engagement SDK v3.2.4.If you really depend on XCode 7 then you may use the iOS Engagement SDK v3.2.4. Esiste un bug noto nel modulo di copertura della versione precedente durante l'esecuzione su dispositivi iOS 10: le notifiche di sistema non vengono attivate.There is a known bug on the reach module of this previous version while running on iOS 10 devices: system notifications are not actioned. Per risolvere il problema è necessario implementare l'API deprecata application:didReceiveRemoteNotification: nel delegato dell'app come segue:To fix this you will have to implement the deprecated API application:didReceiveRemoteNotification: in your app delegate as follows:

- (void)application:(UIApplication*)application
didReceiveRemoteNotification:(NSDictionary*)userInfo
{
    [[EngagementAgent shared] applicationDidReceiveRemoteNotification:userInfo fetchCompletionHandler:nil];
}

Importante

Questa soluzione non è consigliata dal momento che tale comportamento può cambiare in qualsiasi aggiornamento della versione iOS imminente (anche minore), poiché questa API iOS è deprecata.We do not recommend this workaround as this behavior can change in any upcoming (even minor) iOS version upgrade because this iOS API is deprecated. È opportuno passare a XCode 8 il prima possibile.You should switch to XCode 8 as soon as possible.

Framework di UserNotificationsUserNotifications framework

È necessario aggiungere il framework di UserNotifications nelle fasi di compilazione.You need to add the UserNotifications framework in your Build Phases.

Nell'area di esplorazione dei progetti aprire il riquadro del progetto, quindi selezionare la destinazione corretta.in the project explorer, open your project pane and select the correct target. Aprire quindi la scheda "Build phases" e nel menu "Link Binary With Libraries" aggiungere il framework UserNotifications.framework, quindi impostare il link come OptionalThen, open the "Build phases" tab and in the "Link Binary With Libraries" menu, add framework UserNotifications.framework - set the link as Optional

Funzionalità di push dell'applicazioneApplication push capability

XCode 8 può ripristinare la funzionalità di push dell'app; controllarla attentamente nella scheda capability della finestra di destinazione selezionata.XCode 8 may reset your app push capability, please double check it in the capability tab of your selected target.

Aggiungere il nuovo codice di registrazione delle notifiche iOS 10Add the new iOS 10 notification registration code

Il frammento di codice precedente per registrare l'app per le notifiche funziona ancora, ma usa API deprecate pur essendo eseguito in iOS 10.The older code snippet to register the app to notifications still works but is using deprecated APIs while running on iOS 10.

Importare il framework User Notification :Import the User Notification framework:

    #import <UserNotifications/UserNotifications.h> 

Nel metodo application:didFinishLaunchingWithOptions del delegato dell'applicazione sostituire:In your application delegate application:didFinishLaunchingWithOptions method replace:

if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) {
    [application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert) categories:nil]];
    [application registerForRemoteNotifications];
}
else {

    [application registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
}

con:by :

    if (NSFoundationVersionNumber >= NSFoundationVersionNumber_iOS_8_0)
    {
        if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_9_x_Max)
        {
            [UNUserNotificationCenter.currentNotificationCenter requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert) completionHandler:^(BOOL granted, NSError * _Nullable error) {}];
        }else
        {
            [application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert)   categories:nil]];
        }
        [application registerForRemoteNotifications];
    }
    else
    {
        [application registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
    }

Risolvere i conflitti del delegato UNUserNotificationCenterResolve UNUserNotificationCenter delegate conflicts

Se né l'applicazione né una delle librerie di terze parti implementa il valore UNUserNotificationCenterDelegate, è possibile ignorare questa parte.If neither your application or one of your third party libraries implements a UNUserNotificationCenterDelegate then you can skip this part.

Un delegato UNUserNotificationCenter viene usato dall'SDK per monitorare il ciclo di vita delle notifiche di Engagement sui dispositivi che eseguono iOS 10 o versioni successive.A UNUserNotificationCenter delegate is used by the SDK to monitor the life cycle of Engagement notifications on devices running on iOS 10 or greater. L'SDK include un'implementazione specifica del protocollo UNUserNotificationCenterDelegate, ma può essere presente solo un delegato UNUserNotificationCenter per ogni applicazione.The SDK has its own implementation of the UNUserNotificationCenterDelegate protocol but there can be only one UNUserNotificationCenter delegate per application. Qualsiasi altro delegato aggiunto all'oggetto UNUserNotificationCenter sarà in conflitto con l'oggetto Engagement.Any other delegate added to the UNUserNotificationCenter object will conflict with the Engagement one. Se l'SDK rileva il delegato dell'utente o di terze parti, non userà l'implementazione specifica per consentire di risolvere i conflitti.If the SDK detects your or any other third party's delegate then it will not use its own implementation to give you a chance to resolve the conflicts. Sarà necessario aggiungere la logica di Engagement al delegato per risolvere i conflitti.You will have to add the Engagement logic to your own delegate in order to resolve the conflicts.

A questo scopo è possibile procedere in due modi:There are two ways to achieve this.

Proposta 1: inoltrare semplicemente le chiamate del delegato all'SDK:Proposal 1, simply by forwarding your delegate calls to the SDK:

#import <UIKit/UIKit.h>
#import "EngagementAgent.h"
#import <UserNotifications/UserNotifications.h>


@interface MyAppDelegate : NSObject <UIApplicationDelegate, UNUserNotificationCenterDelegate>
@end

@implementation MyAppDelegate

- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler
{
  // Your own logic.

  [[EngagementAgent shared] userNotificationCenterWillPresentNotification:notification withCompletionHandler:completionHandler]
}

- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)())completionHandler
{
  // Your own logic.

  [[EngagementAgent shared] userNotificationCenterDidReceiveNotificationResponse:response withCompletionHandler:completionHandler]
}
@end

Proposta 2: ereditare dalla classe AEUserNotificationHandlerOr proposal 2, by inheriting from the AEUserNotificationHandler class

#import "AEUserNotificationHandler.h"
#import "EngagementAgent.h"

@interface CustomUserNotificationHandler :AEUserNotificationHandler
@end

@implementation CustomUserNotificationHandler

- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler
{
  // Your own logic.

  [super userNotificationCenter:center willPresentNotification:notification withCompletionHandler:completionHandler];
}

- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse: UNNotificationResponse *)response withCompletionHandler:(void(^)())completionHandler
{
  // Your own logic.

  [super userNotificationCenter:center didReceiveNotificationResponse:response withCompletionHandler:completionHandler];
}

@end

Nota

È possibile determinare se una notifica proviene o meno da Engagement passando il suo dizionario userInfo al metodo della classe dell'agente isEngagementPushPayload:.You can determine whether a notification comes from Engagement or not by passing its userInfo dictionary to the Agent isEngagementPushPayload: class method.

Assicurarsi che il delegato dell'oggetto UNUserNotificationCenter sia impostato sul delegato nel metodo application:willFinishLaunchingWithOptions: o nel metodo application:didFinishLaunchingWithOptions: del delegato dell'applicazione.Make sure that the UNUserNotificationCenter object's delegate is set to your delegate within either the application:willFinishLaunchingWithOptions: or the application:didFinishLaunchingWithOptions: method of your application delegate. Se, ad esempio, è stata implementata la Proposta 1 precedente:For instance, if you implemented the above proposal 1:

  - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Any other code

    [UNUserNotificationCenter currentNotificationCenter].delegate = self;
    return YES;
  }

Dalla versione 2.0.0 alla 3.0.0From 2.0.0 to 3.0.0

Eliminazione del supporto per iOS 4.X.Dropped support for iOS 4.X. A partire da questa versione, la destinazione della distribuzione dell'applicazione deve essere almeno iOS 6.Starting from this version the deployment target of your application must be at least iOS 6.

Se si usa Reach nell'applicazione, è necessario aggiungere il valore remote-notification alla matrice UIBackgroundModes nel file Info.plist per ricevere notifiche remote.If you are using Reach in your application, you must add remote-notification value to the UIBackgroundModes array in your Info.plist file in order to receive remote notifications.

Il metodo application:didReceiveRemoteNotification: deve essere sostituito da application:didReceiveRemoteNotification:fetchCompletionHandler: nel delegato dell'applicazione.The method application:didReceiveRemoteNotification: needs to be replaced by application:didReceiveRemoteNotification:fetchCompletionHandler: in your application delegate.

"AEPushDelegate.h" è un'interfaccia deprecata ed è necessario rimuovere tutti i riferimenti."AEPushDelegate.h" is deprecated interface and you need to remove all references. Ciò include la rimozione di [[EngagementAgent shared] setPushDelegate:self] e dei metodi delegati dal delegato dell'applicazione:This includes removing [[EngagementAgent shared] setPushDelegate:self] and the delegate methods from your application delegate:

-(void)willRetrieveLaunchMessage;
-(void)didFailToRetrieveLaunchMessage;
-(void)didReceiveLaunchMessage:(AEPushMessage*)launchMessage;

Dalla versione 1.16.0 alla 2.0.0From 1.16.0 to 2.0.0

La sezione seguente illustra come eseguire la migrazione di un'integrazione dell'SDK dal servizio Capptain offerto da Capptain SAS a un'app basata su Azure Mobile Engagement.The following describes how to migrate an SDK integration from the Capptain service offered by Capptain SAS into an app powered by Azure Mobile Engagement. Se si esegue la migrazione da una versione precedente, visitare il sito Web di Capptain per eseguire prima la migrazione alla versione 1.16 e quindi applicare la procedura seguente.If you are migrating from an earlier version, please consult the Capptain web site to migrate to 1.16 first then apply the following procedure.

Importante

Capptain e Mobile Engagement sono servizi diversi e la procedura seguente illustra solo come eseguire la migrazione dell'app client.Capptain and Mobile Engagement are not the same services and the procedure given below only highlights how to migrate the client app. La migrazione dell'SDK nell'app NON comporta la migrazione dei dati dai server di Capptain ai server di Mobile EngagementMigrating the SDK in the app will NOT migrate your data from the Capptain servers to the Mobile Engagement servers

AgenteAgent

Il metodo registerApp: è stato sostituito dal nuovo metodo init:.The method registerApp: has been replaced by the new method init:. È necessario aggiornare il delegato dell'applicazione di conseguenza e usare la stringa di connessione:Your application delegate must be updated accordingly and use connection string:

        - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
        {
          [...]
          [EngagementAgent init:@"YOUR_CONNECTION_STRING"];
          [...]
        }

Se il rilevamento di SmartAd è stato rimosso dall'SDK, è sufficiente rimuovere tutte le istanze della classe AETrackModule .SmartAd tracking has been removed from SDK you just have to remove all instances of AETrackModule class

Modifiche del nome della classeClass Name Changes

Durante la procedura di rebranding, è necessario modificare alcuni nomi di classi/file.As part of the rebranding, there are couple of class/file names that need to be changed.

A tutte le classi con prefisso "CP" viene assegnato quello "AE".All classes prefixed with "CP" are renamed with "AE" prefix.

Esempio:Example:

  • CPModule.h viene rinominata come AEModule.h.CPModule.h is renamed to AEModule.h.

Tutte le classi con prefisso "Capptain" vengono rinominate con il prefisso "Engagement".All classes prefixed with "Capptain" are renamed with "Engagement" prefix.

Esempi:Examples:

  • La classe CapptainAgent viene rinominata come EngagementAgent.The class CapptainAgent is renamed to EngagementAgent.
  • La classe CapptainTableViewController viene rinominata come EngagementTableViewController.The class CapptainTableViewController is renamed to EngagementTableViewController.
  • La classe CapptainUtils viene rinominata come EngagementUtils.The class CapptainUtils is renamed to EngagementUtils.
  • La classe CapptainViewController viene rinominata come EngagementViewController.The class CapptainViewController is renamed to EngagementViewController.