iphone开发中使用动态库(dylib)和…

来源:互联网 发布:深红累之渊 知乎 编辑:程序博客网 时间:2024/06/06 00:21

iphone上使用动态库的多为dylib文件,这些文件使用标准的dlopen方式来使用是可以的。那相同的在使用framework文件也可以当做动态库的方式来动态加载,这样就可以比较自由的使用apple私有的framework了。

dlopen是打开库文件

dlsym是获取函数地址

dlclose是关闭。

 

当然,要使用这种方式也是有明显缺陷的,那就是你要知道函数名和参数,否则无法继续。

私有库的头文件可以使用classdump的方式导出来,这个详细的就需要google了。

下面是两个使用的例子

1: 这是使用coreTelephony.framework获取imsi

#definePRIVATE_PATH "/System/Library/PrivateFrameworks/CoreTelephony.framework/CoreTelephony"

// Implement viewDidLoad to do additional setup after loading theview, typically from a nib.
- (void)viewDidLoad {
    [superviewDidLoad];
#if !TARGET_IPHONE_SIMULATOR
    void *kit =dlopen(PRIVATE_PATH,RTLD_LAZY);    
    NSString*imsi = nil;
    int(*CTSIMSupportCopyMobileSubscriberIdentity)() = dlsym(kit,"CTSIMSupportCopyMobileSubscriberIdentity");
    imsi =(NSString*)CTSIMSupportCopyMobileSubscriberIdentity(nil);
   dlclose(kit);    

    UIAlertView*alert = [[UIAlertView alloc]initWithTitle:@"IMSI" 
                                       message:imsi 
                                      delegate:self 
                                cancelButtonTitle:@"OK" 
                                otherButtonTitles:nil];
    [alertshow];
    [alertrelease];
#endif
}


 

2:这是使用SpringBoardServices.framework来设置飞行模式开关

#ifdef SUPPORTS_UNDOCUMENTED_API
#define SBSERVPATH "/System/Library/PrivateFrameworks/SpringBoardServices.framework/SpringBoardServices"
#define UIKITPATH"/System/Library/Framework/UIKit.framework/UIKit"

// Don't use this code in real life, boys and girls. It is not AppStore friendly.
// It is, however, really nice for testing callbacks
+ (void) setAirplaneMode: (BOOL)status;
{
    mach_port_t*thePort;
    void *uikit= dlopen(UIKITPATH, RTLD_LAZY);
    int(*SBSSpringBoardServerPort)() = dlsym(uikit,"SBSSpringBoardServerPort");
    thePort =(mach_port_t *)SBSSpringBoardServerPort(); 
   dlclose(uikit);
    
    // Link toSBSetAirplaneModeEnabled
    void *sbserv= dlopen(SBSERVPATH, RTLD_LAZY);
    int(*setAPMode)(mach_port_t* port, BOOL status) = dlsym(sbserv,"SBSetAirplaneModeEnabled");
   setAPMode(thePort, status);
   dlclose(sbserv);
}
#endif

0 0
原创粉丝点击