別のアプリ(iPhone)からアプリを起動する


170

別のアプリ内から任意のiPhoneアプリケーションを起動することはできますか?たとえば 、ユーザーがボタンを押して電話アプリを直接起動する(現在のアプリを閉じ、電話アプリを開く)場合、私のアプリケーションでは

これは可能でしょうか?これは電話のURLリンクを使用して電話をかけるために実行できることはわかっていますが、代わりに特定の番号をダイヤルせずに電話アプリを起動したいだけです。

回答:


80

Kevinが指摘するように、URLスキームはアプリ間で通信する唯一の方法です。したがって、いいえ、任意のアプリを起動することはできません。

ただし、URLスキームを登録するアプリは、Appleのものでも、あなたのものでも、他の開発者のものでも起動できます。ドキュメントはここにあります:

他のアプリケーションとの通信

電話の起動については、電話を起動するtel:前にリンクに3桁以上が必要なようです。したがって、番号をダイヤルせずにアプリにドロップすることはできません。


8
問題のアプリケーションがインストールされているかどうかは、UIApplicationの-(BOOL)canOpenURL:(NSURL *)url
Willster

1
2つのアプリが同じURLハンドラーを登録し、そのURLが呼び出された場合はどうなりますか?私はAndroidでリスト付きで表示されるので、実行する2つのうちどちらを選択するかを知っています。iOSはこれをどのように処理しますか?
eggie5

3
注:複数のサードパーティアプリが同じURLスキームを処理するために登録する場合、そのスキームが与えられるアプリを決定するプロセスは現在ありません。参考:developer.apple.com/library/ios/#documentation/iPhone/...
フューチャー

2
これは、同じURLスキームを処理するために登録する複数のサードパーティアプリに関する注記を記載した更新されたリンクです:Apple Docs
SindriJóelssonJun

再び時代遅れ。更新されたリンク:developer.apple.com/documentation/uikit/...
デイブNottage

78

別のアプリを開くことができるアプリを書くのは簡単だということがわかりました。

とという2つのアプリがあるとFirstAppSecondAppます。FirstAppを開くときに、ボタンをクリックしてSecondAppを開くことができるようにします。これを行うための解決策は次のとおりです。

  1. SecondApp

    SecondAppのplistファイルに移動し、文字列iOSDevTipsを含むURLスキームを追加する必要があります(もちろん、別の文字列を記述することもできます。

ここに画像の説明を入力してください

2。FirstApp

以下のアクションでボタンを作成します。

- (void)buttonPressed:(UIButton *)button
{
  NSString *customURL = @"iOSDevTips://";

  if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:customURL]])
  {
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:customURL]];
  }
  else
  {
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"URL error"
                              message:[NSString stringWithFormat:@"No custom URL defined for %@", customURL]
                              delegate:self cancelButtonTitle:@"Ok" 
                              otherButtonTitles:nil];
    [alert show];
  }

}

それでおしまい。これで、FirstAppのボタンをクリックできると、SecondAppが開きます。


2
あなたはここに完全な説明を参照することができますiosdevelopertips.com/cocoa/...
youssman

1
私はあなたのポスト次午前、サファリは、アプリケーションを開くことができますが、別のアプリケーションを開いていない(ボタンがメソッドを押す)elseブロックが実行される@Lee、問題は何であるあなたが助け私喜ばことができます
スリニバスnは

問題の詳細を教えてください
lee

1
これを機能させることができない人は、に 'LSApplicationQueriesSchemes'という名前の文字列の配列を追加Info.plistFirstAppます。次に、アプリが開きたいスキームを追加します。この場合は次のItem 0ようになりますiOSDevTips

1
以下のKIOの回答も参照してください(stackoverflow.com/a/33763449/394969)。FirstAppは、SecondApp LSApplicationQueriesSchemesを開くことができるように、Info.plist に追加する必要があります。
John Erck 2017年

28

leeの答えは、8より前のiOSでは完全に正しいです。

iOS 9以降では、LSApplicationQueriesSchemesキー(文字列の配列)の下のInfo.plistで、アプリがクエリするURLスキームをホワイトリストに登録する必要があります。

