在iOS7之前, 可以方便的使用 [[UIDevice currentDevice] uniqueIdentifier] 來獲取設備的UDID,但是在iOS7之后這個方法不再適用。
你可以用[[UIDevicecurrentDevice]valueForKey:@"uniqueIdentifier"];來獲取到一個值,但這個值在iOS7中已經變成了FFFFFF+IDFV的值,顯然,這個值並不能唯一標識設備。
再談一談IMEI,這個值好像在5.0的sdk中就不見了,私有庫Message.framework的MFNetworkController.h中去掉了這個方法。
本以為iOS7及以上系統無法再獲取到這些值,但看看別人Cydia,不是取得好好的嗎?參考了一下Cydia的源碼:
可以看到它使用了libMobileGestalt.dylib這個動態庫,下面說一說具體如何操作。
1、導入libMobileGestalt.dylib庫
2、加入聲明
- OBJC_EXTERNCFStringRef MGCopyAnswer(CFStringRef key) WEAK_IMPORT_ATTRIBUTE;
3、使用如下方法獲取
- CFStringRef UDID = MGCopyAnswer(CFSTR("UniqueDeviceID"));
- CFStringRef IMEI =MGCopyAnswer(CFSTR("InternationalMobileEquipmentIdentity"));
- CFStringRefserialNumber = MGCopyAnswer(CFSTR("SerialNumber"));
- CFArrayRef ICCIDArray =MGCopyAnswer(CFSTR("CarrierBundleInfoArray"));
- CFDictionaryRef ICCIDDic =CFArrayGetValueAtIndex(ICCIDArray, 0);
- CFStringRef ICCID =CFDictionaryGetValue(ICCIDDic, CFSTR("IntegratedCircuitCardIdentity"));
- 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文件,添加如下權限

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
