2013.01.31 Thursday

スポンサーサイト

0

    一定期間更新がないため広告を表示しています

    2011.09.10 Saturday

    Titaniumメモ:言語設定

    0
      Titanium Mobileで開発して、申請中のアプリの使い勝手が気になって修正したものを再アップしようと思って、iTunes ConnectでBinary Detailを見てみると、Localization:Englishとなっていた。

      確かに、アプリ内から写真を開く時とか、メールを開く時にボタンやタイトルが英語になっていたなとは気づいていたけど、どうやらアプリの設定で英語になっていたっぽい。

      修正したソースをアップする前に、info.plistに言語設定があるかなと思ってみてみたら、
      1番上の項目にあった。
      ここでJapanを選択してパブリッシュしてみたら、先程まで英語だった部分がちゃんと日本語に変わってた。

      ってことは、先にリリースした2つもそのまま変更していなかったから英語になってしまったな。

      ちょうど両方ともちょっと修正したアップデートをかける予定なので、その時に合わせて治そう。
      2011.09.10 Saturday

      Titaniumメモ:setIntervalで処理のタイミングをずらす

      0
         完全にバッドノウハウなんだとは思うけど、
        Titanium Mobileでちゃんとオブジェクトを作って、このタイミングであるはずなのに値が取れないなんてことがよくある。

        そんな時は、setIntervalしてみるとたいていうまくいく。

        特に引っかかったのが、アプリ起動時に設定画面を開くようなアプリ。

        初期起動時は設定画面を開く前に、メインの部品を全部配置してから設定画面を開くようにしているのに、メインの画面の部品が設定画面から呼び出せない。

        setIntervalでぐるぐる回して値を見てみると、確かにある。

        参照がまちがっていたのかとかいろいろ悩んだけど、
        結局設定画面を開くタイミングが早すぎて、メインの部品を起き切っていないうちに動いてしまってるっぽかった。

        var s = setInterval(function(){
        if(オブジェクト){
        処理する;
        clearInterval(s);
        }
        },100);

        としておけば、0.1秒待ってから処理されるし、仮にその瞬間でも終わってなくても0.1秒ごと確認するからセットされた時点で次の処理に行く。

        古いFlashではよくあるバグというか潜在的な問題で、全く同じ対処をしていたけど、
        Titanium Mobileもまだ怖い部分が多いな。

        そういうのは、ガチガチのプログラマは許せないんだろうな。
        2011.09.05 Monday

        Titaniumメモ:アクティビティインジケーター関連のエラー対処

        0
          createActivityIndicatorや、そのstyleのが未定義だ、とか
          アプリがすぐにクラッシュするとかした場合は、大抵、
          ・Titanium Studioの再起動
          ・buildディレクトリの中を空にする
          を実行すると、ちゃんと通るようになる。

          アクティビティインジケーター関連以外は、起動時にクラッシュしたり、変数の未定義で怒られる場合は大抵ちゃんとミスしてる。

          でも、アクティビティインジケーター関連はTSにバグがあるからか、
          特に問題があるコードを書かなくてもエラーを吐くことがある。

          1本目のアプリの時も、これで引っかかって結局はアクティビティインジケーターの使用を見送ったけど、2本目、3本目のアプリを作っていてようやく上記のことに気づいた。

          ちゃんとミスってる時と同じ挙動をするから、こっちがミスってるはずと思って目を皿にしちゃうからなおさら気づかないんだよな。

          3本続けて起きたから、さすがにそれに気付けるようにはなってきた。
          2011.09.02 Friday

          Titaniumメモ:URLスキームの正しい書き方

          0
             iPhoneで他のアプリを開くのに使えるURLスキーム。
            この書き方に、

            アプリ用スキーム名://
            と書いているのがたくさん見受けられる。

            でも、mailto:メアドにも、tel:電話番号
            にも//は入っていないし、
            アプリ用スキーム名:
            としても、Safariから該当のアプリを開くことができる。

            どっちが正しいんだろうな?
            を見ても、http://,tel:,sms:,mailto:しかないけど、http以外は//ないんだよな
            意味合いを考えても、http://よりも、tel,sms,mailtoの方が、
            そのURLを叩いても、アプリを起動して引数をセットするだけという意味でも上記のURLスキームの動きに近いような気もするし。telは電話するから、httpと一緒か。それは別にアプリごとの動きの問題だから関係ないのかな。

            ちなみにブラウザにhttp:www.yahoo.co.jpって入れたら動いた。これはブラウザが解釈してくれてるだけだよな。

            いまいち釈然としないけど、他に合わせて
            アプリ用スキーム名://
            にしておこう。

            ちなみに、引数の渡し方としては、
            アプリ用スキーム名://引数1=値をURLエンコードしたもの&引数2=値をURLエンコードしたもの
            というように渡すのが、分解するのが楽できてよさげ。

            アプリ用スキーム名://を削除して、
            &でスプリットして、
            配列ぐるっとまわして、その中で=でスプリットして、配列[1]の方をURLデコードすれば終わり。
            2011.09.02 Friday

            Titaniumメモ:カスタムURLスキームでの引数の受け取り方(修正)

            0
               なかなか日本語の情報を探しても見つからなかったので、変数名から予想して見つけた。

              ちなみに、Titanium Mobileで作っているアプリはデフォルトでプロジェクト名でカスタムURLスキームが自動的に設定されている。

              例えば、webSnapというプロジェクトなら、
              SafariのURL欄にwebSnap:と入力すればそのアプリを起動することができる。

              次に問題になるのが、引数の受け取り方。

              URLスキーム自体は、
              mailto:メールアドレス
              みたいな書き方で、起動して引数も渡せる。

              webSnap:引数
              と指定してアクセスすれば引数も渡せる。

              で、アプリ側でどうやってこの引数を受け取るかって問題。

              Titanium.App.getArguments()

              という関数を呼び出すと、このURLスキームで渡された引数を受け取ることができる。

              具体的には

              {url='webSnap:引数'}みたいにまるごと来るから分解したりする必要はあるようだけど、

              取れるなら十分。


              複數の引数を付けたい場合も

              webSnap:引数A,引数B,引数C,引数D

              とかすれば{url='webSnap:引数A,引数B,引数C,引数D'}となりそうだから、分解すればいいだけっぽい。

              後はこの関数をどのタイミングで実行するかだな。tabやwindowのopenイベントは、アプリを一度起動した後にアクセスされたときじゃ使えなそうだし。

              最悪、setIntervalでぐるんぐるん回してしまおうかな。

              やっぱり眠い時はおかしなことを考えてるっぽいな。
              なに、resumeで取ればいいだけじゃねーかと、以下をしてみる。


              Ti.App.addEventListener('resume',function(e){

              var arr = Titanium.App.getArguments();

              if(arr.url){

              alert(Titanium.App.getArguments());

              }

              });

              ところが、alertが開かない。なんでかなといろいろ試してみたら、結局以下で動いた。


              Ti.App.addEventListener('resume',function(e){

              var si = setInterval(function(){

              var arr = Titanium.App.getArguments();

              if(arr.url){

              alert(Titanium.App.getArguments());

              clearInterval(si);

              }

              },100);

              });

              100ミリ秒出すのをずらしただけ。昔のFlashではよくあるテクだったけど、本来は避けたいところ。できたから、まあよしとしよう。


              2011.09.01 Thursday

              Titaniumメモ:WebViewでユーザーエージェントのセット失敗

              0
                WebViewでユーザーエージェントを指定してあるサイトを開こうとしたら、
                var xhr = Titanium.Network.createHTTPClient();
                して、リクエストヘッダーにエージェントをセットして、
                onloadでresponseTextを取得して、

                webview.html = this.responseText;
                で行けるだろうってやってたら、結構いい感じまでいって行き詰まった。

                確かに、エージェントをリクエストにセットして、responseTextにエージェントに合わせたhtmlを取得はできたさ。
                webview.html = this.responseText;
                すれば、それなりっぽい感じに表示された。

                ところが、cssや画像が表示されないものがある。Consoleを見てみると、原因判明。
                絶対パスでないと画像、cssをロードできていない。
                どうやら、htmlをダウンロードして、ローカルでhtmlを開いている状態になっているっぽい。
                確かに動作を考えればそうなんだよな。

                htmlを置換してbaseタグを追加してみたり、JSでリンク部分を置換してみたりを途中までやって、これは悪い方法だなと。外部cssやJSの中で相対で指定してある画像がある時とかまで考慮にいれるの大変すぎる。

                エージェント指定をやめて、もっとシンプルなアプリにしようかな。そこが肝かなと思ってたんだけど。

                もっとシンプルでいい方法がきっとあるはずだと思うんだよな。

                (追記)baseタグ追加が今のところ一番よさげ。まずはこれでいこう。
                2011.08.31 Wednesday

                Titaniumメモ:システムボタンの画像一覧

                0
                   Titanium.UI.iPhone.SystemButtonのそれぞれがどんな画像になるかいちいち動かして確認するのが面倒だったので、一気に動くものと作ってみた。あとで見直すため用。


                  これを作ったapp.jsは以下

                  // this sets the background color of the master UIView (when there are no windows/tab groups on it)

                  Titanium.UI.setBackgroundColor('#000');


                  // create tab group

                  var tabGroup = Titanium.UI.createTabGroup();



                  //

                  // create base UI tab and root window

                  //

                  var win1 = Titanium.UI.createWindow({  

                      title:'Tab 1',

                      backgroundColor:'#fff'

                  });

                  var tab1 = Titanium.UI.createTab({  

                      icon:'KS_nav_views.png',

                      title:'Tab 1',

                      window:win1

                  });


                  var tv = Ti.UI.createTableView();

                  var btn_styles = ['ACTION','ACTIVITY','ADD','BOOKMARKS','CAMERA','CANCEL','COMPOSE','CONTACT_ADD','DISCLOSURE','DONE','EDIT','FAST_FORWARD','FIXED_SPACE','FLEXIBLE_SPACE','INFO_DARK','INFO_LIGHT','ORGANIZE','PAUSE','PLAY','REFRESH','REPLY','REWIND','SAVE','SPINNER','STOP','TRASH'];


                  for(var i=0;i<btn_styles.length;i++){

                  var row = Ti.UI.createTableViewRow();

                  var lb = Ti.UI.createLabel({text:btn_styles[i],top:5,width:320,left:150,height:30,zIndex:10});

                  var btn = Ti.UI.createButton({systemButton:Titanium.UI.iPhone.SystemButton[btn_styles[i]]});

                  var toolbar1 = Titanium.UI.createToolbar({

                  items:[btn],

                  top:0,

                  borderTop:true,

                  borderBottom:false,

                  translucent:true,

                  barColor:'#999',

                  zindex:1

                  });


                  row.add(lb);

                  row.add(toolbar1);

                  tv.appendRow(row);

                  }

                  win1.add(tv);

                  //

                  //  add tabs

                  //

                  tabGroup.addTab(tab1);  

                  // open tab group

                  tabGroup.open();



                  2011.08.27 Saturday

                  Titaniumメモ:戻るボタンを消す

                  0
                    Titanium Mobileで開発していて、 やっていいことなのかどうかは別として、戻るボタンを消したい時がある。

                    戻るときは処理を完了させる「完了ボタン」を押してほしい。
                    戻るボタンを押して戻られると処理の完了をさせるのに困る。
                    ※戻るボタンにaddEventListenerをつければいいかもしれないけど、バグの原因になりそう。

                    そんな時は戻るボタンを消してしまえ!と。

                    win.leftNavButton = null;

                    これで消えた。正しい方法かはわからないけど、とりあえずちゃんと消えた。


                    2011.08.26 Friday

                    Titaniumメモ:WebViewでhtml表示が上手くいかない時

                    0
                      テンポラリーに保存した画像ファイルをwebviewのhtmlの中のimgタグから呼び出していたら、その直前にhtmlに入れるhtmlテキストをalertで出力すると適切に表示されてたから、うまくいっていると思っていた。

                      ところが、alertを抜いたら、画像が表示されない。

                      var wv = Ti.UI.createWebView();
                      var htmlStr = '';
                      htmlStr += 
                      'XXXXXXXX'+
                      'YYYYYYYYYY'+
                      'ZZZZZZZ';

                      alert(htmlStr);
                      wv.html = htmlStr;
                      という感じ。

                      alertで表示のタイミングがずれてるだけかなと思って、setIntervalで10秒まっても画像がでない。alertを入れると、0.1秒でも表示される。

                      WebViewのhtmlプロパティにhtmlテキストが設置される前に、一旦テキストを評価させる必要がなるのかなと思い、画面外にテキストエリアをおいてみたり、Ti.API.infoで出力してみたりいろいろ試したけど解決せず。

                      結果的にうまく行ったのは、テンポラリーのhtmlファイルを作ること。

                      var tmp_file = Titanium.Filesystem.tempDirectory+"_TEMP_prev.html";

                      var file = Titanium.Filesystem.getFile(tmp_file);

                      file.write( htmlStr );

                      pre_wv.url = tmp_file;

                      という感じ。ファイル化した時点で評価されてるんじゃないかなと予想。
                      Objective-Cのことが全然わからないので、内部的にどうなってるからこうなってるなという予想ができないのが痛いところだけど、とりあえず動くようになったのでよし。
                      2011.08.25 Thursday

                      Titaniumメモ:実機転送エラー

                      0
                         Titanium MobileでiOSシミュレーターではちゃんと動く、他のプロジェクトは実機転送できる、それなのにあるプロジェクトだけ転送に"builder.py"のエラーが起きる、そんな時の一つの可能性。

                        Resourcesフォルダの中に、使わない日本語を含むファイルが入れっぱなしになっていないか。

                        僕はこれではまった。app.jsを大幅に変更した際に、間違ったときようにappコピー.jsの名前で複製を作っておいた。使わないからそのままでいいだろうと思っていたらこいつが原因でbuilder.pyのエラーが起きていたっぽい。

                        Resourcesフォルダからコピーの方をどけて、念の為にbuildの中身も削除しなおしてビルドしたら無事転送できるようになった。

                        エラーが起きた時の可能性の一つだろうと。先日のも合わせて、Titaniumには日本語のフォルダ、ファイル名は直接使うわけではなさそうな部分でも使わないほうがよさそう。
                        Calendar
                           1234
                        567891011
                        12131415161718
                        19202122232425
                        2627282930  
                        << April 2020 >>
                        PR
                        Selected Entries
                        Categories
                        Archives
                        Recent Comment
                        • iPhoneアプリ第2弾リリース!幼児用名前書き取りの練習用紙を作るアプリ
                          luxury replica watches (11/15)
                        • iPhoneアプリ「WebFullCapture」はブログや資料作りに便利だよ
                          nbun (02/04)
                        • iPhoneアプリの審査状況(完)
                          AtoZ (08/26)
                        Recommend
                        Links
                        Profile
                        Search this site.
                        Others
                        Mobile
                        qrcode
                        Powered by
                        30days Album
                        無料ブログ作成サービス JUGEM