iOS 7 對開發者來說一個頭痛的問題就是:UDID 完全無效了。
雖然 iOS 5 開始 Apple 就逐漸禁用 UDID,
但是到 iOS 6 之前其實還是可以偷偷用 [[UIDevice currentDevice] uniqueIdentifier] 呼叫,
只是應該是不能上架,所以只有 JB 軟體在用。
不過現在連這個方法都被擋了,
還好我偷看了 Cydia 的 source code ,發現原來可以繞道而行
首先寫上這行:
static CFStringRef (*$MGCopyAnswer)(CFStringRef);
之後在要抓 UDID 的 function 前加上:
void *gestalt(dlopen("/usr/lib/libMobileGestalt.dylib", RTLD_GLOBAL | RTLD_LAZY)); $MGCopyAnswer = reinterpret_cast<CFStringRef (*)(CFStringRef)>(dlsym(gestalt, "MGCopyAnswer"));
最後用
(id)$MGCopyAnswer(CFSTR("UniqueDeviceID"));
就可以抓到 UDID 了!
不過身為懶人當然直接 hook UIDevice 比較快(炸)
static CFStringRef (*$MGCopyAnswer)(CFStringRef); %hook UIDevice -(NSString *)uniqueIdentifier { if (kCFCoreFoundationVersionNumber > 800) { void *gestalt(dlopen("/usr/lib/libMobileGestalt.dylib", RTLD_GLOBAL | RTLD_LAZY)); $MGCopyAnswer = reinterpret_cast<CFStringRef (*)(CFStringRef)>(dlsym(gestalt, "MGCopyAnswer")); return (id)$MGCopyAnswer(CFSTR("UniqueDeviceID")); } else %orig; } %end
之後就可以繼續用 [[UIDevice currentDevice] uniqueIdentifier] 爽一年了 XDXD