在iOS7以前, 能夠方便的使用 [[UIDevice currentDevice] uniqueIdentifier] 來獲取設備的UDID,可是在iOS7以後這個方法再也不適用。html
你能夠用[[UIDevicecurrentDevice]valueForKey:@"uniqueIdentifier"];來獲取到一個值,但這個值在iOS7中已經變成了FFFFFF+IDFV的值,顯然,這個值並不能惟一標識設備。git
再談一談IMEI,這個值好像在5.0的sdk中就不見了,私有庫Message.framework的MFNetworkController.h中去掉了這個方法。web
本覺得iOS7及以上系統沒法再獲取到這些值,但看看別人Cydia,不是取得好好的嗎?參考了一下Cydia的源碼:測試
MobileCydia.mmui
能夠看到它使用了libMobileGestalt.dylib這個動態庫,下面說一說具體如何操做。.net
一、導入libMobileGestalt.dylib庫3d
二、加入聲明code
- OBJC_EXTERNCFStringRef MGCopyAnswer(CFStringRef key) WEAK_IMPORT_ATTRIBUTE;
三、使用以下方法獲取htm
- 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) { ... }
四、通過測試發現這些方法在iOS7如下不用越獄就能取到、在iOS7中須要越獄並建立xxx.entitlements文件,添加以下權限ip

五、在BuildSettings的Code SigningEntitlements中添加剛纔建立的文件xxx.entitlements
六、編譯運行
七、附上demo工程
http://download.csdn.net/detail/ookcode/8247495
八、個人環境
Xcode 6.1
iOS 8.1 SDK
OS X 10.9.5