Luncurkan aplikasi dari dalam (iPhone) lain

170

Apakah mungkin untuk meluncurkan aplikasi iPhone sembarang dari dalam aplikasi lain ?, Misalnya dalam aplikasi saya jika saya ingin pengguna menekan tombol dan meluncurkan langsung ke aplikasi Phone (tutup aplikasi saat ini, buka aplikasi Phone) .

apakah ini mungkin? Saya tahu ini dapat dilakukan untuk membuat panggilan telepon dengan tautan URL tel, tetapi saya ingin hanya menjalankan aplikasi Telepon tanpa menekan nomor tertentu.

Alok
sumber

Jawaban:

80

Seperti yang ditunjukkan Kevin, Skema URL adalah satu-satunya cara untuk berkomunikasi antar aplikasi. Jadi, tidak, tidak mungkin meluncurkan aplikasi yang sewenang-wenang.

Tetapi dimungkinkan untuk meluncurkan aplikasi apa pun yang mendaftarkan Skema URL, apakah itu milik Apple, milik Anda, atau pengembang lain. Dokumen ada di sini:

Berkomunikasi dengan Aplikasi Lain

Sedangkan untuk meluncurkan ponsel, sepertinya tel:tautan Anda harus memiliki setidaknya tiga digit sebelum ponsel akan diluncurkan. Jadi, Anda tidak bisa begitu saja masuk ke aplikasi tanpa menekan nomor.

Gordon Wilson
sumber
8
Anda dapat memeriksa apakah aplikasi yang bersangkutan diinstal dengan menggunakan UIApplication's - (BOOL) canOpenURL: (NSURL *) url
Willster
1
apa yang terjadi jika 2 aplikasi mendaftarkan url handler yang sama dan kemudian url dipanggil? Saya tahu di Android Anda akan disajikan dengan daftar sehingga Anda dapat memilih yang mana dari dua yang ingin Anda jalankan. Bagaimana ios menangani ini?
eggie5
3
Catatan: Jika lebih dari satu aplikasi pihak ketiga mendaftar untuk menangani skema URL yang sama, saat ini tidak ada proses untuk menentukan aplikasi mana yang akan diberikan skema itu. Ref: developer.apple.com/library/ios/#documentation/iPhone/…
Futur
2
Ini adalah tautan yang diperbarui yang menyebutkan catatan tentang lebih dari satu aplikasi pihak ketiga yang mendaftar untuk menangani skema URL yang sama: Apple Documents
Sindri Jóelsson
Kedaluwarsa lagi. Tautan yang diperbarui: developer.apple.com/documentation/uikit/...
Dave Nottage
78

Saya menemukan bahwa mudah untuk menulis aplikasi yang dapat membuka aplikasi lain.

Mari kita asumsikan kita memiliki dua aplikasi bernama FirstAppdan SecondApp. Ketika kami membuka FirstApp, kami ingin dapat membuka SecondApp dengan mengklik tombol. Solusi untuk melakukan ini adalah:

  1. Di SecondApp

    Pergi ke file plist dari SecondApp dan Anda perlu menambahkan Skema URL dengan string iOSDevTips (tentu saja Anda dapat menulis string lain. Terserah Anda).

masukkan deskripsi gambar di sini

2. Di FirstApp

Buat tombol dengan tindakan di bawah ini:

- (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];
  }

}

Itu dia. Sekarang ketika Anda dapat mengklik tombol di FirstApp itu harus membuka SecondApp.

lee
sumber
2
Anda dapat melihat penjelasan lengkapnya di sini iosdevelopertips.com/cocoa/…
youssman
1
@Lee Saya mengikuti posting Anda, safari dapat membuka aplikasi tetapi aplikasi lain tidak terbuka (tombol ditekan metode) blok lain dijalankan, apa masalahnya bisa tolong bantu saya
srinivas n
Tolong beri saya lebih banyak detail masalah Anda
lee
1
Orang-orang yang tidak bisa mendapatkan ini untuk bekerja, menambahkan array dari string bernama 'LSApplicationQueriesSchemes' di Info.plistsatu FirstApp. Kemudian tambahkan skema yang ingin dibuka aplikasi Anda, dalam hal ini Item 0adalahiOSDevTips
1
Lihat juga jawaban KIO di bawah ini ( stackoverflow.com/a/33763449/394969 ). FirstApp perlu menambahkan LSApplicationQueriesSchemeske Info.plist-nya untuk dapat membuka SecondApp.
John Erck
28

Jawaban lee benar-benar benar untuk iOS sebelum 8.

Di iOS 9+ Anda harus memasukkan daftar putih skema URL apa pun yang ingin ditanyakan oleh Aplikasi Anda di Info.plist di bawah kunci LSApplicationQueriesSchemes (array string):

masukkan deskripsi gambar di sini

KIO
sumber
2
Jawaban terbaik adalah gabungan antara @KIO dan villy393
Gustavo Barbosa
19

Dalam Swift

Untuk berjaga-jaga seandainya seseorang mencari salinan dan tempel Swift cepat.

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)      
}
villy393
sumber
13

Agar Anda dapat membuka aplikasi dari yang lain, Anda harus melakukan perubahan di kedua aplikasi tersebut. Berikut langkah-langkah menggunakan Swift 3 dengan pembaruan iOS 10 :

1. Daftarkan aplikasi Anda yang ingin Anda buka

Perbarui Info.plistdengan mendefinisikan Skema URL khusus dan unik aplikasi Anda.

masukkan deskripsi gambar di sini

Perhatikan bahwa nama skema Anda harus unik, jika tidak, jika Anda memiliki aplikasi lain dengan nama skema URL yang sama diinstal pada perangkat Anda, maka ini akan ditentukan runtime mana yang akan dibuka.

