November 2009 Archives

iPhoneOSでは、各アプリケーションごとに、独自のURLスキームを定義できることは、iPhoneアプリケーション開発者のみなさんはご存知のことと思います。そのURLが、-[UIApplication openURL:]メソッドの引数で渡されると、対応するアプリケーションが起動されます。
起動される側のアプリケーションは、Application DelegateクラスでそのURLを受け取って、必要な処理を行います。
iPhoneOS 2.xまでは、URLのハンドリングは、application:handleOpenURL: メソッドでのみ行うことが可能でしたが。3.0からは、新しく追加された、application:didFinishLaunchingWithOptions: メソッドでも可能となりました。
このapplication:didFinishLaunchingWithOptions: メソッドのことを簡単にまとめると、以下のような感じになります。(詳細は、UIApplicationDelegate Protocol Reference を参照してください)
  • これまでの、applicationDidFinishLaunching: メソッドに、起動時のオプションパラメタを処理する機能が追加されたものである。
  • application:didFinishLaunchingWithOptions: メソッドが存在していると、applicationDidFinishLaunching: メソッドと、application:handleOpenURL: メソッドは、呼ばれなくなる。
  • 引数で渡される起動オプションは、NSDictionaryオブジェクトであり、push notificationまたは、URL起動時のパラメタが格納されている。
ということで、applicationDidFinishLaunching: メソッドと、application:handleOpenURL: メソッドを合成したようなものであると言えます。

URL起動の場合、起動オプションには、以下の2つのキーが存在します。
  • UIApplicationLaunchOptionsURLKey - 起動URLオブジェクト(NSURL)
  • UIApplicationLaunchOptionsSourceApplicationKey - 起動元アプリケーションのバンドル名
ふつうに、ホーム画面のアイコンをタップして起動された場合は、起動オプションはnilになります。

Location Clip 1.2 では、カメラで撮った写真をカメラロールに保存する機能がありますが、今日は、この機能の実装について取り上げたいと思います。

皆さんご存知の通り、写真をカメラロールに保存する際に利用するAPIは・・・

ですが、以下のような実装だけで終わらせている(保存完了のコールバックを設定していない)サンプルを実によく見かけます。

このような実装は、一見簡単でいいように見えますが、もし、このように実装してしまった場合、写真を保存し終わったことをアプリケーションが知る術がなくなってしまい、ちゃんと保存できたのかどうかを、アプリケーションで判断できなくなってしまいます。
処理が正常に終わったかどうかを確認するために、ちゃんとcompletionTargetとcompletionSelectorを設定するようにしましょう。

そしてまた、保存処理中にアプリケーションを終了してしまったりすると、カメラロールに写真が保存できなかったり、サムネイルが保存されなかったりすることがあるため、 UIActivityIndicatorView などを使って保存処理中であることをユーザに対して示すような配慮をしてあげると良いと思います。

iPhone Applications

Twitter