StoreKit是苹果提供的一个用于提供付费内容和服务的交易框架,其中定义了若干类和协议以及常量,下面将常用的内容进行无责任官方文档翻译.
由于涉及财务内容务必小心谨慎,因此在使用StoreKit框架时的错误处理尤为重要.在使用过程中,有多种可能导致付费请求错误的原因,其中主要的原因有商品信息错误\付费详情错误\与iTunesConnect帐号连接错误以及网络连接错误等.在处理错误的代理方法:request:didFailWithError:中提供了两个用于描述导致失败原因的参数:domain和code,这两个参数的类型是SKErrorDomain和SKErrorCode.用于描述与付费\产品\云服务相关的错误域和错误代码.如果要了解更多解决问题的方法,可以参考苹果的In-App Purchase FAQ文档.使用中常见的错误还包括网络错误,NSURLErrorDomain描述了在使用StoreKit过程中常见的网络错误类型.
框架中常用的类介绍
SKCloudServiceController
SKCloudServiceController对象用于确定用户音乐库的功能,比如是否允许访问Apple Music目录和媒体库中的歌曲.
+authorizationStatus :用来获取用户在设备上设置的访问系统音乐库的授权类型.
+requestAuthorization:用来申请访问系统音乐库访问权限的方法.
-requestCapabilitiesWithCompletionHandler:获取当前设备与系统音乐库有关的功能.
-requestStorefrontIdentifierWithCompletionHandler:获取设备的Storefront标识.
-requestPersonalizationTokenForClientToken:withCompletionHandler:请求设备令牌.
SKStorefrontIdentifierDidChangeNotification:当设备的storefront标识发生改变时发送的通知.
SKCloudServiceCapabilitiesDidChangeNotification:当设备的系统音乐库相关功能发生改变时发送的通知.
SKCloudServiceSetupViewController
(该类自iOS10.1可用,不详解)
用于实施云服务安装的ViewController,如Apple Music订阅.
SKDownload
SKDownload对象代表了与下载相关的内容.例如:在iTunesConnect中创建了一个商品时,可以与之关联一个或者若干可下载内容,在运行时,如果用户对内容进行了付费,就可以使用SKDownload对象从App Store下载内容.
通常客户端不会直接创建该类的对象,一般是在一个付费事务被处理后,客户端从一个交易对象(transaction)的属性中获取一个由该类的实例组成的数组,然后再去下载内容---即在payment queue中排队并等待下载完成.在下载完成后,通过下载对象的contentURL属性去获取下载内容的URL.客户端必须在完成交易之前处理下载文件。比如:将文件复制到一个永久储存的目录中.一旦全部的下载完成,就应该完成交易,在交易完成后,下载对象将不会在队列中存在,下载的URL也将失效.
获取可下载内容的信息:
contentIdentifier 可下载内容特殊标识的字符串
contentLength 可下载内容的长度(以byte为单位)
contentVersion 用来标识内容的哪个版本可以下载
transaction 与可下载内容对应的交易对象
获取下载状态的信息:
downloadState 下载对象的状态状态
state 同上
progress 下载进度
timeRemaining 预计下载完成时间(以秒为单位)
访问已完成的下载:
error 下载失败的原因
contentURL 下载文件的本地URL
处理下载内容:
+contentURLForProductID: 通过productID获取已下载文件的本地URL
+deleteContentForProductID: 通过productID删除对应已下载的文件
SKMutablePayment
继承自下面的SKPayment.当一个可变的payment对象加入到payment queue(队列)中时,队列会先把内容复制到一个不可变的payment中,然后再放到队列中排队,所以改变可变对象的内容是安全的.
SKPayment
SKMutablePayment类定义了在APP中为额外功能提供付费服务时向苹果AppStore的请求的过程.一个payment封装了一个字符串用于标识用户用于付费的商品和项目的数量.的,SKPayment是不可变的.
创建实例的方法:
+paymentWithProduct: 通过SKProduct对象创建SKPayment对象.
获取属性:
productIdentifier 用于在APP内付费的唯一标识符
quantity 用户想要购买的数量
requestData 保留以后使用的属性
applicationUsername 一个用户帐户系统的不透明标识
simulatesAskToBuyInSandbox 标识是否为沙箱测试的布尔值
SKPaymentQueue
SKPaymentQueue类代表了AppStore处理付费事务(payment)的队列.,首先将至少一个观察者对象附加到队列中。然后添加一个用户想要付费的payment对象,每次添加payment对象,队列都会创建一个交易对象(transaction)去负责处理付费事务的流程和排序.付款完成后,队列会更新事务对象,然后调用预先设置的观察者对象更新事务的方法。观察者在该方法中处理事务,然后会被在队列中删除。
处理交易的具体实现应该由客户端来实现,通常的例子如下:
-如果付费产品是程序中的一个特性,程序应该开启该特性.
-如果付费产品提供了AppStore中可下载的内容,客户端应该在交易(transaction)中检索SKDownload对象将通知payment queue去下载内容.当然您当初在iTunesConnect创建商品信息时就设置了相关内容.
-如果付费产品由自己的服务器提供内容,客户端应该跳转到自己的服务器并下载(获取)对应的内容.
获取是否允许付费:
+canMakePayments 获取用户是否允许付费的类方法
获取队列:
+defaultQueue 获取队列的单例对象.
添加和删除观察者:
-addTransactionObserver:添加观察者
-removeTransactionObserver:删除观察者
处理交易:
transactions 获取队列中的所有交易对象的数组
-addPayment: 添加付费事务对象
-finishTransaction: 结束交易
恢复付费:
-restoreCompletedTransactions 让队列恢复以前完成的交易
-restoreCompletedTransactionsWithApplicationUsername: 通过为用户的帐户提供一个不透明的标识让队列恢复以前完成的多个交易
下载内容:
-startDownloads:向下载列表添加下载集合
-cancelDownloads:从下载列表中移除下载集合
-pauseDownloads:暂停下载
-resumeDownloads:恢复下载
SKPaymentTransaction
SKPaymentTransaction类定义的是在PaymentQueue中驻留的交易对象,当一个付费事务(payment)被加入到队列(payment queue)中时,就会创建一个SKPaymentTransaction的实例.当AppStore处理完付费流程后,会将交易(transaction)传递到客户端.完成付费流程的交易对象会提供收据和标识,您可以在软件中永久保存已经完成的付费记录.
获取交易信息:
error 描述执行过程中发生的错误信息
payment 交易对应的付费事务对象
transactionState 交易的当前状态
transactionIdentifier 一个成功付费交易对应交易的唯一标识符
transactionReceipt 用于记录成功交易全部信息的已签名收据(已过期)
transactionDate 付费事务(payment)添加到AppStore付费队列(payment queue)的时间
获取交易可下载内容信息:
downloads 由下载对象(SKDownload类的实例)组成,代表与本交易相关的可下载内容的数组
恢复交易:
originalTransaction 被AppStore恢复的原来的交易.该属性只有在交易状态(transactionState)为SKPaymentTransactionStateRestored时才存在.当交易被恢复之后,当前事务会有新的标识符,收据等.客户端用这个属性来检索恢复的交易.
SKProduct
SKProduct对象是由SKProductsResponse对象返回数据的一部分,用来提供了在iTunesConnect中注册过的商品信息.
获取商品属性:
localizedDescription 本地化描述
localizedTitle 商品名称
price 本地化价格
priceLocale 用来格式化价格的本地化环境
productIdentifier AppStore里的商品ID
获取可下载内容信息:
downloadable 说明商品是否含有可下载内容的布尔值
downloadContentLengths 可下载内容的长度
downloadContentVersion 可下载内容的版本
SKProductsRequest
SKProductsRequest对象用于从AppStore检索商品的本地化信息列表.程序可以用该请求获得商品的价格及其他本地化信息.
使用方法:使用商品ID(product identifier string)初始化一个SKProductsRequest对象,添加代理,然后调用对象的start方法,当请求返回数据,代理会通过代理方法获取SKProductsResponse对象的数据.注意:要保持对请求对象的强引用,否则在请求完成之前对象就可能被释放.
初始化方法:
-initWithProductIdentifiers:
SKProductsResponse
SKProductsResponse对象是AppStore对上述SKProductsRequest请求返回的商品列表信息.
响应信息:
products 由SKProduct对象组成的产品列表数组,每个成员包含了在原来发送的请求中的有效产品标识.
invalidProductIdentifiers 由一组未被AppStore识别的产品标识符组成的数组.
SKReceiptRefreshRequest
SKReceiptRefreshRequest类为app刷新收据.如果以前的收据无效或者丢失,app可以用该接口请求一个新的收据.在沙盒环境中,您可以请求收据任意属性组合去测试大规模采购计划收据的状态改变.
初始化方法:
-initWithReceiptProperties: 用可选的属性初始化一个收据刷新请求 .测试环境下设置参数Receipt Properties.可以查看参数详情.在生成环境下,参数设置为nil.
SKRequest
SKRequest是一个抽象类,其子类代表了连接到AppStore请求的不同类型.要使用这个类应该初始化它的一个子类对象,然后设置代理,调用start方法.
控制请求的方法:
-start 发送请求
-cancel 取消当前请求
SKStoreProductViewController
SKStoreProductViewController对象代表了用于为用户提供AppStore中其他媒体的付费功能的界面.比如您的App中可能会显示为另一个App付费的界面.要显示一个商店界面,创建一个新的SKStoreProductViewController对象并设置其代理。然后,从另一个视图控制器modal方式地展示控制器对象。当用户完成购买后,用代理将商店界面Dismiss掉。如果想选择特定商品,使用loadProductWithParameters:completionBlock:方法,并传递给该方法一个iTunes item identifier.
SKStoreReviewController
这个类是控制AppStore中评分和评论请求进程的控制器.调用类方法requestReview去引导用户去AppStore评论和评分.
协议
SKCloudServiceSetupViewControllerDelegate
协议定义了云服务视图控制器用于获取状态信息的方法.
-cloudServiceSetupViewControllerDidDismiss:当cloud service setup view 被Dismiss时调用
SKPaymentTransactionObserver
协议定义了成为SKPaymentQueue对象的观察者需要实现的方法.当队列中的交易(transaction)被更新或者删除的时候,会通知观察者处理事务.观察者应该处理所有成功的交易.解锁用户付费获取的功能,然后通过调用队列的finishTransaction:方法通知队列结束交易.
处理交易的方法:
-paymentQueue:updatedTransactions: (必须实现的方法)通知观察者队列中的交易已经更新
-paymentQueue:removedTransactions: 通知观察者一个或者多个交易被移除队列
处理恢复交易的方法:
-paymentQueue:restoreCompletedTransactionsFailedWithError: 通知观察者在恢复交易的过程中发生了错误.
-paymentQueueRestoreCompletedTransactionsFinished:通知观察者队列已经完成了发送恢复交易的请求.
处理下载事件的方法:
-paymentQueue:updatedDownloads: 通知观察者队列已经更新一个或者多个下载对象
SKProductsRequestDelegate
协议声明了成为SKProductsRequest对象的代理需要实现的方法,代理方法中提供了SKProductsRequest代理对象关注的商品信息.
-productsRequest:didReceiveResponse:(必须实现的代理方法)当AppStore响应了商品请求(product request)时调用
SKRequestDelegate
协议声明了成为SKRequest抽象类的任意子类代理所要实现的方法.
-requestDidFinish: 当请求完成时调用.
-request:didFailWithError: 当请求发生错误时调用.
SKStoreProductViewControllerDelegate
实现了该协议的对象将用户取消在Store界面的时候被调用,通常情况下实现该协议的对象应该是当初显示Store界面的控制器.
-productViewControllerDidFinish: 当用户Dismiss了一个store screen时被调用.