1. 程式人生 > 其它 >iOS內購恢復購買

iOS內購恢復購買

iOS內購IAP(十) —— 程式設計指南之恢復購買的產品(一)

https://www.jianshu.com/p/4cbbea03f24f

Restoring Purchased Products - 恢復購買的產品

使用者恢復交易以維持對已購買內容的訪問許可權。例如,當他們升級到新手機時,他們不會丟失他們在舊手機上購買的所有商品。在您的應用中包含一些機制,讓使用者恢復購買,例如Restore Purchases按鈕。恢復購買會提示使用者的App Store憑據,這會中斷您的應用流量:因此,請勿自動恢復購買,尤其是每次啟動應用時都不會。

在大多數情況下,您的所有應用程式需要重新整理收據並在收據中交付產品。重新整理的收據包含使用者在此應用程式,此裝置或任何其他裝置上購買的記錄。但是,由於以下原因之一,某些應用需要採用其他方法:

  • 如果您使用Apple託管的內容,則恢復已完成的交易會為您的應用程式提供用於下載內容的交易物件。
  • 如果您需要支援早於iOS 7的iOS版本(應用程式收據不可用),請恢復已完成的交易。
  • 如果您的應用使用非續訂訂閱,則您的應用負責恢復過程。

重新整理收據會向App Store詢問收據的最新副本。 重新整理收據不會建立任何新交易。 雖然您應該避免連續多次重新整理,但此操作與僅重新整理一次的結果相同。

恢復已完成的事務會為使用者完成的每個已完成事務建立一個新事務,實質上是為事務佇列觀察者重放歷史記錄。 在恢復事務時,您的應用程式會維護自己的狀態,以跟蹤恢復已完成事務的原因以及如何處理它們。 多次還原會為每個已完成的事務建立多個已還原的事務。

注意:如果使用者嘗試購買已購買的產品,而不是使用應用程式的恢復介面,則App Store會建立常規事務而不是恢復事務。 不再向使用者收取產品費用。 處理這些交易的方式與處理原始交易的方式完全相同。

為使用者提供對重新下載的內容的適當控制級別。 例如,不要一次下載三年的日報或數百兆的遊戲關卡。


Refreshing the App Receipt - 重新整理應用程式收據

建立收據重新整理請求,設定委託,然後啟動請求。 該請求支援在測試期間以各種狀態獲取收據的可選屬性,例如過期收據 - 有關詳細資訊,請參閱SKReceiptRefreshRequestinitWithReceiptProperties:

方法的值。

request = [[SKReceiptRefreshRequest alloc] init];
request.delegate = self;
[request start];

收據重新整理後,檢查並交付任何已新增的產品。


Restoring Completed Transactions - 恢復已完成的交易

您的應用程式通過呼叫SKPaymentQueuerestoreCompletedTransactions方法啟動該過程。 這會向App Store傳送請求,以恢復所有應用已完成的交易。 如果您的應用為其支付請求的applicationUsername屬性設定了值,如Detecting Irregular Activity中所述,請使用restoreCompletedTransactionsWithApplicationUsername:方法在還原事務時提供相同的資訊。

App Store為先前完成的每個事務生成新事務。 已還原的事務具有對原始事務的引用:SKPaymentTransaction的例項具有originalTransaction屬性,並且收據中的條目具有Original Transaction Identifier欄位。

注意:日期欄位對恢復購買的含義略有不同。 有關詳細資訊,請參閱Receipt Validation Programming Guide中的Purchase Date and Original Purchase Date欄位。

對於每個恢復的事務,將呼叫狀態為SKPaymentTransactionStateRestored的事務佇列觀察器,如Waiting for the App Store to Process Transactions中所述。 您此時採取的操作取決於您的應用程式的設計。

  • 如果您的應用使用應用收據並且沒有Apple託管的內容,則不需要此程式碼,因為您的應用無法恢復已完成的交易。 立即完成任何恢復的事務。
  • 如果您的應用使用應用收據並且擁有Apple託管的內容,請讓使用者在開始恢復過程之前選擇要恢復的產品。 在恢復期間,重新下載使用者選擇的內容並立即完成任何其他事務。
NSMutableArray *productIDsToRestore = <# From the user #>;
SKPaymentTransaction *transaction = <# Current transaction #>;
 
if ([productIDsToRestore containsObject:transaction.transactionIdentifier]) {
    // Re-download the Apple-hosted content, then finish the transaction
    // and remove the product identifier from the array of product IDs.
} else {
    [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}
  • 如果您的應用不使用應用收據,則會在恢復後檢查所有已完成的交易。 它使用與原始購買邏輯類似的程式碼路徑來使產品可用,然後完成交易。

具有多個產品的應用程式(尤其是具有相關內容的產品)允許使用者選擇要恢復的產品,而不是一次性恢復所有產品。 這些應用程式會跟蹤哪些已完成的事務在恢復時需要處理,哪些事務可以通過立即完成來忽略。

後記

本篇主要講述了恢復購買的產品,感興趣的給個贊或者關注~~~~