TiStorekitを公開しておきました
Titanium MobileでStoreKitを扱うTiStorekitがあったのですが、いろいろと大人の事情で更新できなくなっていました。チェックしてみるといくつか直しておかないといけない箇所があったので、forkしておきました。
リファレンス通りに素直な作りになっているので、変更したのはfinishTransactionの変な挙動だけです。finishTransactionは購入処理が完了すると呼ばれる処理で、paymentQueueに溜まったtransactionを終了させるためにあるのですが、TiStorekitに限らず、いろいろなプログラムでどういうわけかtransactionがキューに残ってしまう現象が報告されています。例えば、手元のプログラムではAppStoreでアプリが公開されたもののIn App Purchaseの方がまだ販売開始になっていない状態でエラーになると確実に残ってしまっていました。害があるかどうかはアプリの構成によりますが(大半はないと思います)、気持ちが悪いですね。そこでざっと調べてみました。例えばこちら。
Transaction comes back after finishTransaction: has been called on it
iPhone inApp Purchase Queue won’t clear out
でも、Appleから提供されている資料では、結局どこをどうすればよいのかはっきりとはわかりませんでした。上のリンクでも、どうやらiOS 4になって何か変更されたらしいというところまでしか判明しなかったようです。そこで、下の方のリンクを参考に、transactionがキューから消えないなら、それを監視して不要なところで復活させてしまう諸悪の根源のObserverを問答無用で削除してしまうのが、こちらの変更です(たった1行でざっくり)。
もっとスマートな方法もあるのかもしれませんが、ここらで手一杯でした。こうした方がいいよ、という案をお持ちの方は、是非forkするかパッチをください。
Comments
はじめまして。
こちらのstorekitを利用させていただこうと思っているのですが、
python build.pyで作成されるzipは
jp.masuidrive.ti.storekit ではなく
jp.masuidrive.tistorekit となってしまいます。
これはコレでよろしいのでしょうか?
require(“jp.masuidrive.ti.storekit”); としても
require(“jp.masuidrive.tistorekit”); としても
Couldn’t find moduleと表示されてしまい、利用することができていないのですが・・・。
example/app.jsの記述通りです。
tieapp.xmlにモジュールの情報を追記していますか?
yさん、返信ありがとうございます。
tieapp.xmlは、 内にjp.masuidrive.ti.storekitを記載しています。
ダウンロードして解凍後、 python ./build.py とすると
jp.masuidrive.tistorekit-iphone-0.1.zip というファイルが出来ます。それを解凍すると、
modules/iphone/jp.masuidrive.tistorekit/0.1/ というディレクトリ構成で各ファイルが出来上がり
そこにある .aのファイルも
libjp.masuidrive.tistorekit.a というファイル名で、
manifestの中の記述でも
moduleid: jp.masuidrive.tistorekit
という風に tiとstorekitの間にドットが無い状況です。
そのモジュールを /Library/Application Support/Titanium/ の適切な場所にコピーも行なっているのですがどうも動作いたしません。
https://github.com/masuidrive/TiStoreKit にあるものでは問題なく動作していたのですが・・・
環境は
MacOSX 10.7
TitaniumMobileSDK 1.7.2
Xcode 4.2 Developer Preview 5
です。
はっ・・・ Xcode 4.2 Developer Preview 5にしてるのが問題なんですかね・・・
1.6.xにしてみてください。
返信ありがとうございます。
TitaniumMobileSDK 1.6.xですね。
環境を用意して試してみます。