libMobileGestalt与UDID

在iOS中,libMobileGestalt动态库, 用来取得各种系统变量,比如UDID, 磁盘使用量, 设备版本

在iOS7中,对于开发者来说,一个头痛的问题是:UIDI完全是失效了
从iOS5开始,Apple就禁止程序获得设备的UDID
在iOS6中, 可以用 [[UIDevice currentDevice] uniqueIdentifier] 来获取

在Cydia中,可以获取

http://gitweb.saurik.com/cydia.git/blob/90bf9a3d170ab2dc4701c76f7b3911308211f542:/MobileCydia.mm

static CFStringRef (*$MGCopyAnswer)(CFStringRef);

void *gestalt(dlopen(“/usr/lib/libMobileGestalt.dylib”, RTLDGLOBAL | RTLDLAZY));
$MGCopyAnswer = reinterpret_cast(dlsym(gestalt, “MGCopyAnswer”));

(id)$MGCopyAnswer(CFSTR(“UniqueDeviceID”));

http://hiraku.tw/2013/12/3316/

#import "UIDevice+MobileGestaltCategroy.h"

@implementation UIDevice (MobileGestalt)

// Mobile Gestalt EquipmentInfo
extern CFTypeRef MGCopyAnswer(CFStringRef); - (NSString *)UDID {
NSString *retVal = nil;
CFTypeRef tmp = MGCopyAnswer(CFSTR("UniqueDeviceID"));
if (tmp) {
retVal = [NSString stringWithString:tmp];
CFRelease(tmp);
}
return retVal;
} - (NSString *)IMEI {
NSString *retVal = nil;
CFTypeRef tmp = MGCopyAnswer(CFSTR("InternationalMobileEquipmentIdentity"));
if (tmp) {
retVal = [NSString stringWithString:tmp];
CFRelease(tmp);
}
return retVal;
} - (NSString *)ICCID {
NSString *retVal = nil;
CFArrayRef infoArray = MGCopyAnswer(CFSTR("CarrierBundleInfoArray"));
if (infoArray) {
CFDictionaryRef infoDic = CFArrayGetValueAtIndex(infoArray, 0);
if (infoDic) {
retVal = [NSString stringWithString:CFDictionaryGetValue(infoDic, CFSTR("IntegratedCircuitCardIdentity"))];
}
CFRelease(infoArray);
}
return retVal;
} - (NSString *)serialNumber {
NSString *retVal = nil;
CFTypeRef tmp = MGCopyAnswer(CFSTR("SerialNumber"));
if (tmp) {
retVal = [NSString stringWithString:tmp];
CFRelease(tmp);
}
return retVal;
} - (NSString *)wifiAddress {
NSString *retVal = nil;
CFTypeRef tmp = MGCopyAnswer(CFSTR("WifiAddress"));
if (tmp) {
retVal = [NSString stringWithString:tmp];
CFRelease(tmp);
}
return retVal;
} - (NSString *)bluetoothAddress {
NSString *retVal = nil;
CFTypeRef tmp = MGCopyAnswer(CFSTR("BluetoothAddress"));
if (tmp) {
retVal = [NSString stringWithString:tmp];
CFRelease(tmp);
}
return retVal;
} - (NSString *)cpuArchitecture {
NSString *retVal = nil;
CFTypeRef tmp = MGCopyAnswer(CFSTR("CPUArchitecture"));
if (tmp) {
retVal = [NSString stringWithString:tmp];
CFRelease(tmp);
}
return retVal;
} - (NSString *)productType {
NSString *retVal = nil;
CFTypeRef tmp = MGCopyAnswer(CFSTR("ProductType"));
if (tmp) {
retVal = [NSString stringWithString:tmp];
CFRelease(tmp);
}
return retVal;
} - (BOOL)airplaneMode {
BOOL retVal = NO;
CFTypeRef tmp = MGCopyAnswer(CFSTR("AirplaneMode"));
if (tmp) {
if (tmp == kCFBooleanTrue) {
retVal = YES;
}
CFRelease(tmp);
}
return retVal;
} @end

