记录首次使用APP内购流程中所遇到的一些问题,已经开发步骤,理解内购使用的相关配置:
- 什么是沙盒账号?
- 什么是productIdentifiers(NSSet)?
- Merchant IDs是什么及其配置?
什么是沙盒账号?
沙盒账号是在使用内购时,在itunesconnect后台所创建的账号,主要是用来进行内购时的购买所用,不能是已经绑定过iCloud的账号,建议用公司个人账号。下面演示如何创建沙盒账号
1、进入itunesconnect后台->选择“用户和访问”

2、在“用户和访问”界面选择“沙盒”->点击“➕”

3、在弹出的信息框中填写相关资料,填写完后点击邀请

什么是productIdentifiers(NSSet)?
可以看到,这是一个集合类型,里面其实就是包含着商品的ID,在初始化SKProductsRequest类时需要使用到,我的做法是把产品都在本地写死,点击商品是进行单个的商品请求,当然,也可以把所有的商品ID添加在里面进行初始化。如下图的ID:

Merchant IDs是什么及其配置?
这个IDs是专门用来做内购的,具体配置如下:
1、进入苹果开发者后台->选择“ Identifiers”

2、点击添加"+"->选择Merchant IDs

3、在新出现的界面填写好描述以及Merchant IDs,填写完成后点击"continue"提交

4、回到证书管理界面->点击" Identifiers"选项卡->点击创建好的Identifiers

5、进入到Edit your App ID Configuration界面->开启apply pay ->点击Edit->选择刚刚创建的Merchant IDs点击continue->回到Edit your App ID Configuration界面保存


6、至此,Merchant IDs于应用bundleID已经绑定成功,重新更新Profile描述文件,一定要重新下载更新Profile文件
确认下面列表已准备完善
1、测试真机一台,据说不能用越狱机,没有试过
2、测试沙盒账号
3、Merchant IDs已绑定
4、内购产品已添加成功,状态为"准备提交"
好了,一切就绪,接下来就是开始开发流程了
Xcode开启Apple Pay,填写Merchant IDs

开启Apple pay之后,就进入代码部分了,以下是代码清单
#import "APPStorePayManager.h"
@interface APPStorePayManager ()<SKProductsRequestDelegate,SKPaymentTransactionObserver>
@property (nonatomic, copy) ApplePayBlock success;
@property (nonatomic, copy) ApplePayBlock fail;
@property (nonatomic, strong)SKProductsRequest *productsRequest;
@end
@implementation APPStorePayManager
- (instancetype)init
{
self = [super init];
if (self) {
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
}
return self;
}
- (void)WakeUpTheApplePayWithProduct:(NSString*)products Success:(ApplePayBlock)success fail:(ApplePayBlock)fail{
BOOL iap = [SKPaymentQueue canMakePayments];
if (iap) {
NSSet * set = [NSSet setWithObjects:products,nil];
_productsRequest = [[SKProductsRequest alloc]initWithProductIdentifiers:set];
_productsRequest.delegate = self;
[_productsRequest start];
_success = success;
_fail = fail;
} else {
// NSLog(@"不可以购买");
_fail(@"不可以购买");
}
}
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray<SKPaymentTransaction *> *)transactions {
for (SKPaymentTransaction *tran in transactions) {
switch (tran.transactionState) {
case SKPaymentTransactionStatePurchased:
{
NSLog(@"交易完成");
[[SKPaymentQueue defaultQueue] finishTransaction:tran];
if (_success!=nil) {
_success(@"交易完成");
}
}
break;
case SKPaymentTransactionStatePurchasing:
{
NSLog(@"商品添加进列表");
}
break;
case SKPaymentTransactionStateRestored:
{
NSLog(@"已经购买过商品");
if (_success!=nil) {
_success(@"已经购买过商品");
}
[[SKPaymentQueue defaultQueue] finishTransaction:tran];
}
break;
case SKPaymentTransactionStateFailed:
{
NSLog(@"交易失败");
if (_fail!=nil) {
_fail(@"交易失败");
}
[[SKPaymentQueue defaultQueue] finishTransaction:tran];
}
break;
default:
{
[[SKPaymentQueue defaultQueue] finishTransaction:tran];
}
break;
}
}
}
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
NSArray *rProducts = response.products;
if (rProducts.count > 0) {
SKMutablePayment *payment = [SKMutablePayment paymentWithProduct:rProducts.lastObject];
[[SKPaymentQueue defaultQueue]addPayment:payment];
}
}
@end
网友评论