uni-app ios 内购商品在获取商品时报错,但不是每次都报错
uni-app ios 内购商品在获取商品时报错,但不是每次都报错
产品分类
uniapp/App
开发环境信息
项目 | 详情 |
---|---|
PC开发环境操作系统 | Windows |
PC开发环境版本号 | win10 |
HBuilderX类型 | 正式 |
HBuilderX版本号 | 4.45 |
手机系统 | iOS |
手机系统版本号 | iOS 18 |
手机厂商 | 苹果 |
手机机型 | 14pro max |
页面类型 | vue |
vue版本 | vue2 |
打包方式 | 云端 |
项目创建方式 | HBuilderX |
示例代码
getProduct(productIds) {
return new Promise((resolve, reject) => {
console.log("获取苹果内购产品", productIds)
this._channel.requestProduct(productIds, (res) => {
console.log(res)
resolve(res);
}, (err) => {
console.log("获取苹果内购产品-error", err)
reject(err);
})
});
},
{
"code": 0,
"message": "Payment_appleiap:Error Domain=SKErrorDomain Code=0 \"发生未知错误\" UserInfo={NSLocalizedDescription=发生未知错误, NSUnderlyingError=0x281600f00 {Error Domain=ASDErrorDomain Code=507 \"Error decoding response\" UserInfo={NSLocalizedDescription=Error decoding response, NSLocalizedFailureReason=Could not decode media products response}}},https://ask.dcloud.net.cn/article/282",
"errCode": 0,
"errMsg": "Payment_appleiap:Error Domain=SKErrorDomain Code=0 \"发生未知错误\" UserInfo={NSLocalizedDescription=发生未知错误, NSUnderlyingError=0x281600f00 {Error Domain=ASDErrorDomain Code=507 \"Error decoding response\" UserInfo={NSLocalizedDescription=Error decoding response, NSLocalizedFailureReason=Could not decode media products response}}},https://ask.dcloud.net.cn/article/282"
}
操作步骤
import Iap, { IapTransactionState } from "@/pages-train/activeOrder/js/iap";
// 初始化,获取iap支付通道
await Iap.init();
let res = await Iap.getProduct(['q3']);
init() {
return new Promise((resolve, reject) => {
this.getChannels((channel) => {
console.log(channel)
resolve(channel);
}, (err) => {
console.log(err)
reject(err);
})
})
},
getProduct(productIds) {
return new Promise((resolve, reject) => {
console.log("获取苹果内购产品", productIds)
this._channel.requestProduct(productIds, (res) => {
console.log(res)
resolve(res);
}, (err) => {
console.log("获取苹果内购产品-error", err)
reject(err);
})
});
},
getChannels(success, fail) {
if (this._channel !== null) {
success(this._channel)
return
}
if (this._channelError !== null) {
fail(this._channelError)
return
}
uni.getProvider({
service: 'payment',
success: (res) => {
this._channel = res.providers.find((channel) => {
return (channel.id === 'appleiap')
})
if (this._channel) {
success(this._channel)
} else {
this._channelError = {
errMsg: 'paymentContext:fail iap service not found'
}
fail(this._channelError)
}
},
fail(err) {
console.log(err)
}
});
},
get channel() {
return this._channel;
},
预期结果
可以获取到商品列表
实际结果
有时能获取到有时报错
bug描述
this._channel.requestProduct 获取内购商品时报错,但是过一会又好了,再过一段时间又会报错,检查过证书协议和内购商品都没问题。代码也是复制的官方demo。
{
"code": 0,
"message": "Payment_appleiap:Error Domain=SKErrorDomain Code=0 \"发生未知错误\" UserInfo={NSLocalizedDescription=发生未知错误, NSUnderlyingError=0x2828f9cb0 {Error Domain=ASDErrorDomain Code=507 \"Error decoding response\" UserInfo={NSLocalizedDescription=Error decoding response, NSLocalizedFailureReason=Could not decode media products response}}},https://ask.dcloud.net.cn/article/282",
"errCode": 0,
"errMsg": "Payment_appleiap:Error Domain=SKErrorDomain Code=0 \"发生未知错误\" UserInfo={NSLocalizedDescription=发生未知错误, NSUnderlyingError=0x2828f9cb0 {Error Domain=ASDErrorDomain Code=507 \"Error decoding response\" UserInfo={NSLocalizedDescription=Error decoding response, NSLocalizedFailureReason=Could not decode media products response}}},https://ask.dcloud.net.cn/article/282"
}
2 回复
1.证书协议没得问题
内购商品正常
代码复制的demo id和格式均正确
这个问题一会出现一会又正常,并不是每次都出现
在处理uni-app中的iOS内购商品获取报错问题时,首先需要确保你的代码正确实现了内购流程,并且已经配置了所有必要的App Store Connect信息。以下是一个简化的代码示例,用于展示如何在uni-app中实现iOS内购商品获取,并处理可能的错误情况。
步骤1:配置App Store Connect
确保你的应用已经在App Store Connect中配置了内购项目,并且每个内购项目都有一个唯一的productIdentifier
。
步骤2:引入必要的库
在uni-app中,你可能需要使用storekit
相关的库或API来与iOS内购系统交互。由于uni-app本身不直接提供内购API,你可能需要通过原生插件或者H5+ API(如果支持)来实现。以下是一个假设性的示例,使用JavaScript模拟调用原生StoreKit库的过程。
步骤3:实现内购商品获取
// 假设有一个插件或API封装了StoreKit功能
const store = require('storekit'); // 这是一个假设的模块
// 商品列表的productIdentifiers
const productIdentifiers = ['com.example.app.product1', 'com.example.app.product2'];
// 获取商品信息
function fetchProducts() {
store.requestProducts(productIdentifiers, (error, products) => {
if (error) {
console.error('获取商品信息失败:', error);
// 这里可以处理错误,比如重试机制或者用户提示
return;
}
console.log('获取到的商品信息:', products);
// 处理获取到的商品信息
});
}
// 调用函数获取商品
fetchProducts();
// 错误处理示例:如果报错不是每次都发生,可以考虑实现重试机制
let retryCount = 0;
const maxRetries = 3;
function fetchProductsWithRetry() {
fetchProducts();
retryCount++;
if (retryCount < maxRetries) {
setTimeout(fetchProductsWithRetry, 2000); // 延迟2秒后重试
} else {
console.error('重试获取商品信息失败,已达到最大重试次数');
}
}
// 初始调用带重试的函数
fetchProductsWithRetry();
注意事项
- 错误处理:上述代码中,我们简单地在控制台输出了错误信息。在实际应用中,你应该根据错误类型给用户适当的反馈。
- 重试机制:示例中实现了简单的重试机制,但重试次数和间隔应根据实际情况调整。
- 原生插件:uni-app本身可能不直接支持StoreKit,你可能需要查找或开发一个原生插件来封装这些功能。
- 沙盒环境:在测试内购时,确保使用沙盒环境进行测试。
这个示例是一个简化的版本,实际实现可能需要根据你的具体需求和uni-app的版本进行调整。