iOS SDK Integration Guide

Anwendbare Version

Dieser Artikel gilt für die MTPush iOS SDK-Version: v3.0.0 und höher.

Ressourcenpaket

Paketname: engagelab-ios-{Versionsnummer} (Ressourcenpaket für das MTPush iOS SDK)

Ab Version 4.3.3 wird das .a-Paket nicht mehr bereitgestellt. Es werden ausschließlich .xcframework-Pakete angeboten.

  • lib-Ordner: Enthält mtpush-ios-x.x.x.xcframework und mtpush-extension-ios-x.x.x.xcframework. (Hinweis: APNs-Benachrichtigungen werden auf Simulatoren nicht unterstützt.)
  • README-Datei: SDK-Anleitung
  • demo-Ordner: Beispielprojekte

Abrufen von Anwendungsinformationen

Nach dem Erstellen einer Anwendung in der EngageLab-Konsole wird automatisch ein AppKey generiert, der die Anwendung eindeutig identifiziert (AppKey zur eindeutigen Identifizierung der Anwendung).

Projekteinstellungen

SDK importieren

Cocoapods-Import

pod 'MTPush' Hinweis: Falls Sie die neueste Version nicht importieren können, führen Sie den Befehl pod repo update master aus, um das lokale Pod-Repository zu aktualisieren, und wiederholen Sie anschließend pod 'MTPush'.
              
              pod 'MTPush'

Hinweis: Falls Sie die neueste Version nicht importieren können, führen Sie den Befehl pod repo update master aus, um das lokale Pod-Repository zu aktualisieren, und wiederholen Sie anschließend pod 'MTPush'.

            
Diesen Codeblock im schwebenden Fenster anzeigen
  • Wenn Sie eine bestimmte Version installieren möchten, verwenden Sie folgende Methode (hier am Beispiel von MTPush 3.5.0):
pod 'MTPush', '3.5.0'
              
              pod 'MTPush', '3.5.0'

            
Diesen Codeblock im schwebenden Fenster anzeigen

Manueller Import

  • Entpacken Sie das SDK-Paket und fügen Sie in Xcode über „Dateien zu ‚Ihr Projektname‘ hinzufügen...“ die mtpush-ios-x.x.x.xcframework in Ihr Projektverzeichnis ein.
  • Fügen Sie folgende Frameworks hinzu:
    • CFNetwork.framework
    • CoreFoundation.framework
    • CoreTelephony.framework
    • SystemConfiguration.framework
    • CoreGraphics.framework
    • Foundation.framework
    • UIKit.framework
    • Security.framework
    • libz.tbd
    • UserNotifications.framework
    • libresolv.tbd
    • libsqlite3.tbd

Build-Einstellungen für iOS-Projekte

Falls Ihr Projekt Unterstützung für iOS-Versionen unter 7.0 benötigt, deaktivieren Sie in den Build Settings die Option bitCode. Andernfalls wird das Projekt nicht korrekt kompiliert.

Legen Sie die User Header Search Paths und Library Search Paths in den Sucheinstellungen fest. Liegt der SDK-Ordner (Standard: lib) auf derselben Ebene wie die Projektdatei, setzen Sie diesen Parameter auf $(SRCROOT)/{Name des Ordners, in dem sich die statische Bibliothek befindet}.

Capabilities

Wenn Sie mit Xcode 8 oder höher entwickeln, aktivieren Sie im Application Target die Option Capabilities → Push Notifications, wie hier gezeigt:
1.png
Wenn Sie in einer Xcode 10- oder höheren Umgebung entwickeln, aktivieren Sie zusätzlich im Application Target die Option Capabilities → Access WIFI Information.
image.png

Hinzufügen einer Header-Datei

Fügen Sie folgenden Code an der Stelle ein, an der die Header-Datei in AppDelegate.m referenziert wird:

// Erforderliche Header-Datei für MTPush-Funktionen importieren #import "MTPushService.h" // Für iOS10 erforderliche Header-Datei zur APNs-Registrierung #ifdef NSFoundationVersionNumber_iOS_9_x_Max #import <UserNotifications/UserNotifications.h> #endif // Header-Datei für IDFA-Funktionalität importieren (optional) #import <AdSupport/AdSupport.h>
              
              // Erforderliche Header-Datei für MTPush-Funktionen importieren