2. Sertakan skema URL sebelumnya di aplikasi utama Anda

Anda harus menentukan skema URL yang Anda inginkan agar aplikasi dapat digunakan dengan canOpenURL:metode UIApplicationkelas. Jadi buka aplikasi utama Info.plistdan tambahkan skema URL aplikasi lain LSApplicationQueriesSchemes. (Diperkenalkan di iOS 9.0)

masukkan deskripsi gambar di sini

3. Terapkan tindakan yang membuka aplikasi Anda

Sekarang semuanya sudah diatur, jadi Anda baik untuk menulis kode Anda di aplikasi utama Anda yang membuka aplikasi Anda yang lain. Seharusnya terlihat seperti ini:

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.
}

Perhatikan bahwa perubahan ini memerlukan rilis baru jika Anda ingin aplikasi Anda yang sudah ada (diinstal dari AppStore) untuk dibuka. Jika Anda ingin membuka aplikasi yang sudah Anda lepaskan ke Apple AppStore, maka Anda harus mengunggah versi baru yang mencakup pendaftaran skema URL Anda.

choofie
sumber
1
Ini adalah jawaban yang benar. Saya perhatikan bahwa hanya menambahkan "LSApplicationQueriesSchemes" tidak berfungsi, "Skema URL" juga perlu ditambahkan di info.plist.
Shailesh
11

Berikut ini adalah tutorial yang bagus untuk meluncurkan aplikasi dari dalam aplikasi lain:
iOS SDK: Bekerja dengan Skema URL
Dan, tidak mungkin untuk meluncurkan aplikasi sewenang-wenang, tetapi aplikasi asli yang mendaftarkan Skema URL .

Nickolas
sumber
9

Untuk mencapai ini, kita perlu menambahkan beberapa baris Kode di kedua Aplikasi

Aplikasi A: Yang ingin Anda buka dari Aplikasi lain. (Sumber)

Aplikasi B : Dari Aplikasi B Anda ingin membuka Aplikasi A (Tujuan)

Kode untuk Aplikasi A

Tambahkan beberapa tag ke Plist of App A Open Plist Source dari App A dan Past di bawah XML

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

Di App delegate App A - Dapatkan Panggilan Balik di sini

- (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 
}

Sekarang datang ke kode App B -

Jika Anda hanya ingin membuka Aplikasi A tanpa parameter input apa pun

-(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];

        }
}

Jika Anda ingin meneruskan parameter dari App B ke App A, gunakan Kode di bawah ini

-(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];

        }
}

Catatan: Anda juga dapat membuka Aplikasi dengan cukup ketik testApp.linking: //? di browser safari

Alok
sumber
7

Coba kode berikut ini akan membantu Anda untuk Meluncurkan aplikasi dari aplikasi Anda

Catatan: Ganti nama fantacy dengan nama aplikasi yang sebenarnya

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

Anda hanya dapat meluncurkan aplikasi yang telah mendaftarkan skema URL. Maka sama seperti Anda membuka aplikasi SMS dengan menggunakan sms :, Anda akan dapat membuka aplikasi menggunakan skema URL mereka.

Ada contoh yang sangat bagus yang tersedia dalam dokumen yang disebut LaunchMe yang menunjukkan ini.

Kode contoh LaunchMe per 6 November 2017.

hilangInTransit
sumber
Jawaban yang diperbarui. Semoga itu bisa membantu
hilangInTransit
Terima kasih; kebetulan, apakah Anda termasuk dalam ruang obrolan Keluarga Pengembang iOS?
Eenvincible
4

Bukan itu. Selain penangan URL yang terdokumentasi, tidak ada cara untuk berkomunikasi dengan / meluncurkan aplikasi lain.

Lily Ballard
sumber
3

Dalam Swift 4.1 dan Xcode 9.4.1

Saya memiliki dua aplikasi 1) PageViewControllerExample dan 2) DelegateExample. Sekarang saya ingin membuka aplikasi DelegateExample dengan aplikasi PageViewControllerExample. Ketika saya mengklik tombol terbuka di PageViewControllerExample, aplikasi DelegateExample akan dibuka.

Untuk ini, kita perlu membuat beberapa perubahan pada file .plist untuk kedua aplikasi.

Langkah 1

Dalam aplikasi DelegateExample buka file .plist dan tambahkan Jenis URL serta Skema URL. Di sini kita perlu menambahkan nama yang diperlukan seperti "myapp".

masukkan deskripsi gambar di sini

Langkah 2

Di aplikasi PageViewControllerExample, buka file .plist dan tambahkan kode ini

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

Sekarang kita dapat membuka aplikasi DelegateExample ketika kita mengklik tombol di PageViewControllerExample.

//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
    }
}
iOS
sumber
Bagus, itu membantu. Sekarang bagaimana cara menyampaikan argumen dari aplikasi sumber ke aplikasi tujuan?
Vigneswaran A
2

Catatan tambahan tentang topik ini ...

Ada batas permintaan 50 untuk protokol yang tidak terdaftar.

Dalam diskusi apel ini menyebutkan bahwa untuk versi aplikasi tertentu Anda hanya dapat menanyakan canOpenUrljumlah terbatas kali dan akan gagal setelah 50 panggilan untuk skema yang tidak diumumkan . Saya juga melihat bahwa jika protokol ditambahkan setelah Anda memasuki kondisi gagal ini, ia masih akan gagal.

Waspadai hal ini, bisa bermanfaat bagi seseorang.

Duncan Hoggan
sumber
0

Swift 3 versi cepat dan rekatkan jawaban @ villy393 untuk:

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