zoukankan      html  css  js  c++  java
  • 使用DLC(Dynamic Loader Compatibility)函数提取iPhone当前运营商信号的强度

    今天作了一个尝试,想要得到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!

  • 相关阅读:
    微信小程序开发(十)获取手机的经纬度
    微信小程序开发(九)获取手机连接的wifi信息
    微信小程序开发(八)获取手机ip地址
    微信小程序开发(七)获取手机网络类型
    微信小程序开发(六)获取手机信息
    关于JPype报FileNotFoundError: [Errno 2] No such file or directory: '/usr/lib/jvm'错误的解决
    微信小程序开发(五)数据绑定
    微信小程序开发(四)页面跳转
    微信小程序开发(三)点击事件
    微信小程序开发(二)创建一个小程序页面
  • 原文地址:https://www.cnblogs.com/OtionSky/p/Get_iPhone_Signal_Strength.html
Copyright © 2011-2022 走看看