IOS-Geräte auf Hardwareeigenschaften prüfen

From macwrench
  Tipp

Die hier beschriebene Vorgehensweise ist ebenso für die Abfrage anderer hardwarespezifischer Details zu verwenden - beispielsweise um zu ermitteln, ob das verwendete Gerät ein GPS hat oder telefonieren kann. Als Beispiel wird hier jedoch nur die Existenz einer Kamera abgefragt.

 

In manchen iPhone-/iPod touch-Applikationen ist es notwendig, beispielsweise auf die Exitenz einer Kamera zu prüfen damit die Applikation auf beiden Gerätetypen reibungslos funktioniert. Schließlich schmiert die Anwendung auf einem iPod touch (ohne Kamera) sang- und klanglos ab, sobald man einen [[ADC:/UIImagePickerController] verwendet und Apple weist dann die Applikation im Review-Prozess für den App-Store auch zurück.

Um also unnötige Verzögerungen zu vermeiden, kann man wie folgt vorgehen:

Applikation benötigt zwingend eine Kamera[edit]

Wenn eine App unbedingt eine Kamera benötigt (z.B. bei einem Kamera-Tool), kann man die benötigten Hardwarekomponenten als Array oder Dictionary in die Info.plist eintragen:

UIRequiredDeviceCapabilities = still-camera
Array
Hier wird die Eigenschaft "still-camera" als Wert eingetragen, wobei natürlich der Datentyp der Array-Elemente entsprechend auf "String" stehen muss
Dictionary
Hier wird das Element als "BOOL" Wert eingetragen mit "still-camera" als Key
Beispiele
Key Beschreibung
telephony Telefonfunktion (für tel:// Links benötigt)
sms SMS-Funktion (für sms:// Links benötigt)
still-camera UIImagePickerController)), um für Fotos auf eine integrierte Kamera zuzugreifen
auto-focus-camera Wenn man die Autofokus-Funktion einer Kamera benötigt
video-camera UIImagePickerController)), um für Videos auf eine integrierte Kamera zuzugreifen
wifi Wenn die Applikation WLAN-Zugang benötigt
accelerometer Wenn die App UIAccelerometer benutzt, um auf solche Events reagieren zu können. Wird für reine Displaydrehungen (Portrait <> Landscape) nicht benötigt.
location-services Verwendung des Core Location Frameworks. Hinweis: wenn man explizit ein GPS benötigt, sollte man zusätzlich den folgenden gps Schlüssel eintragen!
gps App benötigt eine vorhandene GPS (odr AGPS) Hardware für die Ortsbestimmung
magnetometer Bei Verwendung des Core Location framework für richtungsbezogene Events
microphone ... na, was wohl?
opengles-1 Bei Verwendung des OpenGL ES 1.1 Interface
opengles-2 Bei Verwendung des OpenGL ES 2.0 Interface
armv6 App wurde nur für den armv6 Befehlssatz übersetzt (verfügbar ab iPhone OS v3.1)
armv7 App wurde nur für den armv7 Befehlssatz übersetzt (verfügbar ab iPhone OS v3.1)
peer-peer App benötigt Peer-to-Peer Verbindungen über Bluetooth (verfügbar ab iPhone OS v3.1)


 
Damit lässt sich die App nur auf Geräten mit diesen Hardwareeigenschaften starten und der App Store erlaubt auch nur auf solchen Geräten die Installation! Wenn die App jedoch mit Einschränkungen trotzdem lauffähig ist, sollte man die folgende Variante verwenden.
 

In der App auf Existenz einer Eigenschaft abfragen[edit]

Alternativ lässt sich in der App selber auch die Kamera abfragen, um beispielsweise den Button, der einen UIImagePickerController aufruft, auf einem iPod touch einfach zu deaktivieren oder eine entsprechende Meldung anzuzeigen.

Kamera abfragen[edit]

Die Existenz einer Kamera kann mit Hilfe der Methode isSourceTypeAvailable: des UIImagePickerController abgefragt werden:

if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
   // Kamera ist verfügbar ...
} else {
   // Keine Kamera
}

GPS und Magnetometer abfragen[edit]

Auf vorhandene GPS-Hardware kann nicht unmittelbar sonndern nur indirekt mit Hilfe des CLLocationManager aus dem Core Location Framework geprüft werden. Dazu kann man eine sehr hohe Genauigkeit einstellen und entsprechend reagieren, wenn keine Daten in der gewünschten Genauigkeit vorliegen (siehe auch hier)

Die Verfügbarkeit von Magnetometer-Events testet über die Property headingAvailable der Klasse CLLocationManager:

if(myLocationManager.headingAvailable) {
   // ...
}
 
Wichtig: Die Abfrage des Magnetometer ist erst seit iPhone OS Version 3.0 möglich, daher sollte zusätzlich eine entsprechende Abfrage durchgeführt werden, falls die App auch noch unter iPhone OS 2.x laufen soll. Beispiel:
if(myLocationManager.headingAvailable == nil) {
   /// ... iPhone OS älter als 3.0 ... (headingAvailable ist erst ab 3.0 verfügbar)
}
 

Siehe auch[edit]