Entwicklung von Apps für watchOS 2, Teil 2

Seite 2: Neues Features: Audio, Video, Alerts

Inhaltsverzeichnis

Mit watchOS 2 ist es erstmals möglich, Audioaufnahmen direkt aus einer App heraus über die Smartwatch zu tätigen. Zu diesem Zweck stellt die Klasse WKInterfaceController eine neue Methode namens
presentAudioRecorderControllerWithOutputURL:
preset:options:completion:
bereit, die das Standard-Interface zum Aufzeichnen von Aufnahmen einblendet und Nutzern die Aufzeichnung erlaubt. Dabei lassen sich für die Methode die folgenden Parameter setzen:

  • URL: Hierbei handelt es sich um den Pfad zur Datei, die aufgenommen werden soll.
  • preset: Dieser Parameter bestimmt die Qualität der aufzunehmenden Audiodatei. Es wird ein Objekt vom Typ WKAudioRecorderPreset erwartet. Dabei handelt es sich um eine Enumeration, die über insgesamt drei Werte verfügt (NarrowBandSpeech für einfache Sprachaufnahmen, WideBandSpeech, ebenfalls gedacht für Sprachaufnahmen, allerdings in etwas besserer Qualität, und HighQualityAudio für das beste Aufnahmeergebnis).
  • options: Hierbei handelt es sich um einen optionalen Parameter in Form eines Dictionary, über den sich Einstellungen zur aufzunehmenden Datei festlegen lassen. Bisher stehen Schlüssel für insgesamt vier verfügbare Optionen zur Verfügung. WKAudioRecorderControllerOptionsActionTitleKey stellt den Titel dar, der während der Aufnahme auf dem Display der Apple Watch angezeigt wird. Die Option WKAudioRecorderControllerOptionsAlwaysShowActionTitleKey bestimmt, ob der anzuzeigende Titel immer auf dem Display der Apple Watch angezeigt werden soll oder erst, nachdem bereits ein wenig Audiomaterial aufgezeichnet wurde. Als Wert wird dabei ein Boolean in Form eines NSNumber-Objekt erwartet, der Default-Wert ist "true". WKAudioRecorderControllerOptionsAutorecordKey bestimmt, ob die Audioaufnahme direkt nach Anzeige des entsprechenden Interface-Controllers automatisch beginnt oder ob der Nutzer zunächst selbst den Start der Aufnahme aktivieren muss. Auch bei dieser Option erwartet das Dictionary einen booleschen Wert, der als NSNumber-Objekt umgesetzt ist. Der Standardwert ist "true". Zu guter Letzt lässt sich noch eine maximale Aufnahmezeit in Sekunden für die Audioaufnahme mithilfe der Option WKAudioRecorderControllerOptionsMaximumDurationKey festsetzen. Die maximale Dauer in Sekunden ist dabei in Form eines NSNumber-Objekts abzubilden.

Äquivalent dazu stellt die Klasse WKInterfaceController mit watchOS 2 eine weitere Methode bereit, um sowohl Audiodateien als auch Videos direkt über die Apple Watch abzuspielen. Ihr Name lautet
presentMediaPlayerControllerWithURL:options:completion:. Der Aufruf erfolgt mittels folgender Parameter:

  • URL: Hierbei handelt es sich um die URL zur Datei, die wiedergegeben werden soll. Es kann sich dabei sowohl um eine reine Audio- als auch um eine Videodatei handeln.
  • options: Ähnlich wie bei den Optionen für die Aufnahme von Audio handelt es sich auch an dieser Stelle um ein optionales Dictionary. Insgesamt stehen vier Schlüssel zur Verfügung, um die Audio- beziehungsweise Videowiedergabe anzupassen. Beispielsweise lässt sich mit der Option WKMediaPlayerControllerOptionsAutoplayKey festlegen, ob die Audio- oder Videodatei direkt abgespielt werden soll, nachdem der entsprechende Interface-Controller auf der Apple Watch angezeigt wurde; standardmäßig muss der Nutzer selbst noch einmal die Wiedergabe starten. Als Parameter ist hier erneut ein NSNumber-Objekt zur Abbildung eines booleschen Werts zu verwenden. Soll die Audio- oder Videodatei an einer bestimmten Position gestartet werden, lässt sich diese Position in Sekunden als NSNumber-Objekt für den Key WKMediaPlayerControllerOptionsStartTimeKey setzen, um das entsprechende Verhalten zu erzeugen. Und mittels WKMediaPlayerControllerOptionsLoopsKey kann man definieren, ob die Wiedergabe in einer Endlosschleife ablaufen soll (dazu wird erneut ein booelscher Wert in Form eines NSNumber-Objekt erwartet).
  • completion: Dieser Block wird aufgerufen und ausgeführt, sobald die Wiedergabe der Audio- beziehungsweise Videodatei abgeschlossen ist. Dabei werden insgesamt drei Parameter übergeben, die sich als Grundlage für weitere Funktionen und Aktionen auswerten lassen. So gibt didPlayToEnd an, ob die Datei bis zum Ende betrachtet beziehungsweise angehört wurde, während endTime den genauen Zeitpunkt in Sekunden angibt, zu der die Aufnahme beendet wurde. error informiert überdies über Fehler und Probleme.

Apple macht es mit den beiden Methoden recht einfach, Medien in eigenen Watch-Apps zu verwenden beziehungsweise Audiodateien aufzunehmen. Durch Bereitstellen eines Standard-Interface-Controllers, der die jeweiligen Aufgaben auf optimale Weise übernimmt und unter watchOS ein bekanntes und einheitliches User Interface aufweist, können so auch Drittentwickler die vorgefertigten Interface-Controller nutzen und müssen sich nur noch um eine minimale Konfiguration und die Übergabe der jeweils korrekten URLs kümmern.

