WWDC 2020苹果的Xcode12开始可以支持StoreKit
支付的模拟测试,大概是试图减少开发者在测试调试上面的困扰。StoreKit
一直遭人遭人诟病,毕竟将责任交由环境复杂的终端,是苹果支付问题的起点。
环境要求
对于iOS应用:macOS 10.15+,Xcode 12+
对于macOS应用:macOS 11+,Xcode 12+
配置及流程
- 创建配置文件(StoreKit configuration file),
.storekit
后缀 商品配置,最基本的需要
ProductId
与价格,与AppStore Connect
上是一致的
目前只支持消耗性商品、非消耗性商品及自动续费商品的配置。开启测试,编辑
scheme
,指定是否使用配置文件- 凭据校验,需要导出证书(选中
.storekit
文件可以导出) - 管理交易,在Xcode的调试面板上,有
Transactions Manager
的入口,可以管理过往的交易
具体配置及测试流程并不复杂,可以参阅官方文档,有非常详细的说明。
一切配置妥当开始测试之后,我们可以看到Xcode是启动了一个本地服务来模拟StoreKit
的后台服务,1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17curl -H 'Host: localhost:60282' -H 'Content-Type: application/x-apple-plist' -H 'User-Agent: com.apple.appstored/1.0 iOS/14.1 AMS/1' -H 'Accept: */*' -H 'X-Apple-Client-Application: com.apple.appstored' -H 'Accept-Language: en' -H 'X-Apple-Tz: 28800' --data-binary '<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>appDsid</key>
<string>96ec/wQAAAA=</string>
<key>bid</key>
<string>com.ks.storekit.example</string>
<key>bvrs</key>
<string>1.0.0</string>
<key>guid</key>
<string>000001597ba0</string>
<key>vid</key>
<string>2ED8F64D-BCD9-430B-9D1F-C7B1AF745E3E</string>
</dict>
</plist>
' --compressed 'http://localhost:60282/WebObjects/MZFinance.woa/wa/inAppPendingTransactions'
响应数据1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>app-list</key>
<array>
<dict>
<key>bid</key>
<string>com.ks.storekit.example</string>
<key>item-id</key>
<integer>0</integer>
<key>offer-name</key>
<string>com.moment.vip1</string>
<key>original-purchase-date</key>
<date>2020-11-12T06:41:07Z</date>
<key>original-transaction-id</key>
<string>15</string>
<key>purchase-date</key>
<date>2020-11-12T09:11:07Z</date>
<key>quantity</key>
<integer>1</integer>
<key>transaction-id</key>
<string>22</string>
<key>version-external-identifier</key>
<integer>0</integer>
</dict>
</array>
<key>download-queue-item-count</key>
<integer>2</integer>
<key>jingleAction</key>
<string>inAppPendingTransactions</string>
<key>jingleDocType</key>
<string>inAppSuccess</string>
<key>pings</key>
<array />
<key>receipt-data</key>
<data> MIAGCSqGSI*****
AA== </data>
</dict>
</plist>
测试注意点
- target必须选择iOS14.0以上,如果项目的target原本是iOS8-13的,可能会遇到如下提示
<SKPaymentQueue: 0x7faf9c0ccff0>: Error in remote proxy while processing transaction: Error Domain=NSCocoaErrorDomain Code=4097 “connection to service on pid 23668 named com.apple.storekitservice” UserInfo={NSDebugDescription=connection to service on pid 23668 named com.apple.storekitservice}
- applicationUsername最好置空,不要用json,否则提示4097找不到服务错误
- 交易凭据是本地测试数据。客户端可以本地校验凭据。但如果要走业务流程,需要后端支持验证这些凭据。
Comments