Является ли функция 'dlopen ()' закрытым API? - PullRequest
19 голосов
/ 30 июня 2011

Я хочу использовать функцию 'dlopen ()' для вызова динамической библиотеки на платформе iOS. Является ли функция 'dlopen ()' частным API?

1 Ответ

19 голосов
/ 17 июня 2014

Я успешно пользовался 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]);
    }
}
...