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 - 刷新應用程序收據
創建收據刷新請求,設置委托,然后啟動請求。 該請求支持在測試期間以各種狀態獲取收據的可選屬性,例如過期收據 - 有關詳細信息,請參閱SKReceiptRefreshRequest的initWithReceiptProperties:方法的值。
request = [[SKReceiptRefreshRequest alloc] init]; request.delegate = self; [request start];
收據刷新后,檢查並交付任何已添加的產品。
Restoring Completed Transactions - 恢復已完成的交易
您的應用程序通過調用SKPaymentQueue的restoreCompletedTransactions方法啟動該過程。 這會向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]; }
- 如果您的應用不使用應用收據,則會在恢復后檢查所有已完成的交易。 它使用與原始購買邏輯類似的代碼路徑來使產品可用,然后完成交易。
具有多個產品的應用程序(尤其是具有相關內容的產品)允許用戶選擇要恢復的產品,而不是一次性恢復所有產品。 這些應用程序會跟蹤哪些已完成的事務在恢復時需要處理,哪些事務可以通過立即完成來忽略。
后記
本篇主要講述了恢復購買的產品,感興趣的給個贊或者關注~~~~