gfdxy3322 发表于 2017-7-7 18:07:33

获取设备UDID、IMEI、ICCID、序列号、Mac地址等信息

  在iOS7之前, 可以方便的使用 [ uniqueIdentifier] 来获取设备的UDID,但是在iOS7之后这个方法不再适用。
  你可以用[valueForKey:@"uniqueIdentifier"];来获取到一个值,但这个值在iOS7中已经变成了FFFFFF+IDFV的值,显然,这个值并不能唯一标识设备。
  再谈一谈IMEI,这个值好像在5.0的sdk中就不见了,私有库Message.framework的MFNetworkController.h中去掉了这个方法。
  本以为iOS7及以上系统无法再获取到这些值,但看看别人Cydia,不是取得好好的吗?参考了一下Cydia的源码:
  MobileCydia.mm
  可以看到它使用了libMobileGestalt.dylib这个动态库,下面说一说具体如何操作。
  1、导入libMobileGestalt.dylib库
  2、加入声明


view plaincopyprint?

[*]OBJC_EXTERNCFStringRef MGCopyAnswer(CFStringRef key) WEAK_IMPORT_ATTRIBUTE;
  3、使用如下方法获取


view plaincopyprint?

[*]CFStringRef UDID = MGCopyAnswer(CFSTR("UniqueDeviceID"));
[*]CFStringRef IMEI =MGCopyAnswer(CFSTR("InternationalMobileEquipmentIdentity"));
[*]CFStringRefserialNumber = MGCopyAnswer(CFSTR("SerialNumber"));


view plaincopyprint?

[*]CFArrayRef ICCIDArray =MGCopyAnswer(CFSTR("CarrierBundleInfoArray"));
[*]CFDictionaryRef ICCIDDic =CFArrayGetValueAtIndex(ICCIDArray, 0);
[*]CFStringRef ICCID=CFDictionaryGetValue(ICCIDDic, CFSTR("IntegratedCircuitCardIdentity"));


view plaincopyprint?

[*]CFStringRefwifiAddress = MGCopyAnswer(CFSTR("WifiAddress"));
[*]CFStringRefbluetoothAddress = MGCopyAnswer(CFSTR("BluetoothAddress"));
[*]CFStringRefCPUArchitecture = MGCopyAnswer(CFSTR("CPUArchitecture"));
[*]CFStringRefproductType = MGCopyAnswer(CFSTR("ProductType"));
[*]CFTypeRefairplaneMode = MGCopyAnswer(CFSTR("AirplaneMode"));
[*]if (airplaneMode ==kCFBooleanTrue) { ... }
  4、经过测试发现这些方法在iOS7以下不用越狱就能取到、在iOS7中需要越狱并创建xxx.entitlements文件,添加如下权限
http://image91.360doc.com/DownloadImg/2015/11/2023/61825213_1
  5、在BuildSettings的Code SigningEntitlements中添加刚才创建的文件xxx.entitlements
  6、编译运行
  7、附上demo工程
  http://download.csdn.net/detail/ookcode/8247495
  8、我的环境
  Xcode 6.1
  iOS 8.1 SDK
  OS X 10.9.5
页: [1]
查看完整版本: 获取设备UDID、IMEI、ICCID、序列号、Mac地址等信息