Bei der Apple-Dokumentation habe ich mich mit dem Befehl dlopen befasst , mit dem die Verknüpfung der Bibliotheken unter bestimmten Bedingungen abhängig von den unterstützten Systemversionen und Bibliotheken vorgenommen wird.
Anwendungsbeispiel dlopen:
Ist die Funktion 'dlopen ()' eine private API?
Schauen wir uns also die von Apple Docs bereitgestellte Lösung an:
Bereitstellen einer enthaltenen App für ältere Versionen von iOS
Wenn Sie von Ihrer enthaltenen App aus eine Verknüpfung zu einem eingebetteten Framework herstellen, können Sie es weiterhin für Versionen von iOS bereitstellen, die älter als 8.0 sind, obwohl eingebettete Frameworks in diesen Versionen nicht verfügbar sind.
Der Mechanismus, mit dem Sie dies tun können, ist der Befehl dlopen , mit dem Sie ein Framework-Bundle bedingt verknüpfen und laden. Sie verwenden diesen Befehl als Alternative zu der Verknüpfung zur Erstellungszeit, die Sie im Zieleditor von Xcode General oder Build Phases angeben können . Die Hauptidee besteht darin , eingebettete Frameworks nur unter iOS 8.0 oder neuer mit Ihrer enthaltenen App zu verknüpfen .
Sie müssen Objective-C und nicht Swift in Ihren Code-Anweisungen verwenden, die ein Framework-Bundle bedingt laden. Der Rest Ihrer App kann in beiden Sprachen geschrieben werden, und das eingebettete Framework selbst kann ebenfalls in beiden Sprachen geschrieben werden.
Greifen Sie nach dem Aufruf von dlopen mit der folgenden Anweisung auf die eingebetteten Framework-Klassen zu:
MyLoadedClass *loadedClass = [[NSClassFromString (@"MyClass") alloc] init];
WICHTIG
Wenn Ihr enthaltenes App-Ziel mit einem eingebetteten Framework verknüpft ist, muss es die arm64-Architektur enthalten. Andernfalls wird es vom App Store abgelehnt.
So richten Sie ein App-Erweiterungs-Xcode-Projekt ein, um die bedingte Verknüpfung zu nutzen
- Legen Sie für jede Ihrer enthaltenen App-Erweiterungen das Bereitstellungsziel wie gewohnt auf iOS 8.0 oder höher fest. Tun Sie dies im Abschnitt "Bereitstellungsinformationen" der Registerkarte "Allgemein" im Xcode-Zieleditor.
- Legen Sie für Ihre enthaltene App das Bereitstellungsziel als die älteste Version von iOS fest, die Sie unterstützen möchten.
- Konditionieren Sie in Ihrer enthaltenen App Aufrufe des Befehls dlopen innerhalb einer Laufzeitprüfung für die iOS-Version mithilfe der systemVersion-Methode. Rufen Sie den Befehl dlopen nur auf, wenn Ihre enthaltene App unter iOS 8.0 oder höher ausgeführt wird. Verwenden Sie bei diesem Anruf unbedingt Objective-C und nicht Swift.
Bestimmte iOS-APIs verwenden eingebettete Frameworks über den Befehl dlopen. Sie müssen Ihre Verwendung dieser APIs genau wie beim direkten Aufruf von dlopen konditionieren . Diese APIs sind vom undurchsichtigen Typ CFBundleRef :
CFBundleGetFunctionPointerForName
CFBundleGetFunctionPointersforNames
Und aus der NSBundle-Klasse:
load
loadAndReturnError:
classNamed:
Rufen Sie in einer enthaltenen App, die Sie für Versionen von iOS bereitstellen, die älter als 8.0 sind, diese APIs nur innerhalb einer Laufzeitprüfung auf, die sicherstellt, dass Sie in iOS 8.0 oder neuer ausgeführt werden, und rufen Sie diese APIs mit Objective-C auf.