在應用程序啓動時添加事務隊列觀察器
當您的應用程序通話時,StoreKit將觀察者附加到付款隊列
SKPaymentQueue.default()。添加(your_observer)
StoreKit會在恢復或運行應用程序時,在付款隊列的內容更改時自動通知您的觀察者。在啓動時添加應用程序的觀察者可確保在應用程序的所有啓動過程中都會持續,從而允許您的應用程序接收所有支付隊列通知。
考慮一個應用程序的案例,其DetailViewController類在向隊列中添加付款請求之前創建一個觀察者,如清單1所示。只要DetailViewController創建它的實例存在,這個觀察者就會存在。在出現諸如網絡故障等中斷的情況下,該應用程序不會完成購買過程,相關聯的交易將停留在付款隊列中。當應用程序恢復時,它沒有觀察者,因爲上述觀察者在您的應用程序發送到後臺時被釋放。因此,您的應用程序將不會收到有關隊列中的事務的通知。
清單1不遵循實現交易觀察者的最佳做法:當客戶嘗試購買產品時,App會在付款隊列中添加一個觀察者。
導入UIKit
導入StoreKit
類DetailViewController:UIViewController,SKPaymentTransactionObserver {
....
//當客戶嘗試購買產品時調用。
@IBAction func purchase(_ sender:UIButton){
//將觀察者註冊到付款隊列。
SKPaymentQueue.default()。添加(your_observer)
//創建付款請求
讓付款= SKMutablePayment(產品:產品)
//將付款請求提交到付款隊列。
SKPaymentQueue.default()。添加(付款)
}
....
}
有關正確註冊事務隊列觀察器的示例,請參見清單2。
清單2遵循註冊交易觀察者的最佳做法。
導入UIKit
導入StoreKit
類AppDelegate:UIResponder,UIApplicationDelegate {
....
//將觀察者附加到付款隊列。
func應用程序(_應用程序:UIApplication,didFinishLaunchingWithOptions launchOptions:[UIApplicationLaunchOptionsKey:Any]?) - > Bool {
//將觀察者附加到付款隊列。
SKPaymentQueue.default()。添加(your_observer)
返回真
}
//當應用程序即將終止時調用。
func applicationWillTerminate(_ application:UIApplication){
//刪除觀察者。
SKPaymentQueue.default()。刪除(your_observer)
}
....
}
當您的應用程序通話時,StoreKit會從支付隊列中刪除觀察者
SKPaymentQueue.default()。刪除(your_observer)
因此,StoreKit可能會嘗試通知上述觀察者,如果它沒有從付款隊列中刪除,從而導致您的應用程序崩潰,因爲觀察者不再存在。
重要提示:應用程序應避免在調用UIApplicationMain(_:_:_:_ :)之前初始化SKPaymentQueue。否則可能會導致意外的行爲。因此,請確保在應用程序的委託應用程序(_:didFinishLaunchingWithOptions :)方法中初始化SKPaymentQueue,如清單2所示。
在呈現應用程序的商店UI之前,查詢App Store中的產品信息
您的應用程序必須首先向App Store發送產品請求,然後再決定在其用戶界面中顯示要購買的產品。發送產品請求可讓您確定您的產品是否可在App Store中銷售,從而阻止您顯示在您的應用中無法購買的產品。請參閱檢索產品信息以瞭解如何創建產品請求。應用商店用SKResponse對象響應您的產品請求。使用其products屬性來更新您的用戶界面,從而確保您的客戶只能在App Store中提供可銷售的產品。
清單3不遵循呈現應用內購買產品的最佳做法:應用程序在呈現出售產品信息後查詢App Store。
導入UIKit
導入StoreKit
類DetailViewController類:UIViewController,SKProductsRequestDelegate,SKPaymentTransactionObserver {
var productRequest:SKProductsRequest!
....
//應用程序首先顯示要銷售的產品,然後在App Store上查詢
//客戶嘗試購買。
@IBAction func purchase(_ sender:UIButton){
//爲您的產品標識符創建一個集合。
let identifier = Set(your_product_identifier)
//使用上述設置初始化產品請求。
productRequest = SKProductsRequest(productIdentifiers:identifier)
productRequest.delegate = self
//將請求發送到App Store。
productRequest.start()
}
//獲取App Store的響應。
func productsRequest(_ request:SKProductsRequest,didReceive response:SKProductsResponse){
//我們賣第一個可用的產品。
讓product = response.products.first!
讓付款= SKMutablePayment(產品:產品)
SKPaymentQueue.default()。添加(付款)
}
}
請參閱清單4,瞭解呈現應用內購買產品的最佳做法的示例。
清單4遵循呈現應用內購買產品的最佳做法。
導入UIKit
導入StoreKit
類DetailViewController類:UIViewController,SKProductsRequestDelegate,SKPaymentTransactionObserver {
var productRequest:SKProductsRequest!
//從App Store獲取有關您的產品的信息。
func fetchProducts(matchingIdentifiers identifier:[String]){
//爲您的產品標識符創建一個集合。
讓productIdentifiers = Set(identifier)
//使用上述設置初始化產品請求。
productRequest = SKProductsRequest(productIdentifiers:productIdentifiers)
productRequest.delegate = self
//將請求發送到App Store。
productRequest.start()
}
//獲取App Store的響應
func productsRequest(_ request:SKProductsRequest,didReceive response:SKProductsResponse){
//如果沒有可供出售的產品,則不會進行購買。
//因此,StoreKit不會提示您的客戶對其購買進行驗證。
如果response.products.count> 0 {
//使用availableProducts來填充你的UI。
讓可用產品= response.products
}
}
}
提供用於恢復產品的UI
如果您的應用程序銷售非消耗品,自動續訂訂閱或非續訂訂閱產品,那麼您必須提供一個允許它們恢復的UI。有關詳細信息,請參閱產品類型與恢復購買產品之間的差異。
處理交易
當您的應用程式來電時,StoreKit會向付款隊列添加付款請求
SKPaymentQueue.default()。添加(your_payment)
隊列創建一個事務對象來處理此請求。paymentQueue(_:updatedTransactions:)當這個事務的狀態改變時,StoreKit通過調用它的方法來通知你的觀察者。每個交易都有五種可能的狀態,如應用內購買編程指南>交付產品>表4-1交易狀態和相應的操作。確保您的觀察者paymentQueue(_:updatedTransactions:)可以隨時響應任何這些狀態。paymentQueue(_:updatedDownloads:)如果您的應用程序提供由Apple託管的產品,請在觀察者上實施該方法。
提供付費內容
發送內容或解鎖您的應用程序的功能,當您的應用程序收到狀態爲purchased或的交易restored。這些州表示已收到正在銷售的產品的付款。因此,您的客戶希望獲得付費內容。如果您購買的產品包含App Store中的託管內容,請務必致電SKPaymentQueuestart(_:)以下載內容。有關詳細信息,請參閱解鎖應用程序功能和交付關聯內容。
完成交易
交易保留在付款隊列中,直到它們被刪除。每當paymentQueue(_:updatedTransactions:)您的應用程序啓動或從後臺恢復直到刪除後,StoreKit將會調用您的觀察者。爲此,您的客戶可能會一再被要求驗證其購買或被阻止購買您的產品。
調用finishTransaction(_:)您的事務將其從隊列中刪除。已完成的交易無法收回。因此,在完成交易之前,請務必提供您的內容,下載所有Apple託管的產品內容,或完成購買流程。有關詳細信息,請參閱完成事務。
測試您的應用內購買的實施
在提交應用程序進行審查之前,請務必徹底測試應用內購買的實施。請參閱各種場景的建議測試步驟,以測試您的實施和TN2413:應用內購買常見問題解答問題。
始終使用生產URL首先驗證您的收據
如果您正在進行收據驗證,請務必首先使用生產URL(https://buy.itunes.apple.com/verifyReceipt)驗證您的收據。即使在沙箱環境中使用您的應用程序的情況也適用。App Review將在沙盒中查看您的應用的生產版本。當您的應用程序處理收據時,它必須能夠檢測21007收貨狀態代碼,並將收據發送到沙箱收據驗證服務器(https://sandbox.itunes.apple.com/verifyReceipt)。一旦您的應用程序在生產環境中被批准並運行,首先將收據發送到生產服務器是正確的操作。查看我應該用什麼url驗證我的收據?瞭解更多信息。