2012年11月1日星期四

[iOS]UITableViewControllerが回転しない

autosizing をチェックした
shouldAutorotateToInterfaceOrientationがYES (Deprecated in iOS 6)
shouldAutorotateもYES (available in iOS 6)
ですが、
画面が回転しない。

悩むところで、
[Application windows are expected to have a root view controller at the end of application launch]の警告に気付いた。

やはりiOS 6では新しい書き方になった:

// [window addSubview:navigationController.view];
window.rootViewController = navigationController;


それて、解決、回転できた。

2012年10月28日星期日

[iOS]古いバージョンのxcodeをinstall

4.5のxcodeから、armv6のsimulatorとコンパイルがもうサポートしないので、必要な場合、古いバージョンのxcodeをインストールしかないみたいだ。
しかし、古いバージョンのxcode 3.2 dmgファイルからinstallすると、xcodeの開発アプリ(xcodetoolset)が新しいOS(10.7以上)ではinstallできない。install内容を指定する時、xcodetoolsetがチェックしていない状態で、変更もできない。

解決方法:
(例の環境 ーー xcode 3.2.5 dmg, Mac OS 10.7.5)
  1. ディスクユーティリティを使って、正式のdmgファイルを書き込みdmgファイルに変換する。
  2. 変換後のdmgファイルをマウントする。
  3. 「Xcode and iOS sdk」ファイルを右クリックして、「パッケージの内容を表示」を選択する
  4. textEditで Contents/iPHoneSDKSL.distファイルを開く
  5. 「10.7」を検索して、「10.8」に変更し、保存する。スクリプトを見ると、現在のシステムOSのバージョンにより大きいならばOKと思う。
今度インストールする時、「xcodetoolset」がチェックしている状態になる。

しかし、結果失敗!!!
インストール最後にクラッシュになって失敗した。
xcode自体は Mac OS 10.7.5には対応しないから。

一番簡単な方法がある:
Xcode 4.3をインストールすればいい、古いiOSバージョンを対応できる。



2012年10月4日星期四

[Android]ActionProvider

おかしかった。

昨日にActionProviderはoptionItemSelectedとうまく共存できなかったのに、今日referenceを読んだ後、何もせずでうまく行った。
referenceのところでこう書いた:
A menu item selection is processed in the following order:
The default implementation does not perform any action and returns false.
つまりdispatchEventみたいに処理順番がある。昨日多分どこかで順番を間違って、ShareActionProviderの動作を上書きした。あり得ないと思うけど、こうで自分の記憶をごまかすしかない。

ちなみに、ShareActionProviderのソースを見て、1番目のonMenuItemClickを使った。

[Android]Android library project作成と使用

最新のEclipse pluginで実験してみた。
Android Projectのproperty 設定の方にisLibraryをチェックすれば、eclipseが勝手にcompileして、jarを作ってくれる。

また使用する時、root folderの直下にlibsのフォルダーを作成して、jarファイルをそこに置いて(assetに入れると、無駄にpackage sizeを増やすだけ)、jarのclassファイルがapkに一緒にcompileするから。

2012年9月24日星期一

[iOS]certification file & provision file について纏め

突然provisionファイルの期限が切れたので、またiOSのアプリ認証手順を思い出すことになった。毎回ネットで調査して、頭の中にあまり整理してないで、手順通りにやるだけで済んだ。今回はちょっと手順の一歩ずつに理由と作用について纏めた。
  1. ローカル認証リクエスト(cerSigningRequest, CSR)ファイル作成。キーチェンアプリから作成したリクエストファイルには、RSA/2048 private key と public keyの情報を含んでいる。このキー情報を使用する前、認証局に承認する必要があるから、直接使うことができない。

  2. 証明書を発行。CSRをprovision管理サイトでuploadして、承認して、今度は証明書を発行してもらう。

  3. 証明書をdownloadして、情報交換キーファイル(p12)を作成。開発する時、アプリをsignするには、private keyも必要なんで、証明書からprivate keyを含んだ認証ファイルを作成。ここで書き出しパスワードの設定が必要なので、保存しとく方がいい。

  4. deviceIDを登録

  5. AppIDを登録

  6. deviceIDとAppIDと証明書をくっ付けって、provisionファイルを作成

  7. 開発PCに(3)の認証ファイルと(6)のprovisionファイルを登録

  8. 開発
纏めて全部で作ったファイルが三つにあった:
  1. リクエストファイル ーー .certSigningRequest
  2. 認証ファイル ーー .cer
  3. キーファイル ーー .p12

2012年9月4日星期二

[Android]FragmentTransactionとbackstackの関係

tabletのために開発したAndroid3.0に初めてFragmentを導入した。目的としては恐らくtabletの画面が大きいなので、Activity遷移する時、毎回全画面をrenderしなければならなくて、非効率だった。そこでFragmentを使って、Activity中の一部だけをrenderすることができる。

Android4.0から小さいなscreenでもFragmentがよく使われている。
最初に一つFragmentが作成られて、Activityの一部として表示される。入れ替わりたい時に、ActivityのFragmentManagerから新しtransactionを作って、入れ替わるの一連の動作を一つtransactionとしてcommitする。commitするまで、画面がrenderしない。

新しいFragmentを画面に表示する動作は、showじゃなくて、常にreplaceというmethodを使用している。
又replaceされたFragmentは現在表示している画面だ、一旦replaceされたら、Fragmentがdetachになる。前のFragmentの状態をそのまま保持したい場合、addToBackStackで新しいFragmentを追加してから、replaceする。しかし、addToBackStackでreplaceした後、更に新しいFragmentをreplaceする場合、popBackStackを使わないと、Stackの一番TopのFragmentだけが入れ替わられる。

2012年8月31日星期五

[iOS]NSURLConnectionのThread問題

NSURLConnectionを利用する場合、Threadの問題を注意する必要がある。
要求によって、http requestに非同期と同期の二つ方式を選択する場合がよくある。

  • 同期
基本はUIThreadに実行される。
UITheadに使う時、connectionWithRequest或はstartを使えば、問題なく送信ができる。
非UIThreadの場合、sendSynchronousRequest或はperformOnMainThread:selector(実はsendSynchronousRequestと同じだと思う)を使う、効果としてはUIThreadに実行していると同じ。

  • 非同期
非同期なので、必ず非UIThreadで実行している。
ここは注意するところ。
一般的に、NSURLConnectionを使用する場合、protocolをimplementする必要がある。なので、そのprotocolに従って定義したmethodを実行するThreadが終了したら、requestも正しく処理できない。異常現象としてはrequestが送信できない、エラーも出ない。これもUIThreadがよく使われる原因だ、UIThreadが終了しないから。
解決策の方法がたくさんあるが、原理は一つだ:何とかして、methodを実行するThreadを死なせないように。例えば、flagを立てってwhile loopを掛ける、或はCFRunLoopRun()とCFRunLoopStopを使うと、処理が完成する。