IOS 获取设备相关特性

一、 判断手机是否插入了SIM卡

解答:

A.     私有 API 检测

[CTSIMSupportGetSIMStatus()isEqualToString:kCTSIMSupportSIMStatusNotInserted]
可以判断是否插入了 sim
卡。

前提是把下面的代码随便复制到一个头文件里面,然后引入CoreTelephony.framework
即可。

1    extern NSString* c*****tkCTSMSMessageReceivedNotification;

2

3    extern NSString* c*****tkCTSMSMessageReplaceReceivedNotification;

4

5    extern NSString* c*****tkCTSIMSupportSIMStatusNotInserted;

6

7    extern NSString* c*****t kCTSIMSupportSIMStatusReady;

8

9

10  id CTTelephonyCenterGetDefault(void);

11

12  void CTTelephonyCenterAddObserver(id,id,CFNotificationCallback,NSString*,void*,int);

13

14  voidCTTelephonyCenterRemoveObserver(id,id,NSString*,void*);

15

16  int CTSMSMessageGetUnreadCount(void);

17

18  int CTSMSMessageGetRecordIdentifier(void * msg);

19

20  NSString * CTSIMSupportGetSIMStatus();

21

22  NSString * CTSIMSupportCopyMobileSubscriberIdentity();

23

24  id  CTSMSMessageCreate(void* unknow,NSString*number,NSString* text);

25

26  void * CTSMSMessageCreateReply(void* unknow,void *forwardTo,NSString* text);

27

28  void* CTSMSMessageSend(id server,id msg);

29

30  NSString *CTSMSMessageCopyAddress(void *, void *);

31

32  NSString *CTSMSMessageCopyText(void *, void *);

B.      开放 API 检测(有待改进,飞行模式下检测不到)

1     -(BOOL)simExist {

2

3         CTTelephonyNetworkInfo *info =[[CTTelephonyNetworkInfo alloc] init];

4

5         CTCarrier *carrier = [info subscriberCellularProvider];

6

7         //NSString *code = [carriermobileNetworkCode];

8

9         NSString *isoCountryCode =[carrier isoCountryCode];

10

11       if (isoCountryCode == nil ||isoCountryCode.length == 0) {

12

13           NSLog(@"no sim");

14

15           return NO;

16       } else {

17

18           NSLog(@"sim exist");

19

20           return YES;

21       }

22   }

二、 获取更换 SIM卡后的通知(只有更换前后的 SIM 运营商不同才能收到)

解答:

1    //初始化

2    CTTelephonyNetworkInfo *networkInfo = [[CTTelephonyNetworkInfo alloc] init];

3

4    //当sim卡更换时弹出此窗口

5    networkInfo.subscriberCellularProviderDidUpdateNotifier = ^(CTCarrier *carrier) {

6

7    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:@"Sim card changed" delegate:nil cancelButtonTitle:@"Dismiss" otherButtonTitles:nil];

8

9    [alert show];

10  };

三、 获取 SIM卡信息

解答:

1    //初始化

2    CTTelephonyNetworkInfo *networkInfo = [[CTTelephonyNetworkInfo alloc] init];

3

4    //获取sim卡信息

5    CTCarrier *carrier = networkInfo.subscriberCellularProvider;

6

7    //供应商名称(中国联通 中国移动)

8    carrier.carrierName;

9

10  //所在国家编号

11  carrier.mobileCountryCode;

12

13  //供应商网络编号

14  carrier.mobileNetworkCode;

15

16  // iso
国家编号

17  carrier.isoCountryCode;

18

19  //是否允许voip

20  carrier.allowsVOIP;

四、 判断锁屏状态

解答:

A.  私有 API 检测

1    #import <SpringBoard/SBAwayController.h>

2

3    //一句话搞定

4    if ([[objc_getClass("SBAwayController")sharedAwayController] isLocked]) {

5

6        PrintLog(@"doublecheck Home ,now YES Lock");

7    } else {

8

9        PrintLog(@"double check Home ,now NOLock");

10  }

B.  程序在前台,这种比较简单。直接使用Darwin层的通知就可以了

1    #import <notify.h>

2

3    #define NotificationLockCFSTR("com.apple.springboard.lockcomplete")

4    #define NotificationChangeCFSTR("com.apple.springboard.lockstate")

5    #define NotificationPwdUICFSTR("com.apple.springboard.hasBlankedScreen")

6

7

8    static voidscreenLockStateChanged(CFNotificationCenterRef center,void*observer,CFStringRef name,const void* object,CFDictionaryRef userInfo) {

9

10      NSString*lockstate = (__bridge NSString*)name;

11

12      if ([lockstateisEqualToString:(__bridge  NSString*)NotificationLock]) {

13

14         NSLog(@"locked.");

15      } else {

16

17         NSLog(@"lock state changed.");

18      }

19  }

20

21

