GPSTracker Update 1.90 bald verfügbar

Mit der Version 1.90 wird nun ein die App auch in französisch verfügbar sein. Zusätzlich gab es ein paar kleine Fehlerbehebungen und Performanceverbesserungen.

Weiterhin wurden die Screenshots auf einen neuen Stand gebracht.

Das Update ist bereits eingesendet und befindet sich gerade in Prüfung. In Kürze wird es im Appstore unter https://itunes.apple.com/de/app/gpstrack/id563797907?mt=8 zum Download bereit stehen

iWunschzettel 1.0 ab sofort im Appstore verfügbar

 

Wie oft kommt es vor: Man sieht etwas, egal ob im Netz beim surfen oder in der Stadt beim schlendern und denkt sich „Das fänd ich auch toll, könnte ich mir wünschen“.

Wenn es dann darum geht einen Wunschzettel zu schreiben, egal ob für Weihnachten, den Geburtstag, den Jahrestag oder wann auch immer, sind die Ideen weg.

Mit iWunschzettel können Sie nun genau diese Ideen, egal ob für sich selbst oder andere wie beispielsweise für Kinder, den Partner oder den Freund festhalten und bei Bedarf mit dem Partner, den Großeltern, den Onkeln oder Tanten oder wem auch immer teilen.

Beim Teilen wird automatisch ein aktueller Stand des Wunschzettels auf dem anderen Gerät gespeichert. Dazu ist es lediglich notwendig, den übersendeten Link anzuklicken wenn der Empfänger ebenfalls über iWunschzettel verfügt. Sollte der Empfänger die App noch nicht installiert haben, erhält er zusammen mit der Benachrichtigung eine Aufstellung des Wunschzettels. Zusätzlich können Sie sich bei Änderungen am Wunschzettel benachrichtigen lassen.

Anders als bei anderen Apps benötigen Sie keine Registrierung, keine email Adresse über die Sie sich authentifizieren müssen. Das Teilen erfolgt direkt vom Gerät und direkt an den entsprechenden Empfänger.

Sofern Sie Änderungen an den eigenen Wunschzetteln vornehmen, synchronisieren Sie diese danach bequem und die zuvor benachrichtigen Empfänger können sich den aktuellen Stand herunterladen.

Hinterlegen Sie Bezeichnungen, Links oder Bilder für die entsprechenden Wünsche und ordnen Sie die Wunschzettel unterschiedlichen Anlässen hinzu. Editieren Sie bequem die Anlässe über die Einstellungen und fügen einfach neue Anlässe hinzu oder entfernen vorhandene.

In Kürze wird eine iPad optimierte Version veröffentlicht werden. Direkter Link zum Appstore: https://itunes.apple.com/us/app/iwunschzettel/id1334224537?l=de&ls=1&mt=8

Push Nachrichten für iOS 10/11 (apns) in Swift

Ich habe mich in einer neuen App mit Push Nachrichten in Swift beschäftigt. Swift ist auch für mich absolutes Neuland da alle bisherigen Apps eigentlich immer nur in Objective-C von mir erstellt wurden. Zusammenfassend kann man aber sagen, dass es sehr angenehm ist in Swift zu programmieren.

Da ich auch recht viel suchen musste, um mir alle Informationen zusammen zu sammeln, dachte ich, es wäre doch ganz sinnvoll, das ganze mal zu veröffentlichen, damit auch andere Entwickler was davon haben.

Direkt vorab: Das Registrieren und Erstellen von Zertifikaten wird hier ganz gut erklärt:

https://support.pressmatrix.com/hc/de/articles/205543651-Apple-Push-Zertifikat-erstellen-erneuern

Deshalb gehe ich hier nicht auf die Zertifikatserstellung ein 😉

Öffnen wir also XCode und laden unser Projekt.

In den capabilities der App innerhalb von XCode solltet ihr den Punkt Push-Messages einschalten:

Bei automatischer Signierung sollte nun das entsprechende Provisioning Profil ergänzt werden. Alternativ kann auch über den Developer Bereich entsprechend die Funktion einschaltet werden.

