iOS アプリで URL スキームを開く : Objective-C プログラミング

SPECIAL


iOS アプリで URL スキームを開く

あるアプリが別のアプリを呼び出す方法にURL スキームというものがあります。

独自の URL スキームを自分のアプリに実装する方法は カスタム URL スキームを実装する で紹介しましたが、ここでは自分のアプリが別のアプリの URL スキームを開く方法をみて行きます。

URL スキームを開く

iOS アプリ内から URL スキームを開くには、UIApplication の openURL: メソッドを使います。

自身の UIApplication インスタンスは +sharedApplication メソッドで取得できるので、たとえば変数 scheme で指定している URL を開く場合は次のようにします。

[[UIApplication sharedApplication] openURL:scheme];

こうすることで openURL: に指定した URL を処理対象としているアプリに制御が遷ります。

ちなみに制御が遷るタイミングは、このメソッドを実行した直後ではなく、これが記載されているプログラムの流れがひと通り完結したタイミングで呼び出されます。

URL スキームが開けるかを確認する

UIApplication の canOpenURL: を使うと、指定した URL スキームを処理対象とするアプリがあるかを調べられます。

if ([[UIApplication sharedApplication] canOpenURL:scheme])

{

}

指定した scheme が表現する URL スキームが開ける場合、このメソッドは YES を返します。

URL スキームを開くのに時間がかかる場合

たとえば、他のアプリから URL スキームで自分のアプリが呼び出されて、その流れでさらに他の URL スキームを呼び出したいような場合に、openURL: メソッドを呼び出してから 10 秒くらい反応がなくなる場合がありました。

このような場合は、次のようにすることで解消できるようでした。

UIApplication* application = [UIApplication sharedApplication];

[application performSelectorOnMainThread:@selector(openURL:) withObject:scheme waitUntilDone:NO];

きっと呼び出し上のタイミングの問題なのでしょう。

このようにメインスレッドのキューに openURL: を入れることで、呼び出した openURL: メソッドの実行順番が最後尾に整列されるので、動作不良を起こさなくなる様子でした。

[ もどる ]