所以我最近使用Apple广泛使用的sample code添加了一些客户端IAP收据验证。
样本主要是向Apple的服务器发送收据数据,基本上是询问它是否是真实的收据。但它还包括一些简单的,本地执行的验证。其中一部分是获取交易的“购买信息”,这是一个64位编码的属性列表,描述了购买。
该属性列表如下所示:
{
"original-purchase-date-pst" = "2013-10-25 10:04:44 America/Los_Angeles";
"unique-identifier" = "15546137c0c5c74672ce8b71223ad173fc2b2ac2";
"original-transaction-id" = "1000000055641224";
"bvrs" = "1.7";
"transaction-id" = "100000008886513";
"quantity" = "1";
"original-purchase-date-ms" = "1382720684000";
"unique-vendor-identifier" = "73F61531-4415-451B-A144-65165012BC51";
"product-id" = "com.fakeco.FakeGame.GoldCookieBundle_1";
"item-id" = "555555555";
"bid" = "com.fakeco.FakeGame";
"purchase-date-ms" = "1382720684000";
"purchase-date" = "2013-10-25 17:04:44 Etc/GMT";
"purchase-date-pst" = "2013-10-25 10:04:44 America/Los_Angeles";
"original-purchase-date" = "2013-10-25 17:04:44 Etc/GMT";
}
Apple的代码使用NSPropertyListSerialization的propertyListWithData:方法从此plist创建字典。但是这个函数为我返回一个错误:
kCFPropertyListOldStyleParsingError
Unexpected character { at line 1
所以,在稍微探讨了Apple的文档之后,我了解到这个ASCII键值列表是plists的"old style"表示。
根据格式,plist可以表示NSString,NSArray,NSData或NSDictionary。它说,NSDicitonary“用花括号括起来”。但是我得到的错误是抱怨我的开口大括号是“出乎意料的”。
因此,作为测试,我在调用propertyListWithData:方法之前添加了一些代码来删除大括号。
decodedPurchaseInfo = [decodedPurchaseInfo stringByReplacingOccurrencesOfString:@"{" withString:@""];
decodedPurchaseInfo = [decodedPurchaseInfo stringByReplacingOccurrencesOfString:@"}" withString:@""];
然后它奏效了! propertyListWithData:方法正确返回了具有预期键值对的NSDictionary。
有没有人有一些可以帮助我的见解?我发现很难相信我是唯一遇到此问题的人...我的意思是,其他人必须使用这个示例代码,对吗?
但我绝对不想要做的就是删除大括号并将其称为“已修复”。
“如果你不知道为什么它被修复了,那就不固定了。”