今天作了一个尝试,想要得到iPhone当前的运营商信号的强度值。
在此过程中看到很多人用到了加载动态库的方法来,现在我将总结下来:
0. 由于我们DLC函数声明在/usr/include/dlfcn.h
这个文件中,所以我们首先要将它引入:#include <dlfcn.h>
1. 就像iOS平台上的嵌入式数据库sqlite一样,动态库也要先打开:
void *dylibHandle = dlopen("/System/Library/Framework/CoreTelephony.framework/CoreTelephony", RTLD_LAZY);
使用函数:void *dlopen(const char *path, int mode);
参数含义:
path: 我们所要打开的动态库的绝对路径;
mode: 打开模式
RTLD_LAZY (default) 每个外部的符号引用将在它第一次被使用时进行绑定。(暂缓决定,等有需要时再解出符号 )
RTLD_NOW 外部符号引用将被立即绑定。(立即决定,返回前解除所有未决定的符号)
RTLD_LOCAL
RTLD_GLOBAL
返回值:
失败:NULL
成功:一个动态库引用句柄,一般用来调用dlsym和dlclose这两个函数。
2. 获得外部符号的地址:
首先我们申明一个函数指针,然后包符号地址付给我们声明的指针。
int (*getSignalStrength)(void);
getSignalStrength = dlsym(dylibHandle, "CTGetSignalStrength");
*注:获得本机号码
* NSString (*getPhoneNumber)(void);
* getPhoneNumber = dlsym(dylibHandle, "CTSettingCopyMyPhoneNumber");
使用函数:dlsym(void *handle, const char *symbol);
参数含义:
handle:由dlopen函数返回的句柄
symbol:是要求获取的函数的名称
返回值:
失败:NULL
成功:指向函数的地址,供调用使用
3. 获取信号强度:
这个强度使用一个整型数值表示的。
int signalStrength = 0;
signalStrength = getSignalStrength();
4. 关闭已打开的动态库:
dlclose(dylibHandle);
使用函数:int dlclose(void *handle);
参数含义:
handle:由dlopen函数返回的句柄
返回值:
失败:非0
成功:0
测试设备:iPhone 3GS
设备系统:iOS 4.3.3
设备状态:已越狱
测试结果:Perfect!