使用Ionic 6与In App Purchase 2无法获取商品信息求助
Ionic 6 In App Purchase 2苹果端商品加载失败排查方案
从你的日志可以明确看到核心问题:product io.ionic.cryptoalerts.pro.nonconsumable is NOT valid,苹果StoreKit返回的有效商品数量为0,说明商品ID不匹配或配置未生效。以下是针对性的排查和解决步骤:
一、核心配置校验
1. 商品ID完全匹配
- 确认代码中
PRODUCT_PRO_KEY的值io.ionic.cryptoalerts.pro.nonconsumable,与App Store Connect中创建的非消耗型商品的产品ID完全一致,包括大小写、标点符号,不能有任何差异。 - 检查Xcode项目的Bundle ID(日志中显示为
io.ionic.cryptoalerts),必须与App Store Connect中应用的Bundle ID完全一致。
2. App Store Connect商品状态确认
- 商品必须处于已批准状态(不能是“准备提交”“等待审核”或“拒绝”状态)。
- 必须为商品配置至少一个地区的价格,且价格层级已保存生效。
- 商品的“显示名称”“描述”“本地化信息”等必填字段必须填写完整。
二、测试环境与账号
- 测试内购必须使用沙盒测试账号登录设备,绝对不能使用真实Apple ID。
- 沙盒测试账号需要在App Store Connect的「用户和访问」→「沙盒测试员」中创建,创建后在设备的「设置」→「App Store」中退出真实账号,再登录沙盒账号。
- 注意:沙盒账号不能用于登录iCloud,只能用于App Store测试。
三、代码补充优化
在现有代码中添加错误监听,以便更精准定位问题,同时完善商品加载逻辑:
import { ChangeDetectorRef, Component } from '@angular/core'; import { IAPProduct, InAppPurchase2 } from '@awesome-cordova-plugins/in-app-purchase-2/ngx'; import { AlertController, ModalController, Platform } from '@ionic/angular'; const PRODUCT_PRO_KEY = 'io.ionic.cryptoalerts.pro.nonconsumable'; @Component({ selector: 'app-in-app-purchase-modal', templateUrl: './in-app-purchase-modal.component.html', styleUrls: ['./in-app-purchase-modal.component.scss'], }) export class InAppPurchaseModalComponent { isPro = false; products: IAPProduct[] = []; p: IAPProduct; constructor( private platform: Platform, private store: InAppPurchase2, private alertController: AlertController, private ref: ChangeDetectorRef, private modalController: ModalController ) { platform.ready().then(() => { // 调试模式 this.store.verbosity = this.store.DEBUG; this.store.register({ id: PRODUCT_PRO_KEY, type: this.store.NON_CONSUMABLE }); // 监听商品批准事件 this.store.when(PRODUCT_PRO_KEY) .approved(p => { console.log('商品已批准:', p); p.verify(); }) .verified(p => { console.log('商品已验证:', p); p.finish(); // 标记用户为Pro this.isPro = true; this.ref.detectChanges(); }) // 添加错误监听 .error((error) => { console.error('商品处理错误:', error); }); // 监听无效商品事件 this.store.when('product').invalid((product) => { console.error('无效商品ID:', product.id); }); // 监听商品加载完成事件 this.store.ready(() => { console.log('Store加载完成,商品列表:', this.store.products); this.products = Object.values(this.store.products); this.ref.detectChanges(); }); this.store.refresh(); }); } }
四、Xcode与缓存清理
- 清理Xcode缓存:菜单栏「Product」→「Clean Build Folder」(快捷键
Cmd+Shift+K)。 - 删除设备上的测试应用,重新编译安装。
- 重启测试设备,避免StoreKit的缓存数据干扰。
内容的提问来源于stack exchange,提问作者Milivoje Vujadinović
相关产品推荐
相关产品推荐

