Skip to content

App开启内置购买

Ian edited this page Dec 7, 2016 · 5 revisions

###App 内置购买功能激活

像大部分的游戏、应用一样,附加的功能或者道具是需要用户另外购买的,那么内置购买功能非常的重要。

很多时候,我们并不需要根据功能拆分成多个产品,我们完全可以集成在一起。为了增加销售的收入是,内置购买可以解决部分问题。 首先,建议App应该是免费的,这样你可以了解有多少人下载了你的产品,哪些国家的,使用了什么语言找到你的,是德语,还是英语 其次,如何让这些用户愿意购买你的内置应用,是需要开发者、大家来考虑的。


下面,我们就详细说明,如何让你的App启动内置购买功能。

  • Step1:你要规划自己的产品,哪些功能是希望用户另外购买的。
  • Step2:将自己的规划集成到产品的逻辑和UI中
  • Step3:实现内置购买的相关逻辑及展现形式
  • Step4:向我们这边提供,插件说明文档

以下,我们以Resolution2为例,说明如何添加内置购买功能

现在文字说明一下,实现内置购买需要具备的条件: 1.你的App必须提供一个按钮来实现恢复购买 2.你的App必须提供明确的插件功能说明

图例1:

图例2:

点击“恢复购买”(Restore) 按钮,之前已经购买的插件信息,将由插件引擎接收到反馈的信息。(你可以根据这些信息,来激活相应的插件) 带“锁”标识的都是没有被激活的插件,都需要用户去购买。点击后,将弹出如图例2所示的内容:"Unlock [1024 x 768] preset" 对对话框,里面包含了说明,该插件需要花费多少钱,如果需要购买所有未解锁的功能,需要多少钱。用户,可以选择只购买单一,也可以选择购买所有。

现在,我们通过代码,来说明如何开启内置购买功能

Step1: 定义插件唯一标识的数组。

//App的唯一标识为com.romanysoft.app.macos.Resolution. (由我们提供)
//插件ID的定义,使用{App的唯一标识}.plugin.{插件描述符号} 的形式来表达
var pluginsIDList = [
	"com.romanysoft.app.macos.Resolution.plugin.preset.800x600",
	"com.romanysoft.app.macos.Resolution.plugin.preset.1024x768",
	"com.romanysoft.app.macos.Resolution.plugin.preset.1152x900",
];

Step2:注册开启IAP的回调处理

//我们要注册开启IAP的回调处理,使用bs.js 提供的函数
        // 处理IAP的回调
        BS.b$.cb_handleIAPCallback = function(obj){
            try{
                var info = obj.info;
                var notifyType = obj.notifyType;

                if(notifyType == "ProductBuyFailed"){
                    //@"{'productIdentifier':'%@', 'message':'No products found in apple store'}"
                    var productIdentifier = info.productIdentifier;
                    var message = info.message;
                    UI.c$.log_buyPlugin(productIdentifier,"order plugin failed", message );

                }else if(notifyType == "ProductPurchased"){
                    //@"{'productIdentifier':'%@', 'quantity':'%@'}"
                    // TODO: 购买成功后,处理同步插件的问题
                    var productIdentifier = info.productIdentifier;
                    UI.c$.pluginMethod.syncPluginsDataFromAppStore(productIdentifier);
                    UI.c$.log_buyPlugin(productIdentifier,"order plugin success");

                }else if(notifyType == "ProductPurchaseFailed"){
                    //@"{‘transactionId':'%@',‘transactionDate’:'%@', 'payment':{'productIdentifier':'%@','quantity':'%@'}}"
                    var productIdentifier = info.payment.productIdentifier;
                    UI.c$.log_buyPlugin(productIdentifier,"order plugin failed");
                }else if(notifyType == "ProductPurchaseFailedDetail"){
                    //@"{'failBy':'cancel', 'transactionId':'%@', 'message':'%@', ‘transactionDate’:'%@', 'payment':{'productIdentifier':'%@','quantity':'%@'}}"
                    var productIdentifier = info.payment.productIdentifier;
                    var message = "error:" + "failed by " + info.failBy + " (" + info.message + ") " + "order date:" + info.transactionDate;
                    UI.c$.log_buyPlugin(productIdentifier,"order plugin failed", message);
					
                }else if(notifyType == "ProductRequested"){
                    //TODO:从AppStore商店获得的产品信息
                    if(typeof info == "string"){
                        info = JSON.parse(info);
                    }
                    UI.c$.pluginMethod.updatePluginsDataWithList(info);

                }else if(notifyType == "ProductCompletePurchased"){
                    //@"{'productIdentifier':'%@', 'transactionId':'%@', 'receipt':'%@'}"
                    var productIdentifier = info.productIdentifier;
                    var message = "productIdentifier: " + info.productIdentifier + ", " + "transactionId: " + info.transactionId + ", " + "receipt: " + info.receipt;
                    UI.c$.log_buyPlugin(productIdentifier,"ProductCompletePurchased", message);
                }

            }catch(e){
                console.error(e);
            }

        };
        // 开启IAP回调处理
        BS.b$.IAP.enableIAP({
			cb_IAP_js:"BS.b$.cb_handleIAPCallback", // "BS.b$.cb_handleIAPCallback"是window下面的函数名称
			productIds:pluginsIDList
		});

在bs.js 中BS.b$.IAP.enableIAP 的处理方式如下:

        b$.pIAPPlugin = {
            path:"/plugin.iap.bundle"
        };

        // IAP 功能封装
        b$.cb_handleIAPCallback = null; // IAP的回调函数
        b$.IAP = {
            enableIAP : function(parms){
                if(b$.pN){
                    try{
                        //注册IAP回调
                        b$.pN.iap.regeditIAPCallbackJs(parms.cb_IAP_js || "BS.b$.cb_handleIAPCallback");

                        //注册IAPBundle
                        b$.pN.iap.regeditIAPCore($.toJSON({
                            path:b$.getAppPluginDir() + b$.pIAPPlugin.path
                        }));

                        //看看是否可以购买
                        if(b$.pN.iap.canMakePayments()){
                            //启动服务
                            b$.pN.iap.startIAPService();

                            //发送商品请求
                            b$.pN.iap.requestProducts($.toJSON({
                                productIdentifiers:parms.productIds ||[]
                            }));
                        }
                    }catch(e){
                        console.error(e);
                    }

                }
            }
			//...
			//...
		};

Step3: 使用bs.js 中提供的IAP的其他功能函数

// 购买指定插件的函数
BS.b$.IAP.buyProduct({productIdentifier:"com.romanysoft.app.macos.Resolution.plugin.preset.1152x900", quantity:1});

// 恢复购买
BS.b$.IAP.restore();

####下面分享Resolution2或者叫BestDisplay的前端源码 下载 Resolution2的前端源码