iOS内购相关----StoreKit官方文档无责任翻译

StoreKit是苹果提供的一个用于提供付费内容和服务的交易框架,其中定义了若干类和协议以及常量,下面将常用的内容进行无责任官方文档翻译.

由于涉及财务内容务必小心谨慎,因此在使用StoreKit框架时的错误处理尤为重要.在使用过程中,有多种可能导致付费请求错误的原因,其中主要的原因有商品信息错误\付费详情错误\与iTunesConnect帐号连接错误以及网络连接错误等.在处理错误的代理方法:request:didFailWithError:中提供了两个用于描述导致失败原因的参数:domaincode,这两个参数的类型是SKErrorDomainSKErrorCode.用于描述与付费\产品\云服务相关的错误域和错误代码.如果要了解更多解决问题的方法,可以参考苹果的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时被调用.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容

  • 购买过程的最后一部分是应用程序等待应用商店处理支付请求,存储本次购买的信息以便将来启动,下载购买的内容,然后标记交...
    Dosun阅读 1,114评论 0 1
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,563评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,268评论 25 707
  • "朝为田舍朗,暮登天子堂"人人向往。 "一封朝奏九重天,夕贬潮阳路八千"令人叹惋。 "王侯将相,宁有种乎?"是不甘...
    微危道人阅读 210评论 0 4
  • 暴雨 鱼不在...
    许可证的妹妹许多多阅读 327评论 0 1