22  - (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

23

24      // Overridepoint for customization after application launch.

25     CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(),NULL, screenLockStateChanged, NotificationLock, NULL,CFNotificationSuspensionBehaviorDeliverImmediately);

26

27     CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(),NULL, screenLockStateChanged, NotificationChange, NULL,CFNotificationSuspensionBehaviorDeliverImmediately);

28

29     //setScreenStateCb();

30      return YES;

31  }

C.  程序退后台后,这时再锁屏就收不到上面的那个通知了,需要另外一种方式, 以循环的方式一直来检测是否是锁屏状态,会消耗性能并可能被苹果挂起

1    static voidsetScreenStateCb() {

2      

3        uint64_tlocked;

4

5        __block inttoken = 0;

6

7       notify_register_dispatch("com.apple.springboard.lockstate",&token,dispatch_get_main_queue(),^(intt) {

8        });

9

10     notify_get_state(token, &locked);

11

12     NSLog(@"%d",(int)locked);

13  }

14

15

16  -(void)applicationDidEnterBackground:(UIApplication *)application {

17

18      while (YES) {

19

20         setScreenStateCb();

21

22         sleep(1);

23      }

24  }

关于 notify.h 请移步到:

https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man3/notify_register_check.3.html

五、 获取电池状态(是否正在充电)

解答:

通过 UIDeviceBatteryStateDidChangeNotification 通知可以获取手机是否处于充电状态。

1    (void)batteryMoniter {

2

3        UIDevice *device = [UIDevice currentDevice];

4

5        device.batteryMonitoringEnabled = YES;

6

7        if (device.batteryState == UIDeviceBatteryStateUnknown) {

8

9            NSLog(@"UnKnow");

10      }else if (device.batteryState == UIDeviceBatteryStateUnplugged){

11

12          NSLog(@"Unplugged");

13      }else if (device.batteryState == UIDeviceBatteryStateCharging){

14

15          NSLog(@"Charging");

16      }else if (device.batteryState == UIDeviceBatteryStateFull){

17

18          NSLog(@"Full");

19      }

20

21      NSLog(@"%f",device.batteryLevel);

22  }

六、 获取电池电量

解答:

1    UIDevice *device = [UIDevice currentDevice];

2

3    device.batteryMonitoringEnabled = YES;

4

5    NSLog(@"%f",device.batteryLevel);//简单的这句就是了。

6

7    ################################################

8

9    Having said that, I would not use a timer event for this, it is pretty inefficient. You want to use KVO instead:

10

11  - (void) viewWillAppear:(BOOL)animated {

12

13      UIDevice *device = [UIDevice currentDevice];

14

15      device.batteryMonitoringEnabled = YES;

16

17      currentCharge.text = [NSString stringWithFormat:@"%.2f", device.batteryLevel];

18

19      [device addObserver:self forKeyPath:@"batteryLevel" options:0x0 context:nil];

20

21      [super viewWillAppear:animated];

22  }

23

24

25  - (void) viewDidDisappear:(BOOL)animated {

26

27      UIDevice *device = [UIDevice currentDevice];

28

29      device.batteryMonitoringEnabled = NO;

30

31      [device removeObserver:self forKeyPath:@"batteryLevel"];

32

33      [super viewDidDisappear:animated];

34  }

35

36

37  - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {

38

39      UIDevice *device = [UIDevice currentDevice];

40

41      if ([object isEqual:device] && [keyPath isEqual:@"batteryLevel"]) {

42

43          currentCharge.text = [NSString stringWithFormat:@"%.2f", device.batteryLevel];

44

45      }

46  }

http://stackoverflow.com/questions/6161318/how-to-determine-whether-ios-device-is-connected-to-desktop-computer-and-itunes

EAAccessory相关方法需要Iphone的外设配件支持,只有在配件通过30pin、蓝牙、USB的方式连接iOS设备时,才能够通过该方法来检测是否连接(外设配件)的状态。外设的相关设置,需要在info.plist中添加UISupportedExternalAccessoryProtocols键,需要把pc端设置成iPhone的外设备才行,这一步不知道怎么做了。

七、 获取 SIM 卡信号强度

解答:

私有 API
获取

1    intgetSignalStrength() {

2

3        void *libHandle =dlopen("/System/Library/Frameworks/CoreTelephony.framework/CoreTelephony",RTLD_LAZY);

4

5        int (*CTGetSignalStrength)();

6

7        CTGetSignalStrength = dlsym(libHandle,"CTGetSignalStrength");

8

9        if( CTGetSignalStrength == NULL) {

10

11          NSLog(@"Couldnot find CTGetSignalStrength");

12      }

13

14      int result = CTGetSignalStrength();

15

16      dlclose(libHandle);

17      return result;

18  }

以上代码获取 RSSI
的值为正,函数拿到的是 rssi,转换成 dbm
需要剪掉 113

