獲取設備UDID、IMEI、ICCID、序列號、Mac地址等信息


在iOS7之前, 可以方便的使用 [[UIDevice currentDevice] uniqueIdentifier] 來獲取設備的UDID,但是在iOS7之后這個方法不再適用。

 

你可以用[[UIDevicecurrentDevice]valueForKey:@"uniqueIdentifier"];來獲取到一個值,但這個值在iOS7中已經變成了FFFFFF+IDFV的值,顯然,這個值並不能唯一標識設備。

 

再談一談IMEI,這個值好像在5.0的sdk中就不見了,私有庫Message.framework的MFNetworkController.h中去掉了這個方法。

 

本以為iOS7及以上系統無法再獲取到這些值,但看看別人Cydia,不是取得好好的嗎?參考了一下Cydia的源碼:

MobileCydia.mm

可以看到它使用了libMobileGestalt.dylib這個動態庫,下面說一說具體如何操作。

 

1、導入libMobileGestalt.dylib庫

2、加入聲明

 

[objc]  view plain copy print ?
 
  1. OBJC_EXTERNCFStringRef MGCopyAnswer(CFStringRef key) WEAK_IMPORT_ATTRIBUTE;  

 

 

3、使用如下方法獲取

[objc]  view plain copy print ?
 
  1. CFStringRef UDID = MGCopyAnswer(CFSTR("UniqueDeviceID"));  
  2. CFStringRef IMEI =MGCopyAnswer(CFSTR("InternationalMobileEquipmentIdentity"));  
  3. CFStringRefserialNumber = MGCopyAnswer(CFSTR("SerialNumber"));  
[objc]  view plain copy print ?
 
  1. CFArrayRef ICCIDArray =MGCopyAnswer(CFSTR("CarrierBundleInfoArray"));  
  2. CFDictionaryRef ICCIDDic =CFArrayGetValueAtIndex(ICCIDArray, 0);  
  3. CFStringRef ICCID  =CFDictionaryGetValue(ICCIDDic, CFSTR("IntegratedCircuitCardIdentity"));  
[objc]  view plain copy print ?
 
  1. CFStringRefwifiAddress = MGCopyAnswer(CFSTR("WifiAddress"));  
  2. CFStringRefbluetoothAddress = MGCopyAnswer(CFSTR("BluetoothAddress"));  
  3. CFStringRefCPUArchitecture = MGCopyAnswer(CFSTR("CPUArchitecture"));  
  4. CFStringRefproductType = MGCopyAnswer(CFSTR("ProductType"));  
  5. CFTypeRefairplaneMode = MGCopyAnswer(CFSTR("AirplaneMode"));  
  6. if (airplaneMode ==kCFBooleanTrue) { ... }  

 

4、經過測試發現這些方法在iOS7以下不用越獄就能取到、在iOS7中需要越獄並創建xxx.entitlements文件,添加如下權限

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM