Ich möchte feststellen, ob der Benutzer Transparenz reduzieren aktiviert hat. Es ist einfach, Sie rufen einfach die Funktion UIAccessibilityIsReduceMotionEnabled()
auf und es wird Bool
zurückgegeben. Aber meine App zielt auf iOS 7 und 8 und diese Funktion ist nicht auf iOS 7 verfügbar.
In Objective-C habe ich überprüft, ob diese Funktion existiert:
In Swift kann ich nicht herausfinden, wie ich prüfen kann, ob es existiert oder nicht. Laut diese Antwort können Sie einfach die optionale Verkettung verwenden und falls dies der Fall ist nil
, dann existiert es nicht, aber das ist offenbar auf Obj-C-Protokolle beschränkt. Xcode 6.1 mag das nicht:
Es möchte, dass Sie die? entfernen. Und natürlich stürzt es bei iOS 7 ab, weil diese Funktion nicht existiert.
Was ist der richtige Weg, um zu überprüfen, ob diese Arten von Funktionen existieren?
Wenn Sie ein bisschen frech sind, können Sie die UIKit-Binärdatei immer mit dem Bibliothekslader öffnen und prüfen, ob das Symbol aufgelöst werden kann:
%Vor% Die Aufrufe dlopen
und dlsym
können etwas teuer sein, daher würde ich empfehlen, das dlopen
- Handle für die Lebensdauer der Anwendung offen zu lassen und irgendwo das Ergebnis von dlsym
zu speichern. Wenn Sie dies nicht tun, stellen Sie sicher, dass Sie dlclose
it.
Soweit ich weiß, ist dies AppStore sicher, da UIAccessibilityIsReduceMotionEnabled
eine öffentliche API ist.
Sie können überprüfen, ob Sie in iOS 8 oder höher laufen -
%Vor% Ich denke nicht es gibt eine andere Art zu erzählen. In der Theorie, wenn Sie in der Lage wären zu überprüfen, würde der Versuch, auf den Funktionsnamen ohne ()
zuzugreifen, Ihnen nil
in iOS 7 und die Funktion () -> Bool
in iOS 8 geben. Damit dies jedoch geschieht, UIAccessibilityIsReduceMotionEnabled
müsste als (() -> Bool)?
definiert werden, was nicht der Fall ist. Das Austesten führt zu einer Funktionsinstanz in beiden Versionen von iOS, die abstürzt, wenn sie in iOS 7 aufgerufen wird:
Der einzige Weg, wie ich es sehen kann, ohne die Version zu testen, ist einfach, Ihre eigene C-Funktion zu definieren, um Ihre Bridging-Header-Datei einzuchecken und folgendes aufzurufen:
%Vor%Aus den Apple Developer-Dokumenten ( Verwenden von Swift mit Kakao und Objective- C (Swift 3) & gt; Interoperabilität & gt; Übernahme von Cocoa Design Patterns & gt; API-Verfügbarkeit ):
Swift-Code kann die Verfügbarkeit von APIs als Bedingung verwenden Laufzeit. Verfügbarkeitsprüfungen können anstelle einer Bedingung in einem verwendet werden Kontrollflussanweisung, z. B.
if
,guard
oderwhile
Aussage.Wenn Sie das vorherige Beispiel verwenden, können Sie die Verfügbarkeit in
%Vor%if
überprüfen. Anweisung, dierequestWhenInUseAuthorization()
nur bei der Methode aufruft ist zur Laufzeit verfügbar:Alternativ können Sie die Verfügbarkeit in einer
%Vor%guard
-Anweisung überprüfen, der aus dem Geltungsbereich austritt, es sei denn, das aktuelle Ziel erfüllt die spezifizierte Anforderungen. Dieser Ansatz vereinfacht die Handhabungslogik verschiedene Plattformfähigkeiten.Jedes Plattformargument besteht aus einem der unten aufgeführten Plattformnamen. gefolgt von der entsprechenden Versionsnummer. Das letzte Argument ist ein Sternchen (
*
), mit dem potenzielle zukünftige Plattformen behandelt werden.Plattformnamen:
iOS
iOSApplicationExtension
macOS
macOSApplicationExtension
watchOS
watchOSApplicationExtension
tvOS
tvOSApplicationExtension
Tags und Links ios uiaccessibility swift