Im nächsten Schritt öffnen wir nun unseren Appdelegate und ergänzen unsere didFinishLaunchingWithOptions Funktion wie nachfolgend:


func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
// Override point for customization after application launch.
let settings = UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil)
UIApplication.sharedApplication().registerUserNotificationSettings(settings)
UIApplication.sharedApplication().registerForRemoteNotifications()
return true
}

Hier fragen wir alsoden Benutzer um Erlaubnis Mitteilungen empfangen zu dürfen. Je nach Antwort des Benutzers dürfen wir die Mitteilungen empfangen und erstellen die nachfolgende Funktion innerhalb des AppDelegate


func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
let token = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
UserDefaults.standard.set(token, forKey: "deviceToken")
print("Device Token: \(token)")
}

Innerhalb der Funktion wird also ein Token übergeben. Das Token hat den Zweck das Gerät für die App zu identifizieren. Wir sollten, je nach Verwendungszweck und Art des Versands der Mitteilung, entweder dieses Token in den UserDefaults sichern um später darauf zuzugreifen (wenn der Versand der Push Nachricht an spezifische Geräte geht) oder das Token direkt an einen Webserver bzw. Datenbank übertragen (wenn der Versand der Push Nachricht an alle Geräte die die App nutzen erfolgen soll).

In unserem Fall speichern wir das Token in den defaults. Wichtig: Das Token ist je App und Gerät unterschiedlich! Heisst also nicht, dass ich immer dieses Token für jegliche App auf dem Gerät für den Versand von Push Nachrichten benutzen kann. Bei einer Wiederherstellung des Gerätes aus einem Backup kann sich dieses Token zusätzlich ändern, daher muss man die App entsprechend im Vorfeld auslegen.

Zurück zum Thema 😉

Weiterhin implementieren wir eine Funktion, die aufgerufen wird, wenn es zum Fehler bei der Registrierung kommt, wichtig für unsere Tests 😉


func application(application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError) {

print(error)

}

Der erste Teil wäre geschafft… Der Versand der Push-Nachricht erfolgt über einen Webserver der mit dem erstellten Push Zertifikat eine Verbindung zu den Apple Servern herstellt. Exemplarisch ein kurzes PHP-Script dazu:


function sendpush($title, $description ,$deviceToken) {
//Definieren wir hier erstmal das entsprechende Zertfikat / Kontext
$context = stream_context_create();
stream_context_set_option($context, 'ssl', 'local_cert', 'MEIN_ZERTIFIKAT.pem');
stream_context_set_option($context, 'ssl', 'passphrase', 'MEIN_PASSWORT');
//Jetzt versuchen wir eine Verbindung zu den Apple Servern aufzubauen
$fp = stream_socket_client(
'ssl://gateway.sandbox.push.apple.com:2195', $err,
$errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $context);
if (!$fp)
exit("Fehler beim Verbinden: $err $errstr" . PHP_EOL);
//Erstellen wir jetzt die Meldung, die verschickt werden soll
$body['aps'] = array(
'alert' => array(
'title' => $title,
'body' => $description,
),
'sound' => 'default'
);
//Für den Versand muss die Meldung als json codiert werden
$payload = json_encode($body);
//Meldung vorbereiten und danach schreiben
$msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;
$result = fwrite($fp, $msg, strlen($msg));
//Verbindung zum Server schliessen und entsprechend das Ergebnis prüfen
fclose($fp);
if (!$result)
echo 'Fehler beim Versand der Nachricht' . PHP_EOL;
else
echo 'Nachricht erfolgreich verschickt' . PHP_EOL;
}

Über ein zusätzliches PHP Script kann nun die Funktion per Request aus dem Gerät heraus aufgerufen werden. Es empfiehlt sich die Variablen $title und $description des POST direkt in den Localizable.strings im Gerät zu hinterlegen und diese im Request zu verwenden. Dadurch muss keine zusätzliche Übersetzung im PHP Script gemacht werden und die Meldungen kommen direkt in der Gerätesprache rüber.

