Я хочу использовать функцию 'dlopen()' для вызова динамической библиотеки на платформе iOS, является ли функция private API dlopen()?
Является ли функция "dlopen()" частным API?
Ответ 1
У меня был успех с использованием dlopen на iOS в течение многих лет. В моем случае использования я использую dlopen для загрузки общедоступных системных фреймворков по требованию вместо их загрузки при запуске приложения. Отлично работает!
[EDIT] - с iOS 8, расширениям и общим фреймворкам запрещено использовать dlopen
, однако само приложение все еще может использовать dlopen
(и теперь оно документировано как поддерживаемое не только для фреймворков Apple, но и для пользовательских рамки тоже). См. Раздел Развертывание содержащего приложения в старых версиях iOS в этом документе Apple: https://developer.apple.com/library/ios/documentation/General/Conceptual/ExtensibilityPG/ExtensibilityPG.pdf
[EDIT] - надуманный пример
#import <dlfcn.h>
void printApplicationState()
{
Class UIApplicationClass = NSClassFromString(@"UIApplication");
if (Nil == UIApplicationClass) {
void *handle = dlopen("System/Library/Frameworks/UIKit.framework/UIKit", RTLD_NOW);
if (handle) {
UIApplicationClass = NSClassFromString(@"UIApplication");
assert(UIApplicationClass != Nil);
NSInteger applicationState = [UIApplicationClass applicationState];
printf("app state: %ti\n", applicationState);
if (0 != dlclose(handle)) {
printf("dlclose failed! %s\n", dlerror());
}
} else {
printf("dlopen failed! %s\n", dlerror());
}
} else {
printf("app state: %ti\n", [UIApplicationClass applicationState]);
}
}
Ответ 2
Apple отклоняет приложения, используя теперь dlopen.