一般收费并且有免费试用期的 APP 有两种验证策略:
这种方法比较简陋,可以用脚本等方法篡改使用期限。
这种方法应该可以躲避一些脚本,但获取唯一 id 是个难题,这也是我提出本问题的原因。
用以下代码可以获取一个系统的 id:
- (NSString *)getSystemID {
io_service_t platformExpert = IOServiceGetMatchingService(kIOMasterPortDefault,IOServiceMatching("IOPlatformExpertDevice"));
if (!platformExpert)
return nil;
CFTypeRef serialNumberAsCFString = IORegistryEntryCreateCFProperty(platformExpert,CFSTR(kIOPlatformUUIDKey),kCFAllocatorDefault, 0);
if (!serialNumberAsCFString)
return nil;
IOObjectRelease(platformExpert);
return (__bridge NSString *)(serialNumberAsCFString);;
}
获取的 id 和电脑打开系统报告看到的 Hardware UUID
是一样的,我认为这里的 Hardware UUID
字段有歧义,按我的理解应该是 UDID
.
关于 UUID 和 UDID:
我在研究另一款试用软件时候(仅学习研究用),发现它使用的 id 并不是这个 UDID,而且卸载重装时候发现,这个 id 还是之前的 id。既然不是 UDID,那么它有可能将 UUID 保存到 keychain 里来持久化,但是去 keychain 里并没有找到。
所以好奇它是如何做到的,在联网验证时候,一般使用哪一种 id ?
以上的测试软件是 Sip, 使用 charles 抓包验证此 id 非 UDID:
我的电脑 Hardware UUID
是 13C2951E-2B99-510A-BEF4-xxxxxxxxxx
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.