Objective C: Push Notifications in iOS 10

Apple introduced a new framework UserNotifications for delivering and handling of local and remote notifications. Let’s have a look at how to support PUSH notifications in an iOS app.

1. Import UserNotifications.framework in your AppDelegate file

#import <UserNotifications/UserNotifications.h>

Add UNUserNotificationCenterDelegate to the declaration:

#import <UserNotifications/UserNotifications.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate,UNUserNotificationCenterDelegate>
 
@end

2. Register for PUSH notifications

The best place to register for PUSH notifications is the method application:didFinishLaunchingWithOptions:. According Apple’s docs deviceToken can change from time to time. That is why it is important not to cache the device token, but to request it every time on the app start.

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
    [self registerForRemoteNotifications];
    return YES;
}

- (void)registerForRemoteNotifications
{
        // iOS 10 and greater
        UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
        center.delegate = self;
        [center requestAuthorizationWithOptions:(UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionBadge) completionHandler:^(BOOL granted, NSError * _Nullable error){
            if(!error){
                dispatch_async(dispatch_get_main_queue(), ^{
                    [[UIApplication sharedApplication] registerForRemoteNotifications];
                });
            }
        }];
}

In the code above you can see the call of requestAuthorizationWithOptions:completionHandler: method. It is important, otherwise no notifications will be displayed to the user. Quote from the Apple’s doc:

If you want your app’s remote notifications to display alerts, play sounds, or perform other user-facing actions, you must request authorization to do so using the requestAuthorizationWithOptions:completionHandler: method of UNUserNotificationCenter. If you do not request and receive authorization for your app’s interactions, the system delivers all remote notifications to your app silently.

It is also important to call registerForRemoteNotifications method on the main thread!

3. Handling of registration for remote notifications

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    // getting device token
    self.devToken = [self stringWithDeviceToken:deviceToken];
}


- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
{
   // TODO: handle errors here
    
}

// converts deviceToke to String
- (NSString *)stringWithDeviceToken:(NSData *)deviceToken {
    const char *data = [deviceToken bytes];
    NSMutableString *token = [NSMutableString string];
    
    for (NSUInteger i = 0; i < [deviceToken length]; i++) {
        [token appendFormat:@"%02.2hhX", data[i]];
    }
    
    return [token copy];
}

4. Handling delegate methods for UserNotifications

There are two more delegate methods to be implemented:

//Called when a notification is delivered to a foreground app.
-(void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler{
    NSLog(@"User Info : %@",notification.request.content.userInfo);
    completionHandler(UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionBadge);
}
 
//Called to let your app know which action was selected by the user for a given notification.
-(void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)())completionHandler{
    NSLog(@"User Info : %@",response.notification.request.content.userInfo);
    completionHandler();
}

In iOS 10 it is different with remote notifications during the app is in the foreground. In former iOS versions we had to handle notifications ourselves and display notification to the user, e.g. as Alert message. Now notifications are always shown.

5. Add Push Notifications Entitlements if not done yet

That’s all.
Now your app can receive remote PUSH notifications. Happy Coding!

Elektronische Lieferschein-App ist kurz vorm Release

Seit März wird die neue elektronische Lieferschein-App bei Bentheimer Holz erprobt. Es sind erst mal zwei LKWs mit der App bestückt. Die Tester wurden recht früh in den Entwicklungsprozess eingebunden. Es ermöglicht nun im Testbetrieb nicht nur die Mängel zu entdecken, sondern wirklich die Richtung der App-Entwicklung zu beeinflussen. Aus dem wertvollen Feedback von LKW-Fahrern wird Optimierung am Interface und an Nutzbarkeit vorgenommen. Es entstehen Funktionen die sich aus dem täglichen Geschäft ergeben.

Es hat sich z. B. recht unpraktisch erwiesen, Polter und Lieferschein-Daten komplett händisch einzugeben. Als Maßnahme wurde QR-Code Scanner in die App integriert. QR-Code wird mit dem Fuhrauftrag ausgedrückt und kann aus der App heraus eingescannt werden. Die erforderlichen Daten-Felder werden automatisch vorausgefüllt.

Was noch offen ist, ist der Rücktransport der Daten. Die Lieferschein-App bietet die Möglichkeit Daten per Email als PDF oder als Text zu verschicken. Auch xml-Versandt ist möglich. Doch diese Schnittstellen sehen voraus, dass der Empfänger dafür zuständig ist, die Daten ins eigene Backend-System zu übernehmen. Da es fehleranfällig und lästig ist, wird aktuell an der automatisierten Synchronisation mit dem Backendsystem gearbeitet. Bei Bentheimer Holz ist es HIS, ein Holzinformationssystem, was auf MS Navision aufbaut.

 

 

