OpenURLを使ったデータ共有

OpenURLを使った共有はiOSアプリ間の情報共有で一番基本的です。 一番最初からあるファイル共有機能として、いろいろなアプリで広く使われています。

OpenURLで他のアプリを起動する

OpenURLでは、それぞれのアプリに指定されている「URLSchema」という文字列を使って他のアプリを起動します。 例えば、「myreceivedatademo://」という「URLSchema」を持つアプリに「testinformation」という文字を送りたい場合には、このように記述します。

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"myreceivedatademo://testinformation"]];

また、この仕組みはアプリ間だけでなくSafariやMailなどからでも使えるので、htmlにこちらを記述すれば、上記と同様にアプリを起動できます。

<a href="myreceivedatademo://testinformation">Click Here</a>

情報を受けとる側

OpenURLで起動されるためには、あらかじめアプリの設定ファイルに「URLSchema」を登録しておく必要があります。 Xcode4.5では以前よりちょっと設定が楽になっています。

TargetのInfoタブを開き、URL Typesに自分のアプリで使いたい「URLSchema」を登録すれば大丈夫。 ここの「Identifier」「Icons」「Role」は特に入力しなくても大丈夫です。

情報を受けとった時の処理

OpenURLでアプリが起動された場合、UIApplicationのこの関数で処理を行います。 application:(UIApplication )application didFinishLaunchingWithOptions:(NSDictionary )launchOptions application:(UIApplication )application openURL:(NSURL )url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation

受け取る側のアプリの起動状態によって呼ばれる関数がちょっと違い、アプリ自身が既に起動済みの場合にはopenURLだけが呼ばれますが、アプリがまだ起動されていない場合には、didFinishLaunchingWithOptionsとopenURLが続けて呼ばれます。 ただ、その場合にも最終的にはopenURLが呼ばれるので、実質的にはopenURLだけで処理をしていれば問題はないでしょう。

また、以前はapplication:(UIApplication )application handleOpenURL:(NSURL )urlで処理をしていましたが、現在ではopenURLで処理をすることが推奨されています。 openURLで処理をすると、呼び出し側のアプリのBundle Identifierを取得することができるのでhandleOpenURLより便利です。

OpenURLの利点、欠点

OpenURLの利点は、アプリ間連携として一般的な方法であり、古いOSでも使えること。 また、Safariなどからも使用できる点は、他の連携方法には見られない特徴です。 Androidでも同じ方法で起動できることも見逃せない利点ですね。

欠点は、よびだしたいアプリの「URLSchema」をあらかじめ知っておく必要があることですね。 また、文字列しか送ることができないのもちょっと使い勝手が悪いです。 「URLSchema」が他のアプリとかぶってしまった場合、起動される保証がないこともちょっと心配です。

サンプルソース

サンプルソースをGithubにおきました。 (OpenURL、UIDocumentInteractionController、UIActivityViewControllerを使ったファイル連携が実装されています。) SendDataDemo(情報を送る側) ReceiveDataDemo(情報を受け取る側)