web-dev-qa-db-ja.com

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

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

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

163
Jeff

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

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

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

電話の起動に関しては、tel:リンクには、電話を起動する前に少なくとも3桁の数字が必要であるように見えます。したがって、番号をダイヤルせずにアプリにドロップすることはできません。

78
Gordon Wilson

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

FirstAppSecondAppという2つのアプリがあると仮定しましょう。 FirstAppを開くとき、ボタンをクリックしてSecondAppを開くことができるようにします。これを行うためのソリューションは次のとおりです。

  1. SecondAppで

    SecondAppのplistファイルに移動し、RL Schemesを文字列で追加する必要がありますiOSDevTips(もちろん、別のstring.itを自由に書くことができます)。

enter image description here

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が開きます。

72
lee

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

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

enter image description here

25
KIO

In Swift

誰かが簡単に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)      
}
16
villy393

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

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

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

enter image description here

スキーム名は一意である必要があることに注意してください。そうしないと、同じURLスキーム名を持つ別のアプリケーションがデバイスにインストールされている場合、これが実行時に決定されます

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

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

enter image description here

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スキームの登録を含む新しいバージョンを最初にアップロードする必要があります。

11
choofie

別のアプリ内からアプリケーションを起動するための優れたチュートリアルを次に示します。
iOS SDK:URLスキームの操作
そして、任意のアプリケーションを起動することはできませんが、 RL Schemes を登録したネイティブアプリケーションは起動できます。

10
Nickolas

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

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

LaunchMeサンプルコード 2017年11月6日現在.

7
lostInTransit

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

アプリA:別のアプリから開きます。 (ソース)

アプリB:開くアプリBからアプリA(宛先)

アプリAのコード

App 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>

App 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
Alok

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

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

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

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

3
Lily Ballard

私もこれを試しました( 識別子付きのiPhoneアプリケーションの起動 )が、これを行うための確実な方法はありません。 :)

2
Foebe

Swift 4.1およびXcode 9.4.1

2つのアプリ1)PageViewControllerExampleと2)DelegateExampleがあります。 PageViewControllerExampleアプリでDelegateExampleアプリを開きたいと思います。 PageViewControllerExampleの[開く]ボタンをクリックすると、DelegateExampleアプリが開きます。

そのためには、両方のアプリの.plistファイルを変更する必要があります。

ステップ1

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

enter image description here

ステップ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
    }
}
1
iOS

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

if UIApplication.shared.canOpenURL(openURL) {
    UIApplication.shared.openURL(openURL)
} else if UIApplication.shared.canOpenURL(installUrl) 
    UIApplication.shared.openURL(installUrl)
}
0
cdescours

このトピックに関する補足事項...

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

この説明では Appleは、アプリの特定のバージョンについては、canOpenUrlに限られた回数しかクエリできないこと、および宣言されていないスキームを50回呼び出すと失敗します。また、この失敗状態になった後にプロトコルを追加すると、失敗することも確認しました。

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

0
Duncan Hoggan