#import "MTPushService.h"
// Für iOS10 erforderliche Header-Datei zur APNs-Registrierung
#ifdef NSFoundationVersionNumber_iOS_9_x_Max
#import <UserNotifications/UserNotifications.h>
#endif
// Header-Datei für IDFA-Funktionalität importieren (optional)
#import <AdSupport/AdSupport.h>

            
Diesen Codeblock im schwebenden Fenster anzeigen

Delegate im AppDelegate hinzufügen

Fügen Sie einen Delegate zum AppDelegate hinzu. Beispiel:

@interface AppDelegate ()<MTPushRegisterDelegate> @end
              
              @interface AppDelegate ()<MTPushRegisterDelegate>
@end

            
Diesen Codeblock im schwebenden Fenster anzeigen

Initialisierungscode hinzufügen

Initialisierungscode für APNs hinzufügen

Fügen Sie den folgenden Code in -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions ein:

// Erforderlich MTPushRegisterEntity * entity = [[MTPushRegisterEntity alloc] init]; entity.types = MTPushAuthorizationOptionAlert|MTPushAuthorizationOptionSound|MTPushAuthorizationOptionProvidesAppNotificationSettings; if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) { // Eigene Kategorien können hinzugefügt werden // NSSet<UNNotificationCategory *> *categories für iOS10 oder höher // NSSet<UIUserNotificationCategory *> *categories für iOS8 und iOS9 } [MTPushService registerForRemoteNotificationConfig:entity delegate:self];
              
              // Erforderlich
MTPushRegisterEntity * entity = [[MTPushRegisterEntity alloc] init];
entity.types = MTPushAuthorizationOptionAlert|MTPushAuthorizationOptionSound|MTPushAuthorizationOptionProvidesAppNotificationSettings;
if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0) {
  // Eigene Kategorien können hinzugefügt werden
  // NSSet<UNNotificationCategory *> *categories für iOS10 oder höher
  // NSSet<UIUserNotificationCategory *> *categories für iOS8 und iOS9
}
[MTPushService registerForRemoteNotificationConfig:entity delegate:self];

            
Diesen Codeblock im schwebenden Fenster anzeigen

Initialisierungscode für MTPush hinzufügen

Fügen Sie den folgenden Code in -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions ein:

// Optional // IDFA abrufen // Um die IDFA-Funktion zu nutzen, fügen Sie diesen Code hinzu und übergeben Sie den advertisingIdentifier-Parameter an die Initialisierungsmethode NSString *advertisingId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString]; // Erforderlich // Push initialisieren [MTPushService setupWithOption:launchOptions appKey:appKey channel:channel apsForProduction:isProduction advertisingIdentifier:advertisingId];
              
              // Optional
// IDFA abrufen
// Um die IDFA-Funktion zu nutzen, fügen Sie diesen Code hinzu und übergeben Sie den advertisingIdentifier-Parameter an die Initialisierungsmethode
NSString *advertisingId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];

// Erforderlich
// Push initialisieren
[MTPushService setupWithOption:launchOptions appKey:appKey
                      channel:channel
             apsForProduction:isProduction
        advertisingIdentifier:advertisingId];

            
Diesen Codeblock im schwebenden Fenster anzeigen
Parameterbeschreibung
  • appKey
    • AppKey-Konfiguration überprüfen: Stellen Sie sicher, dass der in der Anwendung konfigurierte AppKey mit dem nach der Erstellung in der Konsole generierten AppKey übereinstimmt.
  • channel
    • Gibt den Download-Kanal des Anwendungspakets an. Zur besseren Statistik können Sie den Wert selbst festlegen, z. B. App Store.
  • apsForProduction
    • Gibt an, welche APNs-Zertifikatsumgebung verwendet wird.
    • 0 (Standardwert) bedeutet Entwicklungszertifikat, 1 steht für Produktionszertifikat.
    • Hinweis: Der Wert muss mit der in den Build Settings unter Code Signing konfigurierten Zertifikatsumgebung übereinstimmen.

APNs-Registrierung und DeviceToken erfolgreich übermitteln

Tipp: Sie können sich bei EngageLab anmelden, ohne diese Methode aufzurufen. Allerdings stehen dann keine APNs-Benachrichtigungen zur Verfügung, sondern nur eigene Nachrichten.