libMobileGestalt与UDID的更多相关文章

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

    在iOS7之前, 可以方便的使用 [[UIDevice currentDevice] uniqueIdentifier] 来获取设备的UDID,但是在iOS7之后这个方法不再适用. 你可以用[[UID ...

  2. 通过安装一个描述文件在控制台获得设备的udid

    在我的这篇博客里面说明了本地获得设备udid的方法,但是只能在模拟器中获得http://www.cnblogs.com/liyy2015/p/6090204.html 当然可以在设备上集成苹果的MDM ...

  3. 获得设备的唯一标识符UDID

    在IOS5之后,苹果为避免根据UDID获得用户的信息,而禁止使用uniqueIdentifier获得UDID,但是仍有些应用需要根据UDID区分设备 有一个系统的库IOKit.framework可以获 ...

  4. iOS平台UDID方案比较

    苹果在iOS6中禁用了[UIDevice uniqueIdentifier],在iOS7中又把mac地址的获取给堵上了.没办法,毕竟人家是老大,说不让你用,你也没办法.在这边总结一下现有的一部分UDI ...

  5. 获取iPhone手机的UDID和设备名称.

    关于设备名称: iPhone的设备名称也可以在手机上面查看到:设置-通用-关于本机-名称(设备名称是可以自己改的) 关于UUID: 什么?用了iPhone这么久你不知道什么叫UDID! UDID 是由 ...

  6. 如何获取苹果手机的UDID

    获取苹果手机的UDID有很多种,比如Xcode,iTunes等等吧,个人比较推荐使用iTunes,因为比较官方,而且苹果电脑自带的有,而且Windows也可以下载安装. 1.下载安装itunes(点击 ...

  7. UUID UDID

    Google搜索关键字Difference between UUID and UDID,在stackoverflow看见解释,我翻译过来,如下所述. UUID(Universally Unique I ...

  8. 如何查看设备的 UDID

    手机连接上电脑,打开 Xcode,确认手机已连上: command+shift+2,就可以查看到 UDID 了:

  9. 获取 苹果UDID 序列号

    UDID是什么? UDID 是由子母和数字组成的40个字符串的序号,用来区别每一个唯一的iOS设备,包括 iPhones, iPads, 以及 iPod touches,这些编码看起来是随机的,实际上 ...

随机推荐

  1. 亲身体验:digitalocean vps能做的10件事

    我写过一篇亲身体验:digitalocean和linode评测哪个好,帮助不少网友选购价格便宜性能优异的免备案vps,相信大家对两家产品有所了解.vps的性能和用途远远超过传统的虚拟主机,你拥有独立I ...

  2. 多线程---其他方法 停止线程、守护线程、join方法

    第三方停止线程: 原来是stop(),因为该方法有些问题,所以被interrupt()方法取代,它的用途跟机制是 当没有指定的方式让冻结的线程恢复到运行状态时,这时需要对冻结进行清除,强制让线程恢复到 ...

  3. Openjudge-计算概论(A)-苹果和虫子

    描述 你买了一箱n个苹果,很不幸的是买完时箱子里混进了一条虫子.虫子每x小时能吃掉一个苹果,假设虫子在吃完一个苹果之前不会吃另一个,那么经过y小时你还有多少个完整的苹果? 输入输入仅一行,包括n,x和 ...

  4. G - 娜娜梦游仙境系列——梦醒

    G - 娜娜梦游仙境系列——梦醒 Time Limit: 2000/1000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Others) ...

  5. 【python问题系列--3】TypeError: 'builtin_function_or_method' object has no attribute '__getitem__'

    p0V,p1V,pSpam=trainNBO(array[trainMat],array(trainClasses)) 改为: p0V,p1V,pSpam=trainNBO(array(trainMa ...

  6. UIScrollView 加载多个view view还可以交换顺序(2)

    在上的代码中 UIview都在一个页面 要是每一个view对应一个页面 操作每一个view代码都在viewcontroller里面就会很乱,那么我们就将view重新做一下 创建想要的页面继承与view ...

  7. [css3动画]渐隐渐现

    测试 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8& ...

  8. touchesBegan: withEvent: <--- with UIScrollView / UIImageView

    touchesBegan: withEvent: / touchesMoved: withEvent: / touchesEnded: withEvent: 等只能被UIView捕获(如有问题请指出对 ...

  9. OpenJDK和JDK的区别

    作者:Aloys寒风链接:https://www.zhihu.com/question/19646618/answer/40621705来源:知乎著作权归作者所有,转载请联系作者获得授权. 使用过LI ...

  10. RLE行程长度编码压缩算法

    在看emWIN的时候看到一个图片压缩的算法可以有效的对二值图(简单的2中颜色或者更多)进行压缩,压缩的效果可以节省空间而且不丢失信息! 特点 一种压缩过的位图文件格式,RLE压缩方案是一种极其成熟的压 ...