我为Cydia做了一个付费的应用程序。我想验证用户是否正式购买了该应用程序。我已经发现,有一个Cydia Store API,但我有几个问题。有没有人曾经使用过它或者有没有其他方法来验证用户是否购买了它? API正在使用UDID,这在iOS 7中已无法访问,但Cydia和其他几个应用程序可以访问UDID。我想你可以用Verizon iPhone 4上串行+ IMEI + wifiMac + bluetoothMac的SHA1哈希和串口+ ECID + wifiMac + bluetoothMac的SHA1哈希来计算UDID。我可以得到序列号,但我不是能够获得IMEI,ECID,WiFi MAC和蓝牙MAC。是否有一种方法可以在iOS 7上获取UDID?
我真的很感谢你的帮助!
修改
经过漫长的一夜后,我想出了如何在iOS 7上获取设备的UDID。它相当容易。
将“libMobileGestalt.dlib”和“libMobileGestaltExtensions.dlib”添加到“链接的框架和库”
下载MobileGestalt.h并将其添加到您的项目中
复制以获取设备的UDID:
CFStringRef value = MGCopyAnswer(kMGUniqueDeviceID);
NSString * udid =(__ bridge NSString *)(value);
CFRelease(值);
现在我只需要知道如何正确计算签名。这是我目前的方式。
NSString *signature = [self hmacsha1:[[[[NSString stringWithFormat:@"%@", [[dataString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding] dataUsingEncoding:NSUTF8StringEncoding]] stringByReplacingOccurrencesOfString:@" " withString:@"+"] stringByReplacingOccurrencesOfString:@"<" withString:@""] stringByReplacingOccurrencesOfString:@">" withString:@""].uppercaseString key:@"abcdef0123456789abcdef0123456789"];
signature = [self toBase64String:signature];
signature = [[[signature stringByReplacingOccurrencesOfString:@"+" withString:@"_"] stringByReplacingOccurrencesOfString:@"/" withString:@"_"] stringByReplacingOccurrencesOfString:@"=" withString:@""];
但不知何故签名是错误的,所以回复是:signature=THE_SIGNATURE&error=invalide+signature+MY_QUERY
我不知道为什么,因为我是hmac_sha1用密钥散列文本,这是我的散列函数:
+(NSString *)hmacsha1:(NSString *)text key:(NSString *)secret {
const char *cKey = [secret cStringUsingEncoding:NSASCIIStringEncoding];
const char *cData = [text cStringUsingEncoding:NSASCIIStringEncoding];
unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];
CCHmac(kCCHmacAlgSHA1, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
NSData *HMAC = [[NSData alloc] initWithBytes:cHMAC
length:sizeof(cHMAC)];
NSString *hash = [HMAC base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];
return hash;
}