iOS SDK per Azure Mobile EngagementiOS SDK for Azure Mobile Engagement

Da qui, è possibile visualizzare tutti i dettagli su come integrare Azure Mobile Engagement in un'app per iOS.Start here to get all the details on how to integrate Azure Mobile Engagement in an iOS App. Se si vuole fare prima una prova, eseguire l' esercitazione di 15 minuti.If you'd like to give it a try first, make sure you do our 15 minutes tutorial.

Fare clic per visualizzare il contenuto dell'SDKClick to see the SDK Content

Procedure di integrazioneIntegration procedures

  1. Iniziare da qui: Come integrare Mobile Engagement in un'app per iOSStart here: How to integrate Mobile Engagement in your iOS app
  2. Per le notifiche: Come integrare il servizio di copertura (di notifica) in un'app per iOSFor Notifications: How to integrate Reach (Notifications) in your iOS app
  3. Implementazione del piano di tag: Come usare l'API per l'assegnazione di tag avanzata di Mobile Engagement in un'app per iOSTag plan implementation: How to use the advanced Mobile Engagement tagging API in your iOS app

Note sulla versioneRelease notes

4.1.0 (07/17/2017)4.1.0 (07/17/2017)

  • Risolto il problema delle notifiche cancellate in background.Fixed badges cleared in background.
  • Risolto il problema degli avvisi in XCode 9 sulle API non chiamate nella coda principale.Fixed warnings on XCode 9 about APIs not called in main queue.
  • Risolto un problema di memoria nei poll di copertura.Fixed a memory leak in Reach polls.
  • Eliminazione del supporto per iOS 6.X.Dropped support for iOS 6.X. A partire da questa versione, la destinazione della distribuzione dell'applicazione deve essere almeno iOS 7.Starting from this version the deployment target of your application must be at least iOS 7.

Per le versioni precedenti, vedere le note sulla versione completeFor earlier version please see the complete release notes

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.

Se non sono state applicate alcune versioni dell'SDK, potrebbe essere necessario eseguire più procedure. Vedere Procedure di aggiornamento per informazioni complete.You may have to follow several procedures if you missed several versions of the SDK see the complete Upgrade Procedures.

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;
  }