Search code examples
iosdynamic-linkingdlopendynamic-library

Is the function 'dlopen()' private API?


I want use function 'dlopen()' to invoke a dynamic library on iOS platform, is the function 'dlopen()' private API?


Solution

  • I've had success using dlopen on iOS for years. In my use case, I use dlopen to load public system frameworks on demand instead of having them loaded on app launch. Works great!

    [EDIT] - as of iOS 8, extensions and shared frameworks are prohibited from using dlopen, however the application itself can still use dlopen (and is now documented as being supported for not only Apple frameworks, but custom frameworks too). See the Deploying a Containing App to Older Versions of iOS section in this Apple doc.

    [EDIT] - contrived example

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