I want use function 'dlopen()' to invoke a dynamic library on iOS platform, is the function 'dlopen()' private API?
The dlopen() function shall make an executable object file specified by file available to the calling program.
dlopen() The function dlopen() loads the dynamic shared object (shared library) file named by the null-terminated string filename and returns an opaque "handle" for the loaded object.
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: https://developer.apple.com/library/ios/documentation/General/Conceptual/ExtensibilityPG/ExtensibilityPG.pdf
[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]); } }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With