Titaniumの最近のブログ記事

Titanium Studioでの実機転送が失敗する原因としてApple Developer ConnectionアカウントのプロフィールでFirst Name、Last Nameに日本語の名前を設定してしまったために起こるものがあります。

そして、このプロフィール名はApple IDの設定では変えられないのです。orz

そのままプロビジョニングプロファイルを作るとキーに日本語が含まれるものができてしまい、Titaniumのビルドスクリプトが変換に失敗して落ちてしまいます。

[INFO] One moment, building ...
Traceback (most recent call last):
  File "/Users/iwazawa/Library/Application Support/Titanium/mobilesdk/osx/2.1.1.GA/iphone/builder.py", line 1604, in 
    main(sys.argv)
  File "/Users/iwazawa/Library/Application Support/Titanium/mobilesdk/osx/2.1.1.GA/iphone/builder.py", line 724, in main
    dist_name = dequote(args[7].decode("utf-8"))
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/encodings/utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0x89 in position 0: invalid start byte

回避方法を調べようとネットで検索をかけるとDeveloper Centerのサポートに名前を変更してもらうというのしか出てこないのですが、Xcodeでは別に日本語だって問題ないわけですしRubyMotionも適切にエンコードした文字列を指定しておけば大丈夫。なのでTitaniumのビルドスクリプトが対応していないだけだと思います。

落ちている箇所のソースコードを見てみると

vi ~/Library/Application\ Support/Titanium/mobilesdk/osx/2.1.1.GA/iphone/builder.py

723  :
724  dist_name = dequote(args[7].decode("utf-8"))
725  :

ちゃんとUTF-8でデコードしてるのにおかしいな?と調べてみたところ、引数としてShift_JISが渡ってきてました。

パラメータとして渡す元を変えるのが正しい修正方法の気がしますが、とりあえずすぐにビルドしたかったので

722  :
723  args[7] = args[7].decode("shift_jis").encode("utf-8") # <---コレ
724  dist_name = dequote(args[7].decode("utf-8"))
725  :

直前にこんな風な変換を追加してやると、無事成功しましたヽ(´ー`)ノ

テーブルの行を長押しして、その行に対する特別な処理を行いたくてTableViewのlongpressイベントを使おうとしました。

プログラムはCoffeeScriptで書いてますので自分で試す場合はJavaScriptに変換して下さい。

出力結果:

[DEBUG] longpress> undefined undefined

行の情報が渡ってこねー(-ω-)

そこで何が呼ばれてるのかtouch系のイベントを並べて見てみると、

出力結果:

[DEBUG] touchstart> 1 TITLE-2
[DEBUG] longpress> undefined undefined
[DEBUG] touchend> 1 TITLE-2
[DEBUG] click> 1 TITLE-2

touchstartでindexやrowを覚えて、longpressが起こったときに使えれば良さそうです。 覚えた情報はtouchendで初期化するとよさげ。

ところがよく見ると余計なことにclickも呼ばれている(-ω-)

longpressのでclickイベントの発火を抑えるいい方法が見つからず、結局longpressの処理内でフラグを立てclick処理で判断するというコードに落ち着きました。

あまりカッコよくはないですね。Titanium側でlongpressが検知されたらclickは呼ばない仕様にしてもらえたほうが自然な気がします。

ひょとしたらclickが呼ばれないと何かできなくなる操作があるのかなぁ。

Titanium.DatabaseはローカルなSQLiteを使ってデータを保管できる非常に簡単なAPIですが、SQLを直に書かないといけないのが些か面倒です。

かと言ってORM的な仕組みを構築するというのもオーバー過ぎる事が多いです。

保存するデータがHash形式のObjectに格納されているとしてCoffeeScriptであれば、こんな感じでUPDATE文を簡単に実装することができます。

例えばデータとして次の様なオブジェクトが存在した場合

まずは、SET句を作ります。

続いて仮パラメータにセットする値の配列を作ります。
UPDATE文なのでWHERE句にプライマリキー(id)を指定するため、最後にid項目も追加します。

あとは連結してUPDATE文に仕立て上げるだけです。

文字列連結だけで生成するよりも気持ちいいですね!

タイトルの件、ずっと前から使えないのは知っていたのだけど、TitaniumはiPhoneでしか試してなかったしiPhoneだけ出来ればいいやとずっと思ってたのでスルーしてました。

しかし最近、会社からAndroid端末(L-04C)が配布されたのもあって、さーてAndroidもやっちゃうぞ〜と思って調べ始めたのですが分からない...

ググっても「SDKのパス指定が間違ってんじゃん?」とか「SDKパッケージをインストールしてないんじゃん?」とかしか見つからず。

唯一、「Titanium Android:SDKがずっとLoadingまたは、ScreenがLoadingのまま->解決」これか!?という対応方法を見つけて色めき立ったわけですが、~/AppData/Roaming/Titanium なんてディレクトリ見つからないす...

かなり長い間、途方にくれていたのですがコンパイル時(Launchボタン押したとき)不可解なエラーメッセージが出ているのを発見。

[INFO] Building KitchenSink for Android ... one moment
[ERROR] JDK version Picked up _JAVA_OPTIONS: -Dfile.encoding=UTF-8

バージョン? _JAVA_OPTIONS が??

そこで、ハッと閃いたのです。

OSXのJavaは何も指定しない場合のfile.encodingがShift_JISになっているらしく、Scalaのコンソールでいろいろ試したりするときにイラっとするのです。

1年前くらいに行ったScalaの勉強会で ~/.MacOSX/environment.plist にfile.encodingの指定をしておけば常に使われるので便利というのを教えてもらって設定してました。どうせUTF-8しか使わないし。

なのでjavaコマンドにバージョンを聞いてみると

$ java -version
Picked up _JAVA_OPTIONS: -Dfile.encoding=UTF-8
java version "1.6.0_24"
Java(TM) SE Runtime Environment (build 1.6.0_24-b07-334-10M3326)
Java HotSpot(TM) 64-Bit Server VM (build 19.1-b02-334, mixed mode)

と、返ってくる。普通は _JAVA_OPTIONS の行はない。TitaniumはJavaのバージョンチェックにこの出力の1行目を使っているのに違いない!

~/.MacOSX/environment.plist から _JAVA_OPTIONS の設定を削除し、ログオフ&ログイン。
Titanium Developerを起動してみると...

で、出た!

titanium_android_select_sdk.png

_JAVA_OPTIONS="-Dfile.encoding=UTF-8"が付いてないとScalaで不便なので ~/.bash_profile で設定することにしました。
Titanium DeveloperはQuickSilverから起動するので影響を受けなくてウマー

ちなみに現在プレビュー版のTitanium Studioも同様でした。

このアーカイブについて

このページには、過去に書かれたブログ記事のうちTitaniumカテゴリに属しているものが含まれています。

前のカテゴリはTipsです。

次のカテゴリはToolsです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。