PolterApp Versionen 2.4 – 2.5

Die letzten zwei Updates der PolterApp enthalten eine Reihe an Fehlerbehebungen. Insbesondere wurden die lästigen App-Abstürze beim schnellen Umschalten zwischen den Polter-Daten-Reitern behoben. Außerdem wurden alle Third-Party Komponenten, welche Bestandteile der PolterApp sind, auf den letzen Stand gebracht. Insbesondere Goolge-Maps.

Cheat-sheets version 1.16-1.17

EN

The last two updates of the Cheat-sheets 1.16 and 1.17 contain bug fixes reported by the users. Thanks for your feedback!

DE

Die letzten zwei Updates 1.16 und 1.17 der Spicker-App enthalten Fehlerbehebungen, die von Nutzern gemeldet waren. Vielen Dank für euer Feedback!

RU

Последние два апдейта Шпаргалок 1.16 и 1.17 содержать исправления ошибок, о которых сообщали пользователи. Спасибо за ваше участие!

Difference between merge and cherry-pick in git

Generally, cherry picking in git means to choose a particular commit from one branch and apply it onto another. In contrast  merge or rebase apply normally many commits onto another branch.

If you are a console fan and do not use any graphical interfaces working with git, proceed as follow for cherry-pick:

  1. Make sure you are on the branch you want to apply the commit to.

    git checkout master

  2. Execute the following to pick a commit:

    git cherry-pick <commit-hash>

Also note following:

  1. If you cherry-pick from a public branch, you should better use

    git cherry-pick -x <commit-hash>

    This will generate a standardized commit message. This way, you and your co-workers can still keep track of the origin of the commit.

  2. If you have notes attached to the commit they do not follow the cherry-pick. To bring them over as well, You have to use:

    git notes copy <from> <to>

 

More about cherry-pick can be found at git official guide page.

Cheat-sheets version 1.15

EN

Cheat-sheets have got a new function for copying the note into clipboard. Just use the swipe gesture at the note entry to access the actions menu. Afterwards tap the “Copy” button. The text of the note is now copied and can be pasted at any other place.

DE

Spicker wurde um eine neue Funktion erweitert, nämlich Kopieren der Notizen ins Clipboard. Nutze Swipe-Gesture am Notiz-Eintrag um ins Aktions-Menu zu kommen. Wähle “Kopieren” Button. Der Notizen-Text ist nun im Clipboard und kann an jeder beliebigen Stelle über Paste verwendet werden.

RU

В Шпаргалки была добавлена функция быстрого копирования текста. Для того чтобы скопировать текст, необходимо провести пальцем по элементу и выбрать пункт меню “Копировать”. После этого текст записи будет доступен для вставки в любом другом месте.

PolterApp Version 2.3

Knapp eine Woche später gibt es das nächste Update der PolterApp. Neu in Version 2.3 ist die Möglichkeit die Stückzahl bei der Erfassung eines Stammes anzugeben. Damit ist es nun möglich aus dem durchschnittlichen Durchmesser und der  Stückzahl die Holzmenge in Festmeter berechnen zu lassen.

PolterApp Version 2.2

Die Roadmap für 2018 wird konsequent abgearbeitet. Mit der neuen Version der PolterApp bekommen die Nutzer nun die Möglichkeit erfasste Polter-Daten im .csv Format zu exportieren. Die generierte .csv Datei kann aus der PolterApp heraus entweder an andere Apps übergeben oder direkt per Email verschickt werden. Des weiteren wurden in der App einige Kleinigkeiten behoben, wie etwa Plus-Symbol bei der Sektionsvermessung, Layout auf den älteren iPhone Modellen etc.

PolterApp Version 2.1

In der neuen Version der PolterApp wurde die Einzelstamm-Erfassungsmaske um ein zusätzliches Attribut Rindenabzug erweitert. Das neue Attribut läßt sich mit dem Switch-Element aktivieren und deaktivieren je nachdem ob es bei der Volumenberechnung berücksichtigt werden soll oder nicht. Was an der Stelle noch fehlt ist die automatische Berechnung des Rindenabzugs abhängig vom Baumart. Diese Berechnung ist allerdings vom Bundesland zum Bundesland unterschiedlich, deswegen bleibt dieses Eingabefeld erstmal zur freien Zahlenangabe.

 

Als nächstes ist CSV Export Funktion der Polterdaten an der Reihe. Diese “Baustelle” befindet sich in den letzten Zügen und wird zeitnah abgeschloßen. Mit dem nächsten Update der PolterApp ist in 2-3 Wochen zu rechnen.