別のアプリ内から任意のiPhoneアプリケーションを起動することは可能ですか?たとえばユーザーにボタンを押して電話アプリを起動させたい場合(現在のアプリを閉じ、電話アプリを開きます)。
これは可能でしょうか? tel URLリンクを使用して電話をかけるためにこれを実行できることは知っていますが、代わりに特定の番号をダイヤルせずにPhoneアプリを起動するだけです。
Kevinが指摘するように、URLスキームはアプリ間で通信する唯一の方法です。そのため、任意のアプリを起動することはできません。
ただし、Apple、あなた、または他の開発者のURLスキームを登録するアプリを起動することは可能です。ドキュメントは次のとおりです。
電話の起動に関しては、tel:
リンクには、電話を起動する前に少なくとも3桁の数字が必要であるように見えます。したがって、番号をダイヤルせずにアプリにドロップすることはできません。
別のアプリを開くことができるアプリを書くのは簡単だとわかりました。
FirstApp
とSecondApp
という2つのアプリがあると仮定しましょう。 FirstAppを開くとき、ボタンをクリックしてSecondAppを開くことができるようにします。これを行うためのソリューションは次のとおりです。
SecondAppで
SecondAppのplistファイルに移動し、RL Schemesを文字列で追加する必要がありますiOSDevTips(もちろん、別のstring.itを自由に書くことができます)。
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が開きます。
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)
}
別のアプリケーションを開くには、両方のアプリケーションに変更を加える必要があります。 Swift 3とiOS 10アップデートを使用した手順は次のとおりです。
1。開きたいアプリケーションを登録します
アプリケーションのカスタムおよび一意のURLスキームを定義して、Info.plist
を更新します。
スキーム名は一意である必要があることに注意してください。そうしないと、同じURLスキーム名を持つ別のアプリケーションがデバイスにインストールされている場合、これが実行時に決定されます
2。メインアプリケーションに以前のURLスキームを含めます
アプリがUIApplication
クラスのcanOpenURL:
メソッドで使用できるようにする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スキームの登録を含む新しいバージョンを最初にアップロードする必要があります。
別のアプリ内からアプリケーションを起動するための優れたチュートリアルを次に示します。
iOS SDK:URLスキームの操作
そして、任意のアプリケーションを起動することはできませんが、 RL Schemes を登録したネイティブアプリケーションは起動できます。
URLスキームを登録したアプリのみを起動できます。次に、sms:を使用してSMSアプリを開くように、URLスキームを使用してアプリを開くことができます。
これを実証するLaunchMeと呼ばれるドキュメントには非常に良い例があります。
LaunchMeサンプルコード 2017年11月6日現在.
これを実現するには、両方のアプリに数行のコードを追加する必要があります
アプリ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®istered=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://?と入力するだけでアプリを開くこともできます
次のコードを試して、アプリケーションからアプリケーションを起動するのに役立ちます
注:名前の空想を実際のアプリケーション名に置き換えます
NSString *mystr=[[NSString alloc] initWithFormat:@"fantacy://location?id=1"];
NSURL *myurl=[[NSURL alloc] initWithString:mystr];
[[UIApplication sharedApplication] openURL:myurl];
いいえ、ちがいます。文書化されたURLハンドラー以外に、別のアプリと通信したり起動したりする方法はありません。
私もこれを試しました( 識別子付きのiPhoneアプリケーションの起動 )が、これを行うための確実な方法はありません。 :)
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
}
}
Swift 3クイックアンドペーストバージョンの@ villy393の回答:
if UIApplication.shared.canOpenURL(openURL) {
UIApplication.shared.openURL(openURL)
} else if UIApplication.shared.canOpenURL(installUrl)
UIApplication.shared.openURL(installUrl)
}
このトピックに関する補足事項...
登録されていないプロトコルには50のリクエスト制限があります。
この説明では Appleは、アプリの特定のバージョンについては、canOpenUrl
に限られた回数しかクエリできないこと、および宣言されていないスキームを50回呼び出すと失敗します。また、この失敗状態になった後にプロトコルを追加すると、失敗することも確認しました。
これに注意して、誰かに役立つかもしれません。