Wer lieber direkt ein Interface-Element zum Abspielen von Audio beziehungsweise Video in eigene watchOS-Ansichten einbauen möchte, kann das seit watchOS 2 ebenfalls tun, und zwar mithilfe der neuen Klasse WKInterfaceMovie. Wie alle anderen Interface-Elemente wird sie direkt auf der UI platziert und dient zur Wiedergabe von Audio- und Videodateien. In den Eigenschaften der Instanz dieser Klasse legt man dann fest, wie die URL zur Quelldatei lautet, welches Bild als Thumbnail angezeigt werden und ob die Wiedergabe in einer Endlosschleife erfolgen soll.

Alerts sind unter iOS ein beliebtes Mittel, um dem Nutzer kurze Nachrichten und Meldungen zu präsentieren und einzelne Aktionen auszulagern. Ab watchOS 2 stehen Alerts – zumindest in einfacher Form – auch für Watch-Apps zur Verfügung und erlauben es erstmals, dem Nutzer Mitteilungen und Meldungen direkt aus der eigenen App heraus auf dem Display anzuzeigen, ohne dafür extra einen eigenen Interface-Controller erstellen und anzeigen zu müssen. Die Abbildung 1 zeigt den entsprechenden Ausschnitt und eine Übersicht zu Alerts aus Apples Entwicklerdokumentation.

Alerts erlauben erstmals das Anzeigen von Mitteilungen in watchOS-Apps (Abb. 1)

Grundlage für Alerts unter watchOS ist erneut die Interface-Controller-Klasse WKInterfaceController. Mithilfe der Methode presentAlertControllerWithTitle:message:preferredStyle:actions: ist es möglich, einen sogenannten Alert-Controller auf dem Display anzuzeigen, der ganz ähnlich aufgebaut ist wie die Klasse UIAlertController unter iOS. Die ersten beiden Parameter der Methode – title und message – definieren den anzuzeigenden Text des Alerts. Der dritte Parameter preferredStyle ist vom Typ WKAlertControllerStyle und kann einen von drei Werten annehmen: Alert,
SideBySideButtonsAlert und ActionSheet. Der Style definiert, wie der Alert aussieht und wie er aufgebaut ist.

Jeder Alert muss mindestens einen Action-Button enthalten, den Nutzer ausführen können (und sei es nur, um den angezeigten Alert wieder auszublenden). Diese Buttons werden in Form von WKAlertAction-Objekten definiert und als Array dem vierten Parameter der Methode – actions – übergeben. Für jede WKAlertAction wird ein passender zugehöriger Button für das Alert erzeugt. Dabei gilt zu beachten: Hat man als Alert-Style SideBySideButtonsAlert gewählt, muss das actions-Array exakt zwei WKAlertAction-Objekte enthalten. Bei allen anderen Styles muss es über mindestens ein WKAlertAction-Objekt verfügen.

Eine WKAlertAction ist einfach aufgebaut. Die Klasse bringt lediglich einen Convenience Initializer namens initWithTitle:style:handler: mit, über den alle benötigten Eigenschaften einer Alert-Action
gesetzt und definiert werden. Der erste Parameter title entspricht dem Titel des Buttons, der für die Action im Alert angezeigt wird. Der zweite Parameter style ist vom Typ WKAlertActionStyle und erlaubt das minimale Anpassen der Optik eines Action-Buttons. Hierfür stehen die drei Werte Default,
Cancel und Destructive zur Verfügung. Destructive weist auf einen Action-Button hin, dessen Ausführung eine Löschung oder anderweitig "zerstörende" Funktion zur Folge hat, während Cancel für eine Abbruch-Aktion gedacht ist. Für den Rest gibt es Default.

Zu guter Letzt entscheidet der Parameter handler, was genau bei der Ausführung einer Action geschehen soll. Dabei handelt es sich um einen Block ohne Parameter und ohne Rückgabewert. Betätigt der Nutzer einen Action-Button aus einem Alert heraus, wird eben jener handler-Code des zugehörigen Buttons ausgeführt.

Das folgende Listing zeigt die beispielhafte Verwendung von Alerts und verdeutlicht die Syntax, die zum Erstellen und Anzeigen von Alerts unter watchOS zu verwenden ist. Die verschiedenen Actions der Alerts sind dabei absichtlich einfach gehalten und geben so lediglich jeweils eine einfache print-Anweisung aus.

func presentSideBySideAlert() {
let cancel = WKAlertAction(title: "Cancel", style: .Cancel,
handler: { () -> Void in
print("Cancel")
})
let action = WKAlertAction(title: "Action", style: .Default,
handler: { () -> Void in
(print"Action")
})
presentAlertControllerWithTitle("Side-by-side alert", message:
"Select an action.", preferredStyle:
.SideBySideButtonsAlert, actions: [cancel, action])
}
func presentActionSheet() {
let cancel = WKAlertAction(title: "Cancel", style: .Cancel,
handler: { () -> Void in
print("Cancel")
})
let delete = WKAlertAction(title: "Delete", style: .Destructive,
handler: { () -> Void in
(print"Delete")
})
presentAlertControllerWithTitle("Confirm deletion", message:
"Do you want to proceed?", preferredStyle:
.ActionSheet, actions: [cancel, delete])
}