iOS 8: Die Neuerungen für Entwickler

iOS 8 kommt mit mehr als 4000 neuen APIs daher. Doch nicht alle sind für den Entwickler auch gleich relevant. Der Versuch einer ersten Fokussierung.

In Pocket speichern vorlesen Druckansicht
Lesezeit: 13 Min.
Von
  • Torben Wichers
  • Karsten Kisser
Inhaltsverzeichnis

iOS 8 kommt mit mehr als 4000 neuen APIs daher. Doch nicht alle sind für den Entwickler auch gleich relevant. Der Versuch einer ersten Fokussierung.

Die WWDC Anfang Juni mit dem ersten Ausblick auf iOS 8 ist schon etwas her. Zahlreiche Beta-Stände von iOS und Xcode folgten, bis der "goldene Master" am 9. September veröffentlicht wurde, dem Tag des medial sehr beachteten iPhone-Events. Auf welche wichtigen Änderungen sollten sich nun aber iOS-Entwickler einrichten?

Zuerst fällt natürlich in Apples Entwicklungsumgebung Xcode auf, dass der Programmierer nun die Wahl bei der Programmiersprache hat: Objective-C oder Swift (s. Abb. 1). Letzteres ist bei heise Developer schon ausführlich behandelt worden und steht deswegen nicht im Blickpunkt dieser Betrachtungen.

Xcode 6: Ein neues Projekt anlegen (Abb. 1)

Wie bei iOS 7 hat die neue Version des mobilen Betriebssystems etliche neue APIs erhalten (Apple nennt hier eine erkleckliche Anzahl von mehr als 4000 neuen). Dennoch wird sich wohl niemand vornehmen, diese vielen Neuerungen zu erlernen und gegebenenfalls auch anzuwenden. Es sind meist die konkreten Anlässe, APIs zu ergründen und zu lernen, etwa sich mit dem Fingerabdruckscanner Touch ID zu befassen, auf den Apps erstmals Zugriff haben.

Eines der vielleicht nicht so hervorgehobenen Dinge wie HealthKit, HomeKit oder CloudKit ist die Möglichkeit, sogenannte Extensions für Apps zu schreiben. Dies ist insofern neu, da eine Erweiterung im Kontext einer anderen App aufgerufen wird. Zur genauen Technik ist noch nicht wirklich viel bekannt. Jedoch ist hierdurch keine Aufweichung des Sandboxings zu erkennen, da die Erweiterungen in einer eigenen Sandbox laufen und nur die notwendigen Daten und die Bildschirminhalte ausgetauscht werden.

Um eine eigene Extension anzulegen, wählt man in Xcode einfach als Target einen von sechs Typen aus (s. Abb. 2):

Xcode 6: eine Extension auswählen (Abb. 2)

Ein Teil dieser Typen dient dazu, fremden Apps erweiterte Funktionen anzubieten, etwa Bildbearbeitungsfunktionen, Textübersetzungen oder das Versenden von Inhalten über einen eigenen Messaging-Dienst. Hierzu dienen die Extensions "Action", "Share" oder "Photo Editing". Die anderen helfen dabei, Elemente von iOS wie eigene Tastaturen oder das Kontrollzentrum zu erweitern oder Dokumentenspeicher anzubinden.

Um zum Beispiel eine Extension zu programmieren, die ein Bild invertiert, können Entwickler ein Photo Editing Target anlegen. In Xcode werden dann einige Beispieldateien bereitgestellt. Hierzu gehören ein Storyboard für das User Interface und ein View Controller. Das Erstellen eines User Interface ist identisch mit dem normaler Apps. Das zu verarbeitende Bild bekommt der View Controller dann über die Methode
startContentEditingWithInput:placeholderImage: übergeben. Durch einen Klick auf den blauen Button im Storyboard wird die Methode finishContentEditingWithCompletionHandler: ausgeführt. Nun ist das Ergebnisbild zu berechnen. Hierzu muss es von einer temporären Datei geladen, umgewandelt und wieder in eine temporäre Datei zurückgeschrieben werden. Um das Bild mit einem CIFilter zu invertieren, ließe sich folgender Code verwenden:

- (void)finishContentEditingWithCompletionHandler:(void
(^)(PHContentEditingOutput *))completionHandler {
// Führe das Invertieren des Bilds asynchron aus
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
0), ^{

// Erzeuge ein Ergebnisobjekt
PHContentEditingOutput *output = [[PHContentEditingOutput alloc]
initWithContentEditingInput:self.input];
output.adjustmentData = [[PHAdjustmentData alloc]
initWithFormatIdentifier:@"Invert"
formatVersion:@"1" data:nil];

// Lade das übergebene Bild aus der temporären Datei
UIImage *image = [[UIImage alloc] initWithData:[NSData
datatWithContentsOfURL:_input.fullSizeImageURL]];

// Invertieren des Bilds aus der temporären Datei
CIImage *coreImage = [CIImage imageWithCGImage:image.CGImage];
CIFilter *filter = [CIFilter filterWithName:@"CIColorInvert"];
[filter setValue:coreImage forKey:kCIInputImageKey];
CIImage *result = [filter valueForKey:kCIOutputImageKey];

// Zurückspeichern des Ergebnisbilds in die temporäre
// Ergebnis im JPEG-Format
CGImageRef cgResultImage = [[CIContext contextWithOptions: nil]
createCGImage:result fromRect:result.extent];
UIImage* resultImage = [UIImage imageWithCGImage:cgResultImage];
[UIImageJPEGRepresentation(resultImage, 1.0)
writeToURL:output.renderedContentURL atomically:YES];

// Ergebnis zurückgeben
completionHandler(output)
});

Mit einer solchen Extension ist es einfach, einen Bildbearbeitungsprozess anderen Apps anzubieten. Bei der Programmierung von Extensions sind jedoch aus Sicherheitsgründen einige Einschränkungen hinzunehmen:

  • Ein Zugriff auf sharedApplication ist nicht möglich.
  • Es funktionieren keine APIs, die im Header mit dem NS_EXTENSION_UNAVAILABLE-Makro versehen sind.
  • Die HealthKit- und EventKit-UI-Frameworks lassen sich nicht in Extensions ansprechen.
  • Die Kamera oder das Mikrofon sind nicht nutzbar, ebenso das Empfangen von Daten per AirDrop.
  • Eine eigene Tastatur darf nicht mit dem Netzwerk kommunizieren.

Die genaueren Einschränkungen lassen sich der Apple-Dokumentation entnehmen.