如何在 iOS 上使用 Cordova 进行应用内购买 (IAP)?
How to get working In-App Purchases (IAP) using Cordova on iOS?
在 Android 使用 Apache Cordova 和 https://github.com/j3k0/cordova-plugin-purchase 成功交付应用内购买 (IAP) 后,我无法在 iOS 上正常运行。问题是,一旦点击商品,价格就会显示其详细信息等,但如果使用点击 "Cancel",则用户无法再购买任何东西。除非重新启动游戏,否则据我所知我应该处理 rejection/cancellation 事件。尝试了这些,但到目前为止没有成功。
这就是我尝试处理这些事件的方式 (rejection/cancellation),包括在代码的不同位置使用 store.refresh() 和也没有它:
// Handle rejection and cancel events.
store.when("com.XX.YY.gems5").rejected(function(order) {
store.refresh();
that.game.state.start("GemsState");
store.refresh();
});
store.when("com.XX.YY.gems5").cancelled(function(order) {
store.refresh();
that.game.state.start("GemsState");
store.refresh();
});
代码,可在 Android 上正常工作(为了正常工作不需要处理):
'use strict';
var that = this;
// Prepare product.
store.register({
id: "com.XX.YY.gems5",
alias: "Gems 5",
type: store.CONSUMABLE
});
// Purchase product.
store.order("com.XX.YY.gems5");
store.refresh();
store.when("com.XX.YY.gems5").approved(function (order) {
order.finish();
store.refresh();
// Add extra gems.
localStorage.gems = parseInt(localStorage.gems) + 5; // Add 5 gems.
that.upgrade_sound.play(); // Play upgrade sound.
that.game.state.start("GemsState");
that.menu_items[1].select(); // Select second item.
});
我正在使用 Phaser 2 和 ES5。
显然,此插件在 Android 和 iOS 上有时会有一些不同的行为,这里就是这种情况。首先,store.refresh();
应该在这段代码的末尾出现一次。下面工作正常 iOS 示例:
'use strict';
var that = this;
store.register({
id: "com.XX.YY.gems5",
alias: "Gems 5",
type: store.CONSUMABLE
});
store.order("com.XX.YY.gems5"); // Initialize purchase.
// Handle approved purchase.
store.when("XX.YY.ZZ.gems20").approved(function (order) {
// Add extra gems.
localStorage.gems = parseInt(localStorage.gems) + 20; // Add 20 gems.
order.finish(); // Finish purchase.
});
store.refresh(); // Refresh the store to start everything.
也有一些缺点,如果您想获得进一步的见解,可以查看 issue#333 (comment)
在 Android 使用 Apache Cordova 和 https://github.com/j3k0/cordova-plugin-purchase 成功交付应用内购买 (IAP) 后,我无法在 iOS 上正常运行。问题是,一旦点击商品,价格就会显示其详细信息等,但如果使用点击 "Cancel",则用户无法再购买任何东西。除非重新启动游戏,否则据我所知我应该处理 rejection/cancellation 事件。尝试了这些,但到目前为止没有成功。
这就是我尝试处理这些事件的方式 (rejection/cancellation),包括在代码的不同位置使用 store.refresh() 和也没有它:
// Handle rejection and cancel events.
store.when("com.XX.YY.gems5").rejected(function(order) {
store.refresh();
that.game.state.start("GemsState");
store.refresh();
});
store.when("com.XX.YY.gems5").cancelled(function(order) {
store.refresh();
that.game.state.start("GemsState");
store.refresh();
});
代码,可在 Android 上正常工作(为了正常工作不需要处理):
'use strict';
var that = this;
// Prepare product.
store.register({
id: "com.XX.YY.gems5",
alias: "Gems 5",
type: store.CONSUMABLE
});
// Purchase product.
store.order("com.XX.YY.gems5");
store.refresh();
store.when("com.XX.YY.gems5").approved(function (order) {
order.finish();
store.refresh();
// Add extra gems.
localStorage.gems = parseInt(localStorage.gems) + 5; // Add 5 gems.
that.upgrade_sound.play(); // Play upgrade sound.
that.game.state.start("GemsState");
that.menu_items[1].select(); // Select second item.
});
我正在使用 Phaser 2 和 ES5。
显然,此插件在 Android 和 iOS 上有时会有一些不同的行为,这里就是这种情况。首先,store.refresh();
应该在这段代码的末尾出现一次。下面工作正常 iOS 示例:
'use strict';
var that = this;
store.register({
id: "com.XX.YY.gems5",
alias: "Gems 5",
type: store.CONSUMABLE
});
store.order("com.XX.YY.gems5"); // Initialize purchase.
// Handle approved purchase.
store.when("XX.YY.ZZ.gems20").approved(function (order) {
// Add extra gems.
localStorage.gems = parseInt(localStorage.gems) + 20; // Add 20 gems.
order.finish(); // Finish purchase.
});
store.refresh(); // Refresh the store to start everything.
也有一些缺点,如果您想获得进一步的见解,可以查看 issue#333 (comment)