【问题标题】:Is the function 'dlopen()' private API?函数 'dlopen()' 是私有 API 吗?
【发布时间】:2011-09-25 17:16:23
【问题描述】:

我想使用函数'dlopen()'调用iOS平台的动态库,函数'dlopen()'是私有API吗?

【问题讨论】:

标签: ios dynamic-linking dlopen dynamic-library


【解决方案1】:

多年来,我在 iOS 上使用 dlopen 取得了成功。在我的用例中,我使用 dlopen 按需加载公共系统框架,而不是在应用启动时加载它们。效果很好!

[编辑] - 从 iOS 8 开始,扩展和共享框架被禁止使用 dlopen,但是应用程序本身仍然可以使用 dlopen(现在记录为不仅支持 Apple 框架,还支持自定义框架)。请参阅此 Apple 文档中的将包含的应用程序部署到旧版本的 iOS 部分:https://developer.apple.com/library/ios/documentation/General/Conceptual/ExtensibilityPG/ExtensibilityPG.pdf

[编辑] - 人为的例子

#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]);
    }
}

【讨论】:

  • 您没有遇到任何 App Store 拒绝问题?
  • @DavidLiu - 不,没问题。您无法链接任何未签名的二进制文件,但将 dlopen 与 OS 提供的公共框架或动态库一起使用没有问题。这可能已经改变,但我曾在 2 家公司工作过:1 家拥有大约 150 万月活跃用户,1 家拥有 1.5 亿月活跃用户。
  • 你能帮我举个例子吗?如何使用 dlopen 加载动态框架?
  • void* handle = dlopen("/System/Library/Frameworks/UIKit.framework/UIKit", RTLD_NOW); 然后您可以通过调用dlclose(handle); 卸载(将加载计数减1)。请务必阅读文档以获取更多信息。 developer.apple.com/library/mac/documentation/Darwin/Reference/…
  • @NSProgrammer 你如何使用@imports/#imports?这似乎是您跳过加载数百个共享 dylib 的好方法,但我不确定您将如何编译和使用 UIKit……有什么想法吗?
猜你喜欢
  • 2012-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-16
相关资源
最近更新 更多