Instrukcja integracji IOS

Biblioteka jest dostępna pod adresem: https://pomoc.salesmanago.pl/developers/

Importowanie biblioteki, ustawienia podstawowe

  1. Biblioteka jest dystrybuowana jako statyczna biblioteka (static library) napisana w języku Objective-C oraz plik bundle, zawierający schemat bazy danych używanej przez bibliotekę. Po rozpakowaniu archiwum należy zaimportować bibliotekę oraz plik bundle przeciągając je do okna projektu, oraz uzupełnić wymaganą konfigurację dla pliku plist:
            
        <key>amAppId</key>
        <string><<<ID_APLIKACJI>>></string>
        <key>amSyncMeantime</key>
        <string>60</string>
        <key>amDevice~ipad</key>
        <string>TABLET</string>
        <key>amDevice~iphone</key>
        <string>PHONE</string>
        <key>amDevice~ipod</key>
        <string>PHONE</string>
        <key>amSessionSplitTimeInterval</key>
        <string>5</string>
        <key>amVendorId</key>
        <string><<<IDVENDORA>>></string>
        <key>NSAppTransportSecurity</key>
          <dict>
              <key>NSExceptionDomains</key>
              <dict>
                  <key>appmanago.com</key>
                  <dict>
                      <key>NSExceptionRequiresForwardSecrecy</key>
                      <false/>
                      <key>NSIncludesSubdomains</key>
                      <true/>
                  </dict>
              </dict>
          </dict>
        <key>UIBackgroundModes</key>
        <array>
          <string>remote-notification</string>
        </array>
        

    Opis parametrów:

    amAppId– ID aplikacji skopiowane z panelu APPmanago.

    amSessionSplitTimeInterval – czas, po upłynięciu którego wykorzystanie aplikacji zostanie uznane za uruchomienie. Wartość w minutach. Dla wartości 30 – kolejne użycie aplikacji zostanie zliczone w momencie, gdy po 30 minutach niekorzystania z aplikacji
    zostanie ona uruchomiona.

    amVendorId – skopiowane z panelu APPmanago ID vendora

    amSyncMeantime – czas w sekundach pomiędzy synchronizacją zdarzeń z biblioteki z serwerem APPmanago. Minimalna wartość to 60s. Większe wartości, będą zamieniane na 60.

    Uwaga:
    Pozostałe parametry zostają niezmienione.
    W celu użycia biblioteki w aplikacji w języku Swift, należy stworzyć Bridging Header i zaimportować w nim klasy z biblioteki APPmanago.

Wywołania w AppDelegate

W celu poprawnego działania biblioteki niezbędne jest wykonanie metod w AppDelegate.
Wywołania w AppDelegate:

Metoda didFinishLaunchingWithOptions realizuje obsługę powiadomienia w momencie gdy aplikacja nie była wcześniej włączona. W podanym przykładzie obsługa powiadomień jest dla uproszczenia identyczna jak w metodach didFinishLaunchingWithOptions i didReceiveRemoteNotification. Podane przykłady różnią się jedynie wywołaniem completionHandlera w metodzie didReceiveRemoteNotification, które jest konieczne z punktu widzenia systemu iOS. Realizacja obsługi powiadomienia może się różnić w przypadku tych metod lub być wyciągnięta w bardziej elegancki sposób.
  • dialogHandler
    Dla czytelności dialogHandler został wydzielony jako osobna funkcja, do działania poniższych przykładów należy umieścić go w pliku AppDelegate.m
        void (^dialogHandler)(AMNotification *) = ^(AMNotification *notification) {
           UIAlertAction *okAction = [UIAlertAction actionWithTitle:notification.payload[@"dialogOk"] style:UIAlertActionStyleDefault
        handler:^(UIAlertAction *action) {
          [[AMMonitor sharedInstance] trackNotificationCallback:notification]; 
        }];
           [[AMMonitor sharedInstance] displayDialog:notification withOkAction:okAction];
        };
        
  • didFinishLaunchingWithOptions
        - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
           // Override point for customization after application launch.
        
        
           [[AMMonitor sharedInstance] application:application didFinishLaunchingWithOptions:launchOptions];
        
        
        if (launchOptions) {
           [[AMMonitor sharedInstance] loadPayloadForNotification:launchOptions
                                                   andApplication:application
                                   loadCompletionHandlerWithError:^(AMNotification *notification, NSError *error) {
        if (error) {
        NSLog(@"Error occured while downloading notification :  %@", [error localizedDescription]);
        return;
        }
         // implement your own logic or use default
        [[AMMonitor sharedInstance] handleNotification:notification
                                          notificationHandler:nil
                                                dialogHandler:dialogHandler
                                                   urlHandler:nil
                                                 inAppHandler:nil];
                                   }];
        }
        
        
        
        
        //only for iOS > 8 (implentation for previous version omitted)
           UIUserNotificationType types = UIUserNotificationTypeBadge |
                   UIUserNotificationTypeSound | UIUserNotificationTypeAlert;
           UIUserNotificationSettings *mySettings =
                   [UIUserNotificationSettings settingsForTypes:types categories:nil];
           [[UIApplication sharedApplication] registerUserNotificationSettings:mySettings];
           [[UIApplication sharedApplication] registerForRemoteNotifications];
        
        
        
        
           return YES;
        }
        
  • didReceiveRemoteNotification:
        - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler {
        
        
        BOOL amPush = [[AMMonitor sharedInstance] loadPayloadForNotification:userInfo
                                                             andApplication:application loadCompletionHandlerWithError:^(AMNotification *notification, NSError *error) {
         if (error) {
          NSLog(@"Error occured while downloading notification :  %@", [error localizedDescription]);
        completionHandler(UIBackgroundFetchResultNoData);
        return;
        } else {
        completionHandler(UIBackgroundFetchResultNewData);
        }
                                                 // implement your own logic or use default
        [[AMMonitor sharedInstance] handleNotification:notification notificationHandler:nil dialogHandler:dialogHandler urlHandler:nil inAppHandler:nil]; }];
        
        
        if (!amPush) {
           // handle not appmanago notifications here
           completionHandler(UIBackgroundFetchResultNewData);
        }
        }
        
  • didRegisterForRemoteNotificationsWithDeviceToken :
        - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
           [[AMMonitor sharedInstance] application:application didRegisterForRemoteNotificationsWithDeviceToken:deviceToken];
        }
        
        
  • applicationDidEnterBackground:
        - (void)applicationDidEnterBackground:(UIApplication *)application {
           [[AMMonitor sharedInstance] applicationDidEnterBackground:application];
        }
        
  • applicationWillEnterForeground :
        - (void)applicationWillEnterForeground:(UIApplication *)application {
           [[AMMonitor sharedInstance] applicationWillEnterForeground:application];
        }
        

Obsługa powiadomienia:

    - (BOOL) loadPayloadForNotification:(NSDictionary *)userInfo andApplication:(UIApplication *)application loadCompletionHandlerWithError:(AMNotificationHandlerWithError)completionHandler;
    

Metoda pobiera payload z serwera APPmanago i pozwala go obsłużyć w dowolny sposób. Biblioteka udostępnia metodę pomocniczą:

    - (void)handleNotification:(AMNotification *)notification 
    notificationHandler:(AMNotificationHandler)notificationHandler 
    dialogHandler:(AMNotificationHandler)dialogHandler 
    urlHandler:(AMNotificationHandler)urlHandler 
    inAppHandler:(AMNotificationHandler)inAppHandler;
    

która wykonuje domyślne akcje dla powiadomienia. Konieczne jest dostarczenie jedynie dialogHandlera w celu obsłużenia akcji ‘ok’. Tutaj też udostępnia się metodę pomocniczą, która buduje dialog. Należy jedynie zaimplementować akcję ‘ok’.

    - (void)displayDialog:(AMNotification *)notification withOkAction:(UIAlertAction *)okAction;
    

Przykład użycia podany jest powyżej, w sekcji opisującej AppDelegate.

W przypadku własnej obsługi powiadomień należy zadbać o uruchomienie metody trackNotificationCallback w momencie, gdy chcemy uznać, że akcja z powiadomienia została podjęta (użytkownik zobaczył treść, kliknął ok, itp).

    - (void)trackNotificationCallback:(AMNotification *)notification;
    