Die Variable $deviceToken enthält das Token des Zielgerätes. Normalerweise kommt diese Variable aus einer Datenbank und wird vorher abgefragt.


//Laden des Zieltokens aus der Datenbank, beispielsweise für einen bestimmten Eintrag in der App
$deviceToken = meinefunktionzumladendestokens($_POST['uuid']);

//Versand der Nachricht
sendpush($_POST['title'], $_POST['nachricht'], $deviceToken);

Innerhalb von XCode kann diese Funktion nun beispielsweise über ein Request wie folgt aufgerufen werden:


func sendepushnachrichten() {
print("sendepushnachrichten")
let url = URL(string: "https://URL_ZUM_PHP_SCRIPT.php")!
var request = URLRequest(url: url)
request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
request.httpMethod = "POST"
let nachricht = String(format: "%@ %@ %@", NSLocalizedString("pushmessage1", comment: ""), (zettel?.bezeichnung)!, NSLocalizedString("pushmessage2", comment: ""))
let titel = String(format: "%@", NSLocalizedString("pushtitle", comment: "")
let postString = String(format:"uuid=%@&nachricht=%@&title=",(zettel?.uuid)!, nachricht, title)
request.httpBody = postString.data(using: .utf8)
let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard let _ = data, error == nil else {
return
}
}
task.resume()
}

Zu erkennen oben ist, dass die Nachricht direkt wie vorher beschrieben aus dem Gerät kommt, damit keine Anpassungen im Script auf dem Server gemacht werden müssen, sondern der Aufruf vom Gerät aus mit allen notwendigen Parametern geschickt wird.

Der Poststring bzw. Body besteht aus den Parametern uuid = interne ID zur Identifizierung eines Datensatzes innerhalb einer Datenbank (hierüber werden unter anderem die Ziel Tokens ausgelesen) und der Nachricht selbst. Auf diese beiden Variablen kann dann im PHP Script über $_POST[‚uuid‘], $_POST[‚title‘] und $_POST[’nachricht‘] zugegriffen werden.

Ähnlich wie bei einem Webformular was per $_GET aufgerufen wird, wird der Poststring gebildet und kann beliebig erweitert werden. Dabei ist wichtig, dass die Variablen untereinander mit einem & Zeichen verbunden werden und der Bezeichner und Wert mit = Zeichen getrennt sind.

Wie man sieht, hört es sich öfter einfach wilder an, als es letztlich ist 😉

GPSTracker 1.80 mit grossem Update

Mit der neuen Version 1.80 wird das öffentliche Teilen von Trackings sowie das Teilen eines Live Trackings möglich sein. Dabei werden die Daten anonymisiert mit einer 64-stelligen Zufallsnummer gespeichert und sind nur für Personen aufrufbar, die den entsprechenden Link erhalten haben.

Bei der Übermittlung der Daten werden keinerlei Gerätedaten oder Userdaten übermittelt oder abgefragt. Die komplette Zuordnung der Datensätze geschieht über eine einzige Zufallsnummer die auf Ihrem Gerät gespeichert wird.

Der Service ist in der Start- und Testphase vollkommen kostenlos. Die Trackings werden zu Beginn für 30 Tage in unserer Datenbank gespeichert und danach automatisch gelöscht.

Das Update ist bereits zum Download im Appstore verfügbar. Die App kann im Appstore unter https://itunes.apple.com/de/app/gpstrack/id563797907?l=de&ls=1&mt=8 heruntergeladen werden.

iScan Barcode Update 2.3 in Kürze

In Kürze werden wir ein Update rausgeben, was unter anderem einen Fehler beim Speichern von QR-Codes beseitigt. Zusätzlich werden die App-Logos auf einen neuen Stand gebracht. Zusätzlich wird es eine Funktion geben, mit der die QR-Codes per Whatsapp, Message oder anderen Apps geteilt werden kann. iScan kann über den Appstore bezogen werden: https://itunes.apple.com/de/app/iscan-barcode/id470225427?l=de&ls=1&mt=8

 

