苹果app上架-ios上架苹果商店app store 之苹果支付In - App Purchase内购配置-优雅草卓伊凡
配置苹果内购商品主要涉及在苹果开发者后台创建内购产品以及在应用内实现相关逻辑来展示和处理这些商品。以下是详细步骤:
一、在苹果开发者后台创建内购商品
- 登录并进入App配置页面
- 登录苹果开发者中心,点击“App Store Connect”。
- 选择你要配置内购的应用,进入应用详情页面。
找到应用
没有应用的话就点击添加应用
- 创建内购项目
- 在应用详情页面,点击“功能”选项卡,然后选择“内购项目”。
- 点击“+”按钮开始创建新的内购产品。
- 选择内购产品类型
- 消耗型产品:用户购买后可多次使用,使用后即消耗,需再次购买。例如游戏中的虚拟货币、道具等。
- 非消耗型产品:用户购买一次后可永久使用,通常用于解锁应用的高级功能,如去除广告、解锁特定内容等。
- 自动续期订阅:按周期自动续订的订阅服务,如月度、年度会员。用户订阅后,到期前若未取消,将自动扣费续订。
- 非续期订阅:提供一定期限的服务,到期后不会自动续订。例如特定时间段的课程订阅。
很明显我们的游戏的积分属于消耗性产品
- 填写内购产品信息
- 产品ID:需使用唯一标识符,格式通常为反向域名形式,如
com.example.yourapp.productname
。确保此ID在应用内和开发者后台保持一致,用于识别不同的内购商品。 - 参考名称:仅用于开发者内部识别,方便管理不同内购产品,不会显示给用户。
- 名称:展示给用户的产品名称,应简洁明了,突出产品价值,例如“100枚金币”“高级会员月卡”等。
- 描述:详细描述产品内容和优势,帮助用户了解购买后能获得什么,如“购买此商品可获得100枚金币,用于在游戏中购买道具,提升游戏体验”。
- 价格:从苹果提供的价格档位中选择适合的价格。不同国家和地区会根据汇率等因素显示相应的本地化价格。
- 可用性:可以选择立即发布产品,或设置未来的发布日期。
选择地区 设置价格
然后设置税率
选择app的类型,对应类型税率不同,我们是游戏,选择游戏
最后下方 设置图标,也就是要商品的购物图标,下面的截图是商城购买内容
- 配置其他信息(部分产品类型需要)
- 对于自动续期订阅:
- 订阅周期:选择订阅的时长,如每周、每月、每年等。
- 免费试用期:可设置一定时长的免费试用期,吸引用户尝试订阅服务。
- 续订优惠:可以为老用户提供续订折扣,以鼓励用户持续订阅。
- 对于消耗型产品和非消耗型产品:可上传相关截图或视频,展示产品在应用中的使用场景或效果,帮助用户更好地理解产品。
- 提交审核(若需要)
- 创建完成后,内购产品可能需要经过苹果审核,确保其符合App Store审核指南。审核通过后,产品才能在应用内正常使用。
二、在应用内配置展示和处理内购商品逻辑
- 导入StoreKit框架
- 如果使用Swift开发,在相关视图控制器文件顶部导入
StoreKit
框架:
import StoreKit
- 若使用Objective - C,在对应的
.h
文件中导入:
#import <StoreKit/StoreKit.h>
- 请求产品信息
- 在Swift中,创建函数来请求内购产品信息:
func requestProducts() { guard let productIdentifiers = Set([ "com.example.yourapp.product1", // 替换为实际产品ID "com.example.yourapp.product2" ]) as? Set<String> else { return } let request = SKProductsRequest(productIdentifiers: productIdentifiers) request.delegate = self request.start() }
- 在Objective - C中:
```objectivec
- (void)requestProducts {
NSSet *productIdentifiers = [NSSet setWithObjects:
@"com.example.yourapp.product1", // 替换为实际产品ID @"com.example.yourapp.product2", nil];
SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers];
request.delegate = self;
[request start];
}
- 实现`SKProductsRequestDelegate`代理方法以获取产品信息,并在应用中展示: ```swift extension ViewController: SKProductsRequestDelegate { func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) { let products = response.products for product in products { // 根据产品信息,在应用界面上展示商品名称、价格等 print("Product: \(product.productIdentifier), Price: \(product.price)") } } func request(_ request: SKRequest, didFailWithError error: Error) { print("Error fetching products: \(error.localizedDescription)") } }
```objectivec
- (void)productsRequest:(SKProductsRequest )request didReceiveResponse:(SKProductsResponse )response {
NSArray products = response.products;
for (SKProduct product in products) {
// 根据产品信息,在应用界面上展示商品名称、价格等 NSLog(@"Product: %@, Price: %@", product.productIdentifier, product.price);
}
}
- (void)request:(SKRequest )request didFailWithError:(NSError )error {
NSLog(@”Error fetching products: %@”, error.localizedDescription);
}
```
- 处理购买逻辑
- 在Swift中,创建购买函数:
func purchase(product: SKProduct) { let payment = SKPayment(product: product) SKPaymentQueue.default().add(payment) }
- 在Objective - C中:
```objectivec
- (void)purchaseProduct:(SKProduct )product {
SKPayment payment = [SKPayment paymentWithProduct:product];
[[SKPaymentQueue defaultQueue] addPayment:payment];
}
- 实现`SKPaymentTransactionObserver`代理方法来处理购买交易结果: ```swift extension ViewController: SKPaymentTransactionObserver { func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) { for transaction in transactions { switch transaction.transactionState { case.purchased: SKPaymentQueue.default().finishTransaction(transaction) // 处理购买成功逻辑,如解锁功能、更新UI break case.failed: SKPaymentQueue.default().finishTransaction(transaction) // 处理购买失败逻辑,提示用户失败原因 break case.restored: SKPaymentQueue.default().finishTransaction(transaction) // 处理恢复购买逻辑,恢复用户已购买内容 break default: break } } } }
```objectivec
- (void)paymentQueue:(SKPaymentQueue )queue updatedTransactions:(NSArray<SKPaymentTransaction > )transactions {
for (SKPaymentTransaction transaction in transactions) {
switch (transaction.transactionState) { case SKPaymentTransactionStatePurchased: [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; // 处理购买成功逻辑,如解锁功能、更新UI break; case SKPaymentTransactionStateFailed: [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; // 处理购买失败逻辑,提示用户失败原因 break; case SKPaymentTransactionStateRestored: [[SKPaymentQueue defaultQueue] finishTransaction:transaction]; // 处理恢复购买逻辑,恢复用户已购买内容 break; default: break; }
}
}
```