3

在我正在编写的 OS X 应用程序(10.9+)中,我想确定非消耗性应用内购买原始购买日期。这听起来很简单,但有两个相关领域,Apple 的文档似乎没有明确说明如何将它们结合起来。

Apple 的收据验证编程指南描述了两个相关的收据字段:

购买日期... 购买该项目的日期和时间... 对于恢复先前交易的交易,购买日期是恢复的日期。使用原始购买日期获取原始交易的日期。

原始购买日期... 对于恢复先前交易的交易,原始交易的日期。

我的麻烦在于“用于恢复先前交易的交易”。这意味着为了组合这两个字段,我需要知道交易是购买还是恢复。

这在我的方法中很容易<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中的一些类(其中有一些可爱的清晰代码) ,将所有_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";
}

在这种情况下,两者purchaseDateoriginalPurchaseDate都存在,并且具有相同的值。

这是我拥有的带有应用内购买的 OS X 收据的唯一示例。

谁能提供更多的例子?我特别有兴趣查看这些值不同或不存在的收据。

我已经上传了这个工具的二进制文件和源代码:DumpMASReceipt-v1.zip

4

0 回答 0