Rich notification

Istnieje możliwość dodania do powiadomienia multimediów typu zdjęcie, gif, film, audio. Jest ono wspierane od iOS10. Aby dodać należy przy tworzeniu powiadomienia zaznaczyć flagę “Rich content” i uzupełnić dodatkowe pola. Wymagane jest obsłużenie przychodzącego powiadomienia po stronie aplikacji. Informacje na temat umożliwienia obsługi takich powiadomień w aplikacji można znaleźć tutaj: https://developer.apple.com/documentation/usernotificationsui/customizing_the_appearance_of_notifications
Przykładowy kod do obsługi powiadomień typu rich push po stronie aplikacji:

        //
    //  NotificationService.m
    //  RichNotification
    //
    //  Copyright © 2016 Benhauer. All rights reserved.
    //
    
    #import "NotificationService.h"
    
    @interface NotificationService ()
    
    @property(nonatomic, strong) void (^contentHandler)(UNNotificationContent *contentToDeliver);
    @property(nonatomic, strong) UNMutableNotificationContent *bestAttemptContent;
    
    @end
    
    @implementation NotificationService
    
    
    - (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent *_Nonnull))contentHandler {
    
        self.contentHandler = contentHandler;
        self.bestAttemptContent = [request.content mutableCopy];
    
        // Modify the notification content here...
    
        NSDictionary *userInfo = request.content.userInfo;
        if (userInfo == nil) {
            [self contentComplete];
            return;
        }
    
        NSString *payloadUrl = userInfo[@"att-url"];
        NSString *payloadType = userInfo[@"att-type"];
    
        [self loadAttachmentForUrlString:payloadUrl attachmentType:payloadType completionHandler:^(UNNotificationAttachment *attachment) {
            if (attachment) {
                self.bestAttemptContent.attachments = [NSArray arrayWithObject:attachment];
            }
            [self contentComplete];
        }];
    
    
    }
    
    - (void)contentComplete {
        self.contentHandler(self.bestAttemptContent);
    }
    
    - (void)serviceExtensionTimeWillExpire {
        // Called just before the extension will be terminated by the system.
        // Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used.
        self.contentHandler(self.bestAttemptContent);
    }
    
    - (void)loadAttachmentForUrlString:(NSString *)urlString attachmentType:(NSString*) attachmentType completionHandler:(void (^)(UNNotificationAttachment *))completionHandler {
    
        __block UNNotificationAttachment *attachment = nil;
    
        
        
        NSURL *attachmentURL = [NSURL URLWithString:urlString];
    
        NSString *attType = [@"." stringByAppendingString:attachmentType];
        
        NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
        [[session downloadTaskWithURL:attachmentURL
                    completionHandler:^(NSURL *temporaryFileLocation, NSURLResponse *response, NSError *error) {
                        if (error != nil) {
                            NSLog(@"%@", error.localizedDescription);
                        } else {
                            NSFileManager *fileManager = [NSFileManager defaultManager];
                            NSURL *localURL = [NSURL fileURLWithPath:[temporaryFileLocation.path stringByAppendingString:attType]];
                            [fileManager moveItemAtURL:temporaryFileLocation toURL:localURL error:&error];
    
                            NSError *attachmentError = nil;
                            attachment = [UNNotificationAttachment attachmentWithIdentifier:@"" URL:localURL options:nil error:&attachmentError];
                            if (attachmentError) {
                                NSLog(@"%@", attachmentError.localizedDescription);
                            }
                        }
                        completionHandler(attachment);
                    }] resume];
    }
    
    
    @end
    

Po implementacji można wpisać “Typ załącznika” jako “jpg” i “Adres url załącznika” jako adres zdjęcia które pojawi się w powiadomieniu.

