StoreKit是蘋果提供的一個用于提供付費內容和服務的交易框架,其中定義了若干類和協(xié)議以及常量,下面將常用的內容進行無責任官方文檔翻譯.
由于涉及財務內容務必小心謹慎,因此在使用StoreKit框架時的錯誤處理尤為重要.在使用過程中,有多種可能導致付費請求錯誤的原因,其中主要的原因有商品信息錯誤\付費詳情錯誤\與iTunesConnect帳號連接錯誤以及網絡連接錯誤等.在處理錯誤的代理方法:request:didFailWithError:中提供了兩個用于描述導致失敗原因的參數(shù):domain和code,這兩個參數(shù)的類型是SKErrorDomain和SKErrorCode.用于描述與付費\產品\云服務相關的錯誤域和錯誤代碼.如果要了解更多解決問題的方法,可以參考蘋果的In-App Purchase FAQ文檔.使用中常見的錯誤還包括網絡錯誤,NSURLErrorDomain描述了在使用StoreKit過程中常見的網絡錯誤類型.

框架中常用的類介紹
SKCloudServiceController
SKCloudServiceController對象用于確定用戶音樂庫的功能,比如是否允許訪問Apple Music目錄和媒體庫中的歌曲.
+authorizationStatus?:用來獲取用戶在設備上設置的訪問系統(tǒng)音樂庫的授權類型.
+requestAuthorization:用來申請訪問系統(tǒng)音樂庫訪問權限的方法.
-requestCapabilitiesWithCompletionHandler:獲取當前設備與系統(tǒng)音樂庫有關的功能.
-requestStorefrontIdentifierWithCompletionHandler:獲取設備的Storefront標識.
-requestPersonalizationTokenForClientToken:withCompletionHandler:請求設備令牌.
SKStorefrontIdentifierDidChangeNotification:當設備的storefront標識發(fā)生改變時發(fā)送的通知.
SKCloudServiceCapabilitiesDidChangeNotification:當設備的系統(tǒng)音樂庫相關功能發(fā)生改變時發(fā)送的通知.
SKCloudServiceSetupViewController
(該類自iOS10.1可用,不詳解)
用于實施云服務安裝的ViewController,如Apple Music訂閱.
SKDownload
SKDownload對象代表了與下載相關的內容.例如:在iTunesConnect中創(chuàng)建了一個商品時,可以與之關聯(lián)一個或者若干可下載內容,在運行時,如果用戶對內容進行了付費,就可以使用SKDownload對象從App Store下載內容.
通??蛻舳瞬粫苯觿?chuàng)建該類的對象,一般是在一個付費事務被處理后,客戶端從一個交易對象(transaction)的屬性中獲取一個由該類的實例組成的數(shù)組,然后再去下載內容---即在payment queue中排隊并等待下載完成.在下載完成后,通過下載對象的contentURL屬性去獲取下載內容的URL.客戶端必須在完成交易之前處理下載文件。比如:將文件復制到一個永久儲存的目錄中.一旦全部的下載完成,就應該完成交易,在交易完成后,下載對象將不會在隊列中存在,下載的URL也將失效.
獲取可下載內容的信息:
contentIdentifier?可下載內容特殊標識的字符串
contentLength?可下載內容的長度(以byte為單位)
contentVersion?用來標識內容的哪個版本可以下載
transaction?與可下載內容對應的交易對象
獲取下載狀態(tài)的信息:
downloadState?下載對象的狀態(tài)狀態(tài)
state?同上
progress?下載進度
timeRemaining?預計下載完成時間(以秒為單位)
訪問已完成的下載:
error?下載失敗的原因
contentURL?下載文件的本地URL
處理下載內容:
+contentURLForProductID:?通過productID獲取已下載文件的本地URL
+deleteContentForProductID:?通過productID刪除對應已下載的文件
SKMutablePayment
繼承自下面的SKPayment.當一個可變的payment對象加入到payment queue(隊列)中時,隊列會先把內容復制到一個不可變的payment中,然后再放到隊列中排隊,所以改變可變對象的內容是安全的.
SKPayment
SKMutablePayment類定義了在APP中為額外功能提供付費服務時向蘋果AppStore的請求的過程.一個payment封裝了一個字符串用于標識用戶用于付費的商品和項目的數(shù)量.的,SKPayment是不可變的.
創(chuàng)建實例的方法:
+paymentWithProduct:?通過SKProduct對象創(chuàng)建SKPayment對象.
獲取屬性:
productIdentifier?用于在APP內付費的唯一標識符
quantity?用戶想要購買的數(shù)量
requestData?保留以后使用的屬性
applicationUsername?一個用戶帳戶系統(tǒng)的不透明標識
simulatesAskToBuyInSandbox?標識是否為沙箱測試的布爾值
SKPaymentQueue
SKPaymentQueue類代表了AppStore處理付費事務(payment)的隊列.,首先將至少一個觀察者對象附加到隊列中。然后添加一個用戶想要付費的payment對象,每次添加payment對象,隊列都會創(chuàng)建一個交易對象(transaction)去負責處理付費事務的流程和排序.付款完成后,隊列會更新事務對象,然后調用預先設置的觀察者對象更新事務的方法。觀察者在該方法中處理事務,然后會被在隊列中刪除。
處理交易的具體實現(xiàn)應該由客戶端來實現(xiàn),通常的例子如下:
-如果付費產品是程序中的一個特性,程序應該開啟該特性.
-如果付費產品提供了AppStore中可下載的內容,客戶端應該在交易(transaction)中檢索SKDownload對象將通知payment queue去下載內容.當然您當初在iTunesConnect創(chuàng)建商品信息時就設置了相關內容.
-如果付費產品由自己的服務器提供內容,客戶端應該跳轉到自己的服務器并下載(獲取)對應的內容.
獲取是否允許付費:
+canMakePayments?獲取用戶是否允許付費的類方法
獲取隊列:
+defaultQueue?獲取隊列的單例對象.
添加和刪除觀察者:
-removeTransactionObserver:刪除觀察者
處理交易:
transactions?獲取隊列中的所有交易對象的數(shù)組
-addPayment: 添加付費事務對象
-finishTransaction:?結束交易
恢復付費:
-restoreCompletedTransactions?讓隊列恢復以前完成的交易
-restoreCompletedTransactionsWithApplicationUsername:?通過為用戶的帳戶提供一個不透明的標識讓隊列恢復以前完成的多個交易
下載內容:
-startDownloads:向下載列表添加下載集合
-cancelDownloads:從下載列表中移除下載集合
-pauseDownloads:暫停下載
SKPaymentTransaction
SKPaymentTransaction類定義的是在PaymentQueue中駐留的交易對象,當一個付費事務(payment)被加入到隊列(payment queue)中時,就會創(chuàng)建一個SKPaymentTransaction的實例.當AppStore處理完付費流程后,會將交易(transaction)傳遞到客戶端.完成付費流程的交易對象會提供收據(jù)和標識,您可以在軟件中永久保存已經完成的付費記錄.
獲取交易信息:
error?描述執(zhí)行過程中發(fā)生的錯誤信息
payment?交易對應的付費事務對象
transactionState?交易的當前狀態(tài)
transactionIdentifier?一個成功付費交易對應交易的唯一標識符
transactionReceipt?用于記錄成功交易全部信息的已簽名收據(jù)(已過期)
transactionDate?付費事務(payment)添加到AppStore付費隊列(payment queue)的時間
獲取交易可下載內容信息:
downloads? 由下載對象(SKDownload類的實例)組成,代表與本交易相關的可下載內容的數(shù)組
恢復交易:
originalTransaction?被AppStore恢復的原來的交易.該屬性只有在交易狀態(tài)(transactionState)為SKPaymentTransactionStateRestored時才存在.當交易被恢復之后,當前事務會有新的標識符,收據(jù)等.客戶端用這個屬性來檢索恢復的交易.
SKProduct
SKProduct對象是由SKProductsResponse對象返回數(shù)據(jù)的一部分,用來提供了在iTunesConnect中注冊過的商品信息.
獲取商品屬性:
localizedDescription?本地化描述
localizedTitle?商品名稱
price?本地化價格
priceLocale?用來格式化價格的本地化環(huán)境
productIdentifier?AppStore里的商品ID
獲取可下載內容信息:
downloadable?說明商品是否含有可下載內容的布爾值
downloadContentLengths?可下載內容的長度
downloadContentVersion?可下載內容的版本
SKProductsRequest
SKProductsRequest對象用于從AppStore檢索商品的本地化信息列表.程序可以用該請求獲得商品的價格及其他本地化信息.
使用方法:使用商品ID(product identifier string)初始化一個SKProductsRequest對象,添加代理,然后調用對象的start方法,當請求返回數(shù)據(jù),代理會通過代理方法獲取SKProductsResponse對象的數(shù)據(jù).注意:要保持對請求對象的強引用,否則在請求完成之前對象就可能被釋放.
初始化方法:
SKProductsResponse
SKProductsResponse對象是AppStore對上述SKProductsRequest請求返回的商品列表信息.
響應信息:
products?由SKProduct對象組成的產品列表數(shù)組,每個成員包含了在原來發(fā)送的請求中的有效產品標識.
invalidProductIdentifiers?由一組未被AppStore識別的產品標識符組成的數(shù)組.
SKReceiptRefreshRequest
SKReceiptRefreshRequest類為app刷新收據(jù).如果以前的收據(jù)無效或者丟失,app可以用該接口請求一個新的收據(jù).在沙盒環(huán)境中,您可以請求收據(jù)任意屬性組合去測試大規(guī)模采購計劃收據(jù)的狀態(tài)改變.
初始化方法:
-initWithReceiptProperties:?用可選的屬性初始化一個收據(jù)刷新請求 .測試環(huán)境下設置參數(shù)Receipt Properties.可以查看參數(shù)詳情.在生成環(huán)境下,參數(shù)設置為nil.
SKRequest
SKRequest是一個抽象類,其子類代表了連接到AppStore請求的不同類型.要使用這個類應該初始化它的一個子類對象,然后設置代理,調用start方法.
控制請求的方法:
-start?發(fā)送請求
-cancel?取消當前請求
SKStoreProductViewController
SKStoreProductViewController對象代表了用于為用戶提供AppStore中其他媒體的付費功能的界面.比如您的App中可能會顯示為另一個App付費的界面.要顯示一個商店界面,創(chuàng)建一個新的SKStoreProductViewController對象并設置其代理。然后,從另一個視圖控制器modal方式地展示控制器對象。當用戶完成購買后,用代理將商店界面Dismiss掉。如果想選擇特定商品,使用loadProductWithParameters:completionBlock:方法,并傳遞給該方法一個iTunes item identifier.
SKStoreReviewController
這個類是控制AppStore中評分和評論請求進程的控制器.調用類方法requestReview去引導用戶去AppStore評論和評分.
協(xié)議
SKCloudServiceSetupViewControllerDelegate
協(xié)議定義了云服務視圖控制器用于獲取狀態(tài)信息的方法.
-cloudServiceSetupViewControllerDidDismiss:當cloud service setup view 被Dismiss時調用
SKPaymentTransactionObserver
協(xié)議定義了成為SKPaymentQueue對象的觀察者需要實現(xiàn)的方法.當隊列中的交易(transaction)被更新或者刪除的時候,會通知觀察者處理事務.觀察者應該處理所有成功的交易.解鎖用戶付費獲取的功能,然后通過調用隊列的finishTransaction:方法通知隊列結束交易.
處理交易的方法:
-paymentQueue:updatedTransactions:?(必須實現(xiàn)的方法)通知觀察者隊列中的交易已經更新
-paymentQueue:removedTransactions:?通知觀察者一個或者多個交易被移除隊列
處理恢復交易的方法:
-paymentQueue:restoreCompletedTransactionsFailedWithError:?通知觀察者在恢復交易的過程中發(fā)生了錯誤.
-paymentQueueRestoreCompletedTransactionsFinished:通知觀察者隊列已經完成了發(fā)送恢復交易的請求.
處理下載事件的方法:
-paymentQueue:updatedDownloads:?通知觀察者隊列已經更新一個或者多個下載對象
SKProductsRequestDelegate
協(xié)議聲明了成為SKProductsRequest對象的代理需要實現(xiàn)的方法,代理方法中提供了SKProductsRequest代理對象關注的商品信息.
-productsRequest:didReceiveResponse:(必須實現(xiàn)的代理方法)當AppStore響應了商品請求(product request)時調用
SKRequestDelegate
協(xié)議聲明了成為SKRequest抽象類的任意子類代理所要實現(xiàn)的方法.
-requestDidFinish:?當請求完成時調用.
-request:didFailWithError:?當請求發(fā)生錯誤時調用.
SKStoreProductViewControllerDelegate
實現(xiàn)了該協(xié)議的對象將用戶取消在Store界面的時候被調用,通常情況下實現(xiàn)該協(xié)議的對象應該是當初顯示Store界面的控制器.
-productViewControllerDidFinish:?當用戶Dismiss了一個store screen時被調用.