可以用class-dump这个工具来导出库里的头文件结构(包含了私有API)

八、 获取 WIFI 的信息(WIFI列表和强度)

解答:

1    - (id)fetchSSIDInfo {

2

3        NSArray *ifs = (__bridge_transfer id)CNCopySupportedInterfaces();

4

5        NSLog(@"Supported interfaces: %@", ifs);

6

7        id info = nil;

8

9        for (NSString *ifnam in ifs) {

10

11          info = (__bridge_transfer id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)ifnam);

12

13          NSLog(@"%@ => %@", ifnam, info);

14

15          if (info && [info count]) { break; }

16      }

17

18      return info;

19  }

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-08 03:48:09

IOS 获取设备相关特性的相关文章

iOS获取设备唯一标识的各种方法?IDFA、IDFV、UDID分别是什么含义?

iOS获取设备唯一标识的各种方法?IDFA.IDFV.UDID分别是什么含义? [摘要:1.UDID (Unique Device Identifier) UDID的齐称是Unique Device Identifier,望文生义,它便是苹果IOS装备的独一辨认码,它由40个字符的字母战数字构成.正在良多须要限定] 一.UDID (Unique Device Identifier) UDID的全称是Unique Device Identifier,顾名思义,它就是苹果IOS设备的唯一识别码,它由

iOS获取设备型号、装置类型等信息

iOS获取设备型号.设备类型等信息 设备标识 关于设备标识,历史上盛行过很多英雄,比如UDID.Mac地址.OpenUDID等,然而他们都陆陆续续倒在了苹果的门下.苹果目前提供了2个方法供App获取设备标识:idfa和idfv idfa:全称advertisingIdentifier,官方解释是广告标识,适用于广告推广,这个建议不要轻易使用,如果用了,则App里必须提供广告功能,否则很有可能会在AppStore审核时被拒.而且idfa是可以被用户关闭的(设置->隐私),一旦被关闭,就获取不到了.

iOS获取设备唯一标识的8种方法

8种iOS获取设备唯一标识的方法,希望对大家有用. UDID UDID(Unique Device Identifier),iOS 设备的唯一识别码,是一个40位十六进制序列(越狱的设备通过某些工具可以改变设备的 UDID),移动网络可以利用 UDID 来识别移动设备. 许多开发者把 UDID 跟用户的真实姓名.密码.住址.其它数据关联起来,网络窥探者会从多个应用收集这些数据,然后顺藤摸瓜得到这个人的许多隐私数据,同时大部分应用确实在频繁传输 UDID 和私人信息. 为了避免集体诉讼,苹果最终决

转载-iOS获取设备IP地址

iOS获取设备IP地址 代码如下: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 #import <ifaddrs.h>#import <arpa/inet.h>#

ios获取设备信息总结

1.获取设备的信息 1 UIDevice *device = [[UIDevice alloc] int]; 2 NSString *name = device.name; //获取设备所有者的名称 3 NSString *model = device.name; //获取设备的类别 4 NSString *type = device.localizedModel; //获取本地化版本 5 NSString *systemName = device.systemName; //获取当前运行的系统

IOS获取设备及App相应信息

iOS的SDK中提供了UIDevice,NSBundle,NSLocale,UIScreen等类来获取设备.app等相应的信息. UIDevice用于获取设备相应的信息,如设备名称.设备唯一标识.系统名称.系统版本号.设备模式.本地设备模式等. NSBundle用于获取App相应的信息,如应用名称.应用版本.应用Build版本等. NSLocale用于获取用户的本地化信息设置,例如货币类型,国家,语言,数字,日期格式的格式化,提供正确的地理位置显示等. UIScreen用于获取设备的屏幕尺寸和分

iOS获取手机相关信息

iOS具体的设备型号: #include <sys/types.h> #include <sys/sysctl.h> - (void)test { //手机型号. size_t size; sysctlbyname("hw.machine", NULL, &size, NULL, 0); char *machine = (char*)malloc(size); sysctlbyname("hw.machine", machine, &

iOS 获取设备唯一标示符的方法

在开发中会遇到应用需要记录设备标示,即使应用卸载后再安装也可重新识别的情况,在这写一种实现方式--读取设备的UUID(Universally Unique Identifier)并通过KeyChain记录. 首先iOS中获取设备唯一标示符的方法一直随版本的更新而变化.iOS 2.0版本以后UIDevice提供一个获取设备唯一标识符的方法uniqueIdentifier,通过该方法我们可以获取设备的序列号,这个也是目前为止唯一可以确认唯一的标示符.好景不长,因为该唯一标识符与手机一一对应,苹果觉得

iOS 获取设备的唯一性

一: 英文原文:In iOS 7 and later, if you ask for the MAC address of an iOS device, the system returns the value 02:00:00:00:00:00. If you need to identify the device, use the identifierForVendor property of UIDevice instead. (Apps that need an identifier f