GPSTrack Update 1.70

Mit den letzten beiden Updates auf Version 1.60 bzw. 1.70 wurden die Anpassungen auf iOS 11 sowie das iPhone X gemacht. Zusätzlich ist eine kleine Apple Watch App ab Version 1.70 verfügbar. Das letzte Update wurde soeben von Apple frei gegeben und steht in Kürze zum Download bereit.

iKassenbon auf dem Weg zur Prüfung

150x150bb

Mit iKassenbon habe ich versucht ein neues Projekt umzusetzen um dem Zettelchaos mit Kassenbons oder Rechnungen zu entfliehen. Die Idee war eine schnelle, unkomplizierte Archivierung die (fast) selbstständig indexiert, die Kassenbons sicher archviert und durchsuchbar macht. Nebenbei sollte man auch eine Übersicht der Ausgaben für den Monat enthalten.

Dabei herausgekommen ist iKassenbon, eine relativ übersichtliche App, die genau das machen soll. Belege können fotografiert werden und werden dann, sofern die Qualität stimmt, automatisch zugeschnitten und als schwarz-weiss Dokument archviert. Bis hier hin ist es noch nicht weltbewegend. Der nächste Schritt ist eine OCR Erkennung, die nun über das Dokument läuft und vollständig indexiert. Alle gefundenen Begriffe werden als Text gespeichert und sind somit durchsuchbar. Weiterhin wird über verschiedene Algorythmen versucht die Beträge und auch das Geschäft zu ermitteln. Sollte diese Erkennung nicht erfolgreich durchgeführt werden können, kann der Benutzer die Daten natürlich auch manuell hinterlegen und abspeichern.

Zusätzlich zur Indexierung ist nun auch eine Auswertung des Monats möglich, die genau auflistet, welche Beträge ausgegeben wurden und man somit einen einfachen Überblick über die Ausgabe erhält. Die OCR Erkennung kann in den Sprachen umgestellt werden. Somit ist auch ein Einsatz der App bei einer Auslandsreise möglich. Derzeit ist die App in der Lage die folgenden Sprachen zu lesen:

Chinesisch traditionell, Chinesisch simpel, Deutsch, Englisch, Französisch, Norwegisch, Portugiesisch, Finnisch, Polnisch, Ungarisch und Italienisch. Weitere Sprachen werden je nach Resonanz der App folgen. Derzeit wird die App durch Apple geprüft, hoffen wir mal, dass alles problemlos durchläuft. Die App wird kostenlos erhältlich sein und hat keine Begrenzung bei der Anzahl der zu speichernden Datensätze, bzw. kann die App nur soviele Datensätze speicher, wie Platz auf dem iPhone vorhanden ist 😉

iCountdown und GPSTracker Updates ab sofort verfügbar

150x150bbGPSTracker

Sowohl das Update für iCountdown als auch ein neues Update für den GPSTracker ist ab sofort im AppStore erhältlich. iCountdown wurde für iOS 8 und 9 komplett überarbeitet und die vorhandenen Funktionen wurden entsprechend angepasst. Bei dem Update für den GPSTracker wurde ein neues Feature zum Exportieren der aufgezeichneten Koordinaten hinzugefügt.

Hier geht zum GPSTracker und hier geht es zur Countdown App

iCountdown – Update in Kürze

150x150bb

Nach mittlerweile fast 5 Jahren funktionieren manche Apss nicht, wenn sie nicht regelmässig geupdated werden. Dies ist auch bei dieser „alten“ App der Fall. Durch zahlreiche Änderungen innerhalb von iOS ist die App auf aktuellen Geräten nicht mehr lauffähig, stürzt ab oder lässt eine einfache Datumseingabe nicht mehr zu. Daher wird in Kürze ein Update für alle aktuellen iOS Systeme im Apsstore verfügbar sein. Die App wurde grundlegend angepasst und auf den neuesten Stand gebracht.