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!

  • 相关阅读:
    还在使用golang 的map 做Json编码么?
    Golang 性能测试(2) 性能分析
    golang 性能测试 (1) 基准性能测试
    消息队列 NSQ 源码学习笔记 (五)
    消息队列 NSQ 源码学习笔记 (四)
    消息队列 NSQ 源码学习笔记 (三)
    消息队列 NSQ 源码学习笔记 (二)
    消息队列 NSQ 源码学习笔记 (一)
    你不知道的空格
    Supervisor 使用和进阶4 (Event 的使用)
  • 原文地址:https://www.cnblogs.com/OtionSky/p/Get_iPhone_Signal_Strength.html
Copyright © 2011-2022 走看看