iOS APPmanago v3.1.*

iOS Appmanago v3.1

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. Przykładowy kod obsłużenia po stronie aplikacji jest dostępny tutaj: http://pastebin.com/NN4pTb3m

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

Integracja z beaconami

Dla systemu iOS dostępna jest kompleksowa dokumentacja pod adresem https://developer.apple.com/ibeacon/ pozwalająca zapoznać się z działaniem beaconów.
Biblioteka APPmanago udostępnia metody do raportowania zdarzeń związanych z beaconami.

  • Wejście w obszar beacona

     
    - (void)enteredBeaconWith:(NSUUID *)uuid andMinor:(NSNumber *)minor andMajor:(NSNumber *)major;       
    
  • Wyjście z obszaru beacona

     
    - (void)exitedBeaconWith:(NSUUID *)uuid andMinor:(NSNumber *)minor andMajor:(NSNumber *)major;      
    

Prosta implementacja mogłaby wyglądać jak niżej :

- (void)viewDidLoad {
   [super viewDidLoad];
   self.simpleId = @"secondActivity";
   self.locationManager = [[CLLocationManager alloc] init];

   if ([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
       [self.locationManager requestAlwaysAuthorization];
   }

   [self.locationManager setDelegate:self];

   NSUUID *beaconUUID = [[NSUUID alloc] initWithUUIDString:@"f7826da6-4fa2-4e98-8024-bc5b71e0893e"];
   self.beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:beaconUUID identifier:@"region"];
   [self.beaconRegion setNotifyOnEntry:YES];
   [self.locationManager startRangingBeaconsInRegion:self.beaconRegion];
}

- (void)viewWillDisappear:(BOOL)animated {
   [self.locationManager stopRangingBeaconsInRegion:self.beaconRegion];
}

- (void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region {
   for (id object in beacons) {
       CLBeacon *beacon = object;
       [[AMMonitor sharedInstance] enteredBeaconWith:[beacon proximityUUID] andMinor:[beacon minor] andMajor:[beacon major]];
   }
}

Dla bardziej zaawansowanych zastosowań beaconów może być konieczne użycie biblioteki udostępnionej przez dostawcę beaconów np. Kontakt.io oraz zdarzeń zewnętrznych systemu APPmanago.

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.

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

aby otrzymywać
newsletter

 

Śledź nas