ここに画像の説明を入力してください


2
最良の答えは、@ KIOとvilly393の間のマージである必要があります
Gustavo Barbosa

19

スウィフトで

念のために、誰かがSwiftの簡単なコピーと貼り付けを探していました。

if let url = NSURL(string: "app://") where UIApplication.sharedApplication().canOpenURL(url) {
            UIApplication.sharedApplication().openURL(url)
} else if let itunesUrl = NSURL(string: "https://itunes.apple.com/itunes-link-to-app") where UIApplication.sharedApplication().canOpenURL(itunesUrl) {
            UIApplication.sharedApplication().openURL(itunesUrl)      
}

13

別のアプリケーションからアプリケーションを開くことができるようにするには、両方のアプリケーションで変更を加える必要があります。iOS 10でSwift 3を使用する手順は次のとおりですアップデートで。

1.開きたいアプリケーションを登録します

Info.plistアプリケーションのカスタムで一意のURLスキームを定義して、を更新します。

ここに画像の説明を入力してください

スキーム名は一意である必要があります。それ以外の場合、同じURLスキーム名を持つ別のアプリケーションがデバイスにインストールされている場合、これは実行されるアプリケーションによって異なります。

2.メインアプリケーションに以前のURLスキームを含める

アプリcanOpenURL:UIApplicationクラスのメソッドで使用できるようにするURLスキームを指定する必要があります。したがって、メインアプリケーションを開き、Info.plist他のアプリケーションのURLスキームをに追加しますLSApplicationQueriesSchemes(iOS 9.0で導入)

ここに画像の説明を入力してください

3.アプリケーションを開くアクションを実装する

これですべてがセットアップされたので、他のアプリを開くメインアプリケーションでコードを書くのは良いことです。これは次のようになります。

let appURLScheme = "MyAppToOpen://"

guard let appURL = URL(string: appURLScheme) else {
    return
}

if UIApplication.shared.canOpenURL(appURL) {

    if #available(iOS 10.0, *) {
        UIApplication.shared.open(appURL)
    }
    else {
        UIApplication.shared.openURL(appURL)
    }
}
else {
    // Here you can handle the case when your other application cannot be opened for any reason.
}

既存のアプリ(AppStoreからインストール)を開く場合は、これらの変更に新しいリリースが必要であることに注意してください。Apple AppStoreにリリース済みのアプリケーションを開く場合は、URLスキーム登録を含む新しいバージョンを最初にアップロードする必要があります。


1
これが正解です。「LSApplicationQueriesSchemes」を追加するだけでは機能しないことに気づきました。「URLスキーム」もinfo.plistに追加する必要があります。
Shailesh


9

これを実現するには、両方のアプリに数行のコードを追加する必要があります

アプリA:別のアプリから開きたいもの。(ソース)

アプリBアプリBからアプリA (宛先)を開きます

アプリAのコード

アプリAのPlistにいくつかのタグを追加します。XMLの下に、アプリAの Plistソースと過去を開きます。

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLName</key>
        <string>com.TestApp</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>testApp.linking</string>
        </array>
    </dict>
</array>

アプリAのアプリデリゲート内-ここでコールバックを取得

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
// You we get the call back here when App B will try to Open 
// sourceApplication will have the bundle ID of the App B
// [url query] will provide you the whole URL 
// [url query] with the help of this you can also pass the value from App B and get that value here 
}

App Bコードに来ています -

入力パラメーターなしでアプリAを開きたいだけの場合

-(IBAction)openApp_A:(id)sender{

    if(![[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"testApp.linking://?"]]){
         UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"App is not available!" message:nil delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
            [alert show];

        }
}

App BからApp Aにパラメーターを渡す場合は、以下のコードを使用します

-(IBAction)openApp_A:(id)sender{
    if(![[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"testApp.linking://?userName=abe&registered=1&Password=123abc"]]){
         UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"App is not available!" message:nil delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
            [alert show];

        }
}

注:testApp.linking://?と入力するだけでアプリを開くこともできます。サファリブラウザで