Implementieren Sie die Callback-Methode in AppDelegate.m und fügen Sie dort folgenden Code ein:

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { /// Erforderlich – DeviceToken registrieren [MTPushService registerDeviceToken:deviceToken]; }
              
              - (void)application:(UIApplication *)application
didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
  /// Erforderlich – DeviceToken registrieren
  [MTPushService registerDeviceToken:deviceToken];
}

            
Diesen Codeblock im schwebenden Fenster anzeigen

Fehlerhafte APNs-Registrierung behandeln (optional)

- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error { // Optional NSLog(@"did Fail To Register For Remote Notifications With Error: %@", error); [MTPushService registerDeviceToken:deviceToken]; }
              
              - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
  // Optional
  NSLog(@"did Fail To Register For Remote Notifications With Error: %@", error);
  [MTPushService registerDeviceToken:deviceToken];
}

            
Diesen Codeblock im schwebenden Fenster anzeigen

Callback-Methode zur Verarbeitung von APNs-Benachrichtigungen hinzufügen

Implementieren Sie die Callback-Methoden in AppDelegate.m und fügen Sie dort folgenden Code ein:

#pragma mark- MTPushRegisterDelegate // iOS 12 Support - (void)mtpNotificationCenter:(UNUserNotificationCenter *)center openSettingsForNotification:(UNNotification *)notification{ if (notification && [notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) { // Direkter Einstieg in die App über die Benachrichtigungsoberfläche. } else { // Einstieg über die Benachrichtigungseinstellungen. } } // iOS 10 Support - (void)mtpNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler { // Erforderlich NSDictionary * userInfo = notification.request.content.userInfo; if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) { [MTPushService handleRemoteNotification:userInfo]; } completionHandler(UNNotificationPresentationOptionAlert); // Hier kann festgelegt werden, ob ein Alert angezeigt wird. Es gibt Badge, Sound und Alert. } // iOS 10 Support - (void)mtpNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler { // Erforderlich NSDictionary * userInfo = response.notification.request.content.userInfo; if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) { [MTPushService handleRemoteNotification:userInfo]; } completionHandler(); // Muss vom System ausgeführt werden } - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { // Erforderlich, iOS 7 Support [MTPushService handleRemoteNotification:userInfo]; completionHandler(UIBackgroundFetchResultNewData); } - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { // Erforderlich, für Systeme bis einschließlich iOS 6 [MTPushService handleRemoteNotification:userInfo]; }
              
              #pragma mark- MTPushRegisterDelegate

// iOS 12 Support
- (void)mtpNotificationCenter:(UNUserNotificationCenter *)center openSettingsForNotification:(UNNotification *)notification{
  if (notification && [notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
    // Direkter Einstieg in die App über die Benachrichtigungsoberfläche.
  } else {
    // Einstieg über die Benachrichtigungseinstellungen.
  }
}

// iOS 10 Support
- (void)mtpNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler {
  // Erforderlich
  NSDictionary * userInfo = notification.request.content.userInfo;
  if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
    [MTPushService handleRemoteNotification:userInfo];
  }
  completionHandler(UNNotificationPresentationOptionAlert); // Hier kann festgelegt werden, ob ein Alert angezeigt wird. Es gibt Badge, Sound und Alert.
}

// iOS 10 Support
- (void)mtpNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler {
  // Erforderlich
  NSDictionary * userInfo = response.notification.request.content.userInfo;
  if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
    [MTPushService handleRemoteNotification:userInfo];
  }
  completionHandler();	// Muss vom System ausgeführt werden
}

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
  // Erforderlich, iOS 7 Support
  [MTPushService handleRemoteNotification:userInfo];
  completionHandler(UIBackgroundFetchResultNewData);
}

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
  // Erforderlich, für Systeme bis einschließlich iOS 6
  [MTPushService handleRemoteNotification:userInfo];
}

            
Diesen Codeblock im schwebenden Fenster anzeigen

Callback-Methode zur Verarbeitung von MTPush-eigenen Nachrichten hinzufügen

Um die Funktion für eigene Nachrichten von MTPush zu nutzen, lesen Sie bitte den 【iOS API Guide】 und implementieren Sie die entsprechenden Callback-Methoden.

Erfolgreiche Integration und Debugging

Starten Sie das Projekt im Debug-Modus. Wenn die Konsole folgendes Log ausgibt, war die Integration erfolgreich:

2016-08-19 17:12:12.745823 219b28[1443:286814] | MTP | I - [MTCORETcpEventController] ----- login result ----- uid:123456 registrationID:171976fa8a8620a14a4 idc:0
              
              2016-08-19 17:12:12.745823 219b28[1443:286814] | MTP | I - [MTCORETcpEventController] 
