苹果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;
  }

}
}
```

目录
相关文章
|
域名解析 网络协议 API
【Azure Container App】配置容器应用的缩放规则 Managed Identity 连接中国区 Azure Service Bus 问题
本文介绍了在 Azure Container Apps 中配置基于自定义 Azure Service Bus 的自动缩放规则时,因未指定云环境导致的域名解析错误问题。解决方案是在扩展规则中添加 `cloud=AzureChinaCloud` 参数,以适配中国区 Azure 环境。内容涵盖问题描述、原因分析、解决方法及配置示例,适用于使用 KEDA 实现事件驱动自动缩放的场景。
271 1
|
10月前
|
移动开发 前端开发 Android开发
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
1781 12
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
10月前
|
移动开发 JavaScript 应用服务中间件
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
1138 5
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
10月前
|
移动开发 Rust JavaScript
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
1209 4
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
10月前
|
移动开发 Android开发
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
457 0
《仿盒马》app开发技术分享-- 首页活动配置(5)
上一篇文章中我们实现了项目端云一体化首页部分模块动态配置,实现了对模块模块的后端控制显示和隐藏,这能让我们的app更加的灵活,也能应对更多的情况。现在我们来对配置模块进行完善,除了已有的模块以外,我们还有一些banner ,活动入口等模块,这些模块的数据并不多,所以我们也归纳到配置中去实现。并且我们在配置表中添加了一些不同的id,我们只需要根据相对应的id 去查询对应的表就可以了
220 0
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
iOS开发 开发者
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
1051 67
uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
|
iOS开发 开发者 MacOS
深入探索iOS开发中的SwiftUI框架
【10月更文挑战第21天】 本文将带领读者深入了解Apple最新推出的SwiftUI框架,这一革命性的用户界面构建工具为iOS开发者提供了一种声明式、高效且直观的方式来创建复杂的用户界面。通过分析SwiftUI的核心概念、主要特性以及在实际项目中的应用示例,我们将展示如何利用SwiftUI简化UI代码,提高开发效率,并保持应用程序的高性能和响应性。无论你是iOS开发的新手还是有经验的开发者,本文都将为你提供宝贵的见解和实用的指导。
565 66
|
JavaScript 搜索推荐 Android开发
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
714 8
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡

热门文章

最新文章