【Titanium】TiStoreKitを使ったapp purchaseの導入

※この記事の方法では、Titanium 1.7以降では動作しないので、

公式から出ているstorekitをお使い下さい。

詳しくはこちらhttp://maccle.com/programming/titanium/use-ti-storekit-over-v1-8/

--------------------------

Titaniumにて作り直した(Androidと同時に展開したかったので。まあ・・Androidの方は全然売れませんが・・)、

簡単な4コマ漫画アプリ、「寿幸子」なのですが、

iOS版はアプリ内課金に対応しています。

masuidrive様の、TiStoreKitを使い実装しました。

コードは以下の通りです。(ほとんどexample/app.jsと一緒ですが・・)

function log(str){

if(platform != "android"){

Ti.API.log('log:' + str);

}

}

function closePurchase(){

StoreKit = null;

//ここでボタンロックの解除などを行なう

}

function runPurcahse(){

var productsName = "***";//itunes connectで登録したアイテム名

var StoreKit = require("jp.masuidrive.ti.storekit");

if("[object JpMasuidriveTiStorekitModule]" != StoreKit.toString()){

alert("エラー" , "内部Storekitモジュールでエラーが発生しました" , ["OK"]);

closePurchase();

return;

}

if(!StoreKit.canMakePayments){

alert("確認" , "購入が行えない設定になっているようです。端末の「設定」→「一般」→「機能制限」の「App内での購入」がOFFになっていないかご確認下さい。" , ["OK"]);

closePurchase();

return;

}

var payment = StoreKit.createPayment();

if(payment.toString() != "[object Payment]"){

alert("エラー" , "paymentオブジェクトが作成できませんでした。" , ["OK"]);

closePurchase();

return;

}

if(productsName == payment.product){//ここが違う(判定は'!=' では?)ような・・?しかし動作確認で問題なかったのでそのままにしてしまった・・情報求むm(_ _)m

alert("エラー" , "購入IDがストアの物と一致しません。" , ["OK"]);

endPurchasing();

return;

}

var payment = StoreKit.createPayment();

StoreKit.defaultPaymentQueue.addEventListener("restoreFinished", function(e) {

log("restoreFinished");

});

StoreKit.defaultPaymentQueue.addEventListener("restoreFailed", function(e) {

log("restoreFailed");

});

StoreKit.defaultPaymentQueue.addEventListener("purchasing", function(e) {

log("purchasing");

});

StoreKit.defaultPaymentQueue.addEventListener("purchased", function(e) {

StoreKit.defaultPaymentQueue.finishTransaction(e.transaction);

log("purchased");

//ここでファイルに書き込むなど、購入情報の保存を行なう

var alertDialog = Titanium.UI.createAlertDialog({

title: 'ご購入ありがとうございました',

message: '購入が完了しました。購入の情報はiTunesアカウントで管理されますので、アプリを再インストールした場合や端末を変えた場合でも、アカウントが同じであれば、再び課金されることはありません。',

buttonNames: ['OK']

});

alertDialog.show();

closePurchase();

});

StoreKit.defaultPaymentQueue.addEventListener("failed", function(e) {

StoreKit.defaultPaymentQueue.finishTransaction(e.transaction);

log("failed!");

var alertDialog = Titanium.UI.createAlertDialog({

title: '購入時エラー',

message: 'エラーが発生しました/' + e.transaction.error.message,

buttonNames: ['OK']

});

alertDialog.show();

closePurchase();

});

payment.product = productsName;

StoreKit.defaultPaymentQueue.addPayment(payment);

}

runPurcahse();//購入処理実行

※購入アイテムのタイプは"Non-Consumable"にしています。