----- login result -----
uid:123456 
registrationID:171976fa8a8620a14a4 
idc:0

            
Diesen Codeblock im schwebenden Fenster anzeigen

Sollten während des Debuggens Probleme auftreten, lesen Sie bitte den 【iOS SDK Debugging Guide】.

Erweiterte Funktionen

Ereignisüberwachung für das MTPush SDK

Es wird empfohlen, dass Entwickler:innen folgende Benachrichtigungen aus der API einbinden:

extern NSString *const kMTCNetworkIsConnectingNotification; // Verbindungsaufbau
extern NSString * const kMTCNetworkDidSetupNotification; // Verbindung hergestellt
extern NSString * const kMTCNetworkDidCloseNotification; // Verbindung geschlossen
extern NSString * const kMTCNetworkDidRegisterNotification; // Registrierung erfolgreich
extern NSString *const kMTCNetworkFailedRegisterNotification; // Registrierung fehlgeschlagen
extern NSString * const kMTCNetworkDidLoginNotification; // Login erfolgreich

Tipp:
Fügen Sie die Methode zum Registrieren der Benachrichtigung kMTCNetworkDidLoginNotification hinzu und holen Sie sich die Registration ID in dieser Methode. Alternativ können Sie auch die Methode registrationIDCompletionHandler: verwenden, um die Registration ID per CompletionHandler zu erhalten.

extern NSString * const kMTCNetworkDidReceiveMessageNotification; // Eigene Nachricht (nicht APNS) empfangen
Die Daten der Benachrichtigung kMTCNetworkDidReceiveMessageNotification können über userInfo in NSNotification abgerufen werden, inklusive Titel, Inhalt und Extras. Weitere Informationen finden Sie im Dokument: iOS SDK API

Benachrichtigungsstatistiken mit Notification Service Extension

Tipp:
Die Notification Service Extension ist eine neue Funktion ab iOS 10, die über das mutable-content-Feld gesteuert wird.
Wenn Sie über die Web-Konsole pushen, aktivieren Sie in den optionalen Einstellungen die Option mutable-content. Beim Versand per RESTful API setzen Sie das Feld mutable-content auf true.

Entwickler:innen können mit dem Notification Service Extension SDK den Zustellstatus jeder APNs-Nachricht melden.
Hinweis: Die Impressions-Daten, die in der EngageLab-Konsole angezeigt werden, stammen aus den hier gemeldeten Zustelldaten.

Benachrichtigungsstatistik

Vorgehensweise:

  • Erstellen Sie einen Service Extension Service. Details finden Sie unter iOS 10 Service Extension.
  • Importieren Sie die Datei mtpush-extension-ios-xxx.xcframework in Ihr Service Extension-Projekt.
  • Frameworks hinzufügen: libz.tbd und libresolv.tbd.
  • Rufen Sie [mtpushSetAppkey:] auf, um Ihren AppKey zu setzen. Dieser muss mit dem AppKey Ihrer EngageLab-Anwendung übereinstimmen.
  • Rufen Sie [mtpushReceiveNotificationRequest:] auf, um Ihre APNs zu melden; die Statistik wird entsprechend erfasst. Die Anzeige der APNs erfolgt im Block-Callback der Methode.

Weitere Anwendungsbeispiele finden Sie im Demo-Code des Version-Zip-Pakets.
Referenzdokument: iOS SDK API

VoIP Push-Benachrichtigungen mit PushKit

  • VoIP Push wurde in iOS 8 eingeführt und basiert auf dem PushKit-Framework. Damit kann die App auch dann aufgeweckt und Code ausgeführt werden, wenn sie beendet wurde.
  • VoIP unterscheidet nicht zwischen Entwicklungs- und Produktionszertifikaten. Sowohl Apple Push Notification service SSL (Sandbox & Production) als auch VoIP Services Certificate unterstützen VoIP Push.

PushKit.Framework-Bibliothek hinzufügen

  • Fügen Sie in Xcode unter Build Phases → Link Binary With Libraries die PushKit.framework-Bibliothek hinzu.
  • Importieren Sie die Header-Datei mit #import <PushKit/PushKit.h>.
  • Implementieren Sie das PKPushRegistryDelegate-Protokoll im AppDelegate.

VoIP-Berechtigung hinzufügen

Aktivieren Sie unter Projekt → Capabilities → Background Modes die Option Voice over IP.

Code-Implementierung

  • Implementieren Sie die VoIP-Registrierung in der Methode didFinishLaunchingWithOptions.
- (void)voipRegistration{ dispatch_queue_t mainQueue = dispatch_get_main_queue(); PKPushRegistry *voipRegistry = [[PKPushRegistry alloc] initWithQueue:mainQueue]; voipRegistry.delegate = self; // Push-Typ auf VoIP setzen voipRegistry.desiredPushTypes = [NSSet setWithObject:PKPushTypeVoIP]; }
              
              - (void)voipRegistration{
  dispatch_queue_t mainQueue = dispatch_get_main_queue();
  PKPushRegistry *voipRegistry = [[PKPushRegistry alloc] initWithQueue:mainQueue];
  voipRegistry.delegate = self;
  // Push-Typ auf VoIP setzen
  voipRegistry.desiredPushTypes = [NSSet setWithObject:PKPushTypeVoIP];
}

            
Diesen Codeblock im schwebenden Fenster anzeigen
  • Token übermitteln
/// System gibt VoipToken zurück, an Engagelab-Server melden - (void)pushRegistry:(PKPushRegistry *)registry didUpdatePushCredentials:(PKPushCredentials *)pushCredentials forType:(PKPushType)type{ if (type == PKPushTypeVoIP) { [MTPushService registerVoipToken:pushCredentials.token]; } }
              
              /// System gibt VoipToken zurück, an Engagelab-Server melden
- (void)pushRegistry:(PKPushRegistry *)registry didUpdatePushCredentials:(PKPushCredentials *)pushCredentials forType:(PKPushType)type{
   if (type == PKPushTypeVoIP) {
    [MTPushService registerVoipToken:pushCredentials.token];
   }
}

            
Diesen Codeblock im schwebenden Fenster anzeigen
  • Bei Empfang eines VoIP Push den Empfang melden, um VoIP-Zustellungen zu zählen.
- (void)pushRegistry:(PKPushRegistry *)registry didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:(PKPushType)type{ if (type == PKPushTypeVoIP) { // Empfang an Engagelab-Server melden [MTPushService handleVoipNotification:payload.dictionaryPayload]; } } - (void)pushRegistry:(PKPushRegistry *)registry didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:(PKPushType)type withCompletionHandler:(void(^)(void))completion{ if (type == PKPushTypeVoIP) { // Empfang an Engagelab-Server melden [MTPushService handleVoipNotification:payload.dictionaryPayload]; } }
              
              - (void)pushRegistry:(PKPushRegistry *)registry didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:(PKPushType)type{
  if (type == PKPushTypeVoIP) {
    // Empfang an Engagelab-Server melden
    [MTPushService handleVoipNotification:payload.dictionaryPayload];
  }
}

- (void)pushRegistry:(PKPushRegistry *)registry didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:(PKPushType)type withCompletionHandler:(void(^)(void))completion{
   if (type == PKPushTypeVoIP) {
    // Empfang an Engagelab-Server melden
    [MTPushService handleVoipNotification:payload.dictionaryPayload];
   }
}

            
Diesen Codeblock im schwebenden Fenster anzeigen

Technischer Support für MTPush iOS SDK

Bei Problemen während der Integration:

  • Lesen Sie die Dokumentation sorgfältig, um mögliche Auslassungen zu vermeiden.
  • Sie können auf EngageLab nach ähnlichen Fragen suchen.

Um Ihr Problem schneller zu lösen, geben Sie bitte folgende Informationen an:

  • Das Produkt, zu dem Sie eine Anfrage haben (MTPush), und ob Sie weitere EngageLab-Produkte nutzen.
  • Welche API Sie aufrufen, welche Parameter Sie übergeben, die vollständige Fehlermeldung und den Zeitpunkt des Auftretens.
  • Falls keine Nachricht empfangen wird, geben Sie den AppKey der Anwendung, die Message ID der Nachricht und die Registrierungs-ID des Geräts an.
  • Bei SDK-bedingten Fehlern geben Sie bitte die entsprechende SDK-Version und vollständige Log-Aufzeichnungen an. Laden Sie die Log-Informationen als TXT-Datei hoch.
  • Bei einem Fehler auf einem iOS-Gerät geben Sie bitte das genaue Modell und das verwendete System an.
icon
Vertrieb kontaktieren