7

次のコードを試して、アプリケーションからアプリケーションを起動するのに役立ちます

注:名前fantacyを実際のアプリケーション名に置き換えます

NSString *mystr=[[NSString alloc] initWithFormat:@"fantacy://location?id=1"];
NSURL *myurl=[[NSURL alloc] initWithString:mystr];
[[UIApplication sharedApplication] openURL:myurl];

7

URLスキームを登録したアプリのみを起動できます。その後、sms:を使用してSMSアプリを開くように、URLスキームを使用してアプリを開くことができます。

これを実証するLaunchMeと呼ばれるドキュメントで利用できる非常に良い例があります。

2017年11月6日のLaunchMeサンプルコード


回答を更新しました。お
役に立てば幸い

ありがとう。たまたま、あなたはiOS Developer Familyチャットルームに属していますか?
2017年

4

いいえ、ちがいます。文書化されたURLハンドラー以外に、別のアプリと通信/起動する方法はありません。


3

私もしばらく前にこれを試しました(Identifierを使用してiPhoneアプリケーションを起動する)が、これを行うための文書化された方法はありません。:)


2
文書化されています... Appleのドキュメントを確認してください。developer.apple.com/library/IOs/#documentation/iPhone/…–
Moszi

1
私はURLスキームが可能であることを知っていますが、私の質問とJeffが尋ねたのは、URLスキームをサポートしていないアプリを開く方法です...
foebe

3

Swift 4.1およびXcode 9.4.1の場合

私は2つのアプリ1)PageViewControllerExampleと2)DelegateExampleを持っています。次に、PageViewControllerExampleアプリでDelegateExampleアプリを開きます。PageViewControllerExampleの[開く]ボタンをクリックすると、DelegateExampleアプリが開きます。

このため、両方のアプリの.plistファイルにいくつかの変更を加える必要があります。

ステップ1

DelegateExampleアプリで.plistファイルを開き、URLタイプとURLスキームを追加します。ここで、「myapp」のような必要な名前を追加する必要があります。

ここに画像の説明を入力してください

ステップ2

PageViewControllerExampleアプリで.plistファイルを開き、このコードを追加します

<key>LSApplicationQueriesSchemes</key>
<array>
    <string>myapp</string>
</array>

PageViewControllerExampleのボタンをクリックすると、DelegateExampleアプリを開くことができます。

//In PageViewControllerExample create IBAction
@IBAction func openapp(_ sender: UIButton) {

    let customURL = URL(string: "myapp://")
    if UIApplication.shared.canOpenURL(customURL!) {

        //let systemVersion = UIDevice.current.systemVersion//Get OS version
        //if Double(systemVersion)! >= 10.0 {//10 or above versions
            //print(systemVersion)
            //UIApplication.shared.open(customURL!, options: [:], completionHandler: nil)
        //} else {
            //UIApplication.shared.openURL(customURL!)
        //}

        //OR

        if #available(iOS 10.0, *) {
            UIApplication.shared.open(customURL!, options: [:], completionHandler: nil)
        } else {
            UIApplication.shared.openURL(customURL!)
        }
    } else {
         //Print alert here
    }
}

すばらしいです。次に、ソースアプリから宛先アプリに引数を渡す方法を教えてください。
Vigneswaran A

2

このトピックに関する注意事項...

登録されていないプロトコルには、50のリクエスト制限があります。

このディスカッションで、アップルは、特定のバージョンのアプリではcanOpenUrl、限られた回数しかクエリを実行できず、宣言されていないスキームを50呼び出すと失敗すること述べましたます。また、この障害状態に入るとプロトコルが追加された場合でも、プロトコルは失敗することを確認しました。

これに注意してください、誰かに役立つかもしれません。


0

@ villy393のSwift 3クイックアンドペーストバージョンの回答:

if UIApplication.shared.canOpenURL(openURL) {
    UIApplication.shared.openURL(openURL)
} else if UIApplication.shared.canOpenURL(installUrl) 
    UIApplication.shared.openURL(installUrl)
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.