在我写的OS X应用程序(10.9+)中,我想确定非消费类应用程序内购买的原始购买日期 。这听起来很直接,但有两个相关领域,Apple的文档似乎没有明确说明如何将它们结合起来。
Apple的收据验证编程指南describes两个相关的收据字段:
购买日期 ...购买商品的日期和时间...... 对于恢复先前交易的交易,购买日期是恢复的日期。使用原始购买日期来获取原始交易的日期。
原始购买日期 ... 对于恢复先前交易的交易,即原始交易的日期。
我的麻烦在于“用于恢复先前交易的交易”。这意味着为了组合这两个字段,我需要知道交易是购买还是恢复。
在<SKPaymentTransactionObserver> paymentQueue:updatedTransactions:
方法中这很容易,因为在那里,我知道交易是SKPaymentTransactionStatePurchased
还是SKPaymentTransactionStateRestored
。
但是...... 当应用启动时,它需要根据之前的交易知道是否启用功能。我认为这应该通过检查仅收据来完成(我似乎记得WWDC演示文稿中谈到收据是“单一事实来源”)。
在交易处理代码中,我可以将有关客户应用内购买的信息填充到(例如)plist以供以后使用,但这似乎增加了(更)复杂性。
所以,如果我只检查收据(所以我不知道最近的交易是购买还是恢复),哪个字段包含原始购买日期
我正在使用Receigen来验证收据。这提供了宏<prefix>INAPP_ATTRIBUTETYPE_PURCHASEDATE
和<prefix>INAPP_ATTRIBUTETYPE_ORIGINALPURCHASEDATE
,我相信它们提供了C字符串。
我可以想到一些方法(伪代码):
// method one
// assume that Original Purchase Date is always present
return ORIGINALPURCHASEDATE
// method two
// when present, Original Purchase Date overrides Purchase Date
if (ORIGINALPURCHASEDATE == "") {
return PURCHASEDATE
} else {
return ORIGINALPURCHASEDATE
}
// method three
// consider all possible combinations
// of the two values being present / not present
if (PURCHASEDATE != "" && ORIGINALPURCHASEDATE == "") {
// have only PURCHASEDATE
return PURCHASEDATE
} else if (PURCHASEDATE == "" && ORIGINALPURCHASEDATE != "") {
// have only ORIGINALPURCHASEDATE
return ORIGINALPURCHASEDATE
} else if (PURCHASEDATE != "" && ORIGINALPURCHASEDATE != "") {
// have both: use the earlier value
return min(PURCHASEDATE, ORIGINALPURCHASEDATE)
} else {
// have neither
return UNKNOWN
}
...但是与客户付款相关的代码中的这种猜测让我担心:(
我将尝试在沙盒中进行一些实验来验证这一点,但我已经看到沙箱行为并不总是与生产环境相匹配的评论。
任何人都可以确认在这里做正确的事吗?
更新
为了获得更多信息,我使用SCPStoreKitManager中的一些类(它有一些可爱的清晰代码)汇总了一个工具,该工具使用DumpMASReceipt-v1.zip中的一些类转储_MASReceipt/receipt
中所有/Applications
个文件的内容。 )。在我的机器上,输出包括:
/Applications/Dash-2.2.6.app/Contents/_MASReceipt/receipt
{
bundleIdentifier = "com.kapeli.dash";
bundleIdentifierData = <0c0f636f 6d2e6b61 70656c69 2e646173 68>;
hash = <acec4273 8a9bf57a 1d3ed8ab f7a4c696 497f2ae1>;
inAppPurchases = (
{
cancellationDate = "";
originalPurchaseDate = "2012-08-13 00:07:48 +0000";
originalTransactionIdentifier = 220000033036694;
productIdentifier = DPinky;
purchaseDate = "2012-08-13 00:07:48 +0000";
quantity = 1;
subscriptionExpiryDate = "";
transactionIdentifier = 220000033036694;
webItemId = "";
}
);
opaqueValue = <f50b37c7 ac1e9a02 ddb579ca 5c5dad62>;
originalVersion = "1.6.6";
version = "2.2.6";
}
在这种情况下,purchaseDate
和originalPurchaseDate
都存在,并且具有相同的值。
这是我有一个应用内购买的OS X收据的唯一例子。
任何人都可以提供更多示例吗?我特别感兴趣的是看到那些价值不同或不存在的收据。
我上传了此工具的二进制文件和来源:{{3}}。