Nagrywanie zdarzeń

  1. Użycie AMMonitorViewController.

    Zdarzenia otwarcia i zamknięcia modułu są nagrywane automatycznie przez kontrolery, które rozszerzają klasę AMMonitorViewController.
    SimpleId dla tych zdarzeń jest domyślnie ustawiane na takie, jak nazwa klasy, może być konieczne jego zastąpenie w celu poprawnego zliczania otwarć:

        - (void)viewDidLoad {
           [super viewDidLoad];
           self.simpleId = @"secondActivity";
           // Do any additional setup after loading the view.
        }
        
  2. Użycie metod nagrywających:

    Należy w kontrolerach bezpośrednio wywoływać metody :

       
        - (void)viewWillAppear:(BOOL)animated {
            [super viewWillAppear:animated];
            [[AMMonitor sharedInstance] trackEventWithEventType:@"START" andSimpleId:simpleId andProperties:nil];
        }
        
       
        - (void)viewWillDisappear:(BOOL)animated {
            [super viewWillDisappear:animated];
            [[AMMonitor sharedInstance] trackEventWithEventType:@"END" andSimpleId:simpleId andProperties:nil];
        }
        
  • Dla nagrania kliknięcia używamy tej samej metody z parametrem eventType
    CLICKED:
        [[AMMonitor sharedInstance] trackEventWithEventType:@"CLICKED" andSimpleId:@"click" andProperties:nil];
        
  • Nagranie lokalizacji:
    [[AMMonitor sharedInstance] recordLocationWithLatitude:@"50.083762" andLongitude:@"19.923"];
  • Recording external event:
     
        AMProperties *properties = [[AMProperties alloc] init];
        [properties addString:@"custom event" withName:@"detail1"];
        [[AMMonitor sharedInstance] trackCustomEvent:properties withEventType:@"u_clicked"];];
        
  • Synchronizacja adresu email ::
        [[AMMonitor sharedInstance] syncEmail:@"ios@test.pl"];
        
  • Synchronizacja numeru telefonu:
        [[AMMonitor sharedInstance] syncMsisdn:@"123123123"];
        
  • Synchronizacja właściwości:
        AMProperties *properties = [[AMProperties alloc] init];
        [properties addString:@"John" withName:@"name"];
        
        
        [[AMMonitor sharedInstance] setUserProperties:properties];
        
  • Pobieranie nieodebranych powiadomień:

    Jeżeli aplikacja była wcześniej wyłączona całkowicie z poziomu menedżera aplikacji, możliwe jest pobranie powiadomień wraz z payloadem (dla typu INAPP i NOTIFICATION), nawet jeśli aplikacja nie została uruchomiona poprzez kliknięcie w powiadomienie. W przypadku INAPP jest to jedyna możliwość pobrania powiadomienia, które dotarło do telefonu, gdy aplikacja była wyłączona. Sensownym miejscem do wywołania tej metody, jest metoda didFinishLaunchingWithOptions w AppDelegate.

        [[AMMonitor sharedInstance] loadUnrecievedNotificationsAndProcess:^(AMNotification *notification, NSError *error) {
           if (!error) {
          //Implement your logic here
               NSLog(@" %@", notification);
           }
        }];
        

Dodatek A: Powiadomienia push

Jeżeli aplikacja nie korzystała wcześnie z powiadomień należy upewnić się, że jest poprawnie skonfigurowana do obsługi powiadomień poprzez usługę APNS (Apple Push Notification Service).

Informacje potrzebne niezbędne do uruchomienia powiadomień push można znaleźć na stronach apple: [LINK]
Wiele poradników w Internecie opisuje pełen proces włączania obsługi powiadomień, wraz z generowaniem odpowiednich certyfikatów i kluczy. Niezbędne jest wgranie poprawnego certyfikatu do systemu APPmanago.

Informacje na temat uzyskania odpowiednich certyfikatów można znaleźć tutaj: [LINK] Uzyskany certyfikat należy przekonwertować do formatu .p12 za pomocą Keychain Access. Można to zrobić używając opcji “eksport” dostępnej po kliknięciu prawym przyciskiem myszy w certyfikat.

Rozwiązywanie problemów
W przypadku gdy występują błędy nieznanych selektorów :
[LINK]

Jeżeli potrzebujesz więcej informacji na powyższy temat skontaktuj się z nami: support@salesmanago.com +48 533 600 808
Luty 02 2024 Kwiecień 23 2024