本文只说实现,不说好处。
步骤
一、iTunes Connect 配置流程:
我的app -> App内购买项目 -> 内购商品 -> 推介促销 -> 选择国家地区 -> 开始结束日期 -> 选择价格 -> 确认
注意:下图的 产品ID
即为测试里的 productId
,同时也是从App Store服务器请求内购参数列表的key。
二、代码实现
用到的代理:
SKPaymentTransactionObserver
用到以下代理方法,一般都是返回NO
。如果返回YES
的话,会由苹果帮我们下单,但这往往不是我们期望的。一般的做法都是在这个方法里监听从App Store跳转到我们的应用,之后模态出一个控制器,用来展示我们App的特色,同时有一个用户试用一段时间,然后订阅的按钮。这个按钮就是我们代理方法返回NO
的原因了。
- (BOOL)paymentQueue:(SKPaymentQueue *)queue shouldAddStorePayment:(SKPayment *)payment forProduct:(SKProduct *)product NS_SWIFT_NAME(paymentQueue(_:shouldAddStorePayment:for:)) API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(macos, macCatalyst, watchos);
需要在-application:didFinishLaunchingWithOptions:
里注册监听,因为需要在从App Store跳转过来的时候就要监听。
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
三、测试
itms-services://?action=purchaseIntent&bundleId=bundleId&productIdentifier=productId
现在iPhone的相机已经支持扫码,所以我根据上面的规则用草料二维码生成二维码,直接用相机扫码。如果能跳转到我们的应用,并且能打开我们设置的控制器就算成功了。具体实现请看下面的示例。
示例:
- (BOOL)paymentQueue:(SKPaymentQueue *)queue shouldAddStorePayment:(SKPayment *)payment forProduct:(SKProduct *)product {
// product里存放的有我们配置在App Store的产品ID,以及价格等等。
if (![ShareUserManager isLogin]) {
UIViewController *rootVC = [UIApplication sharedApplication].keyWindow.rootViewController;
if ([rootVC.presentedViewController isKindOfClass:[PromotionSalesVC class]]) {
return NO;
}
PromotionSalesVC *vc = [[PromotionSalesVC alloc] init];
vc.product = product;
AddWeakSelf;
vc.buyBlock = ^{
weakSelf.unloginProduct = product;
[weakSelf buyProduct:product];
};
[rootVC presentViewController:vc animated:YES completion:nil];
}
return NO;
}