Başka bir uygulama içinden uygulama başlatma (iPhone)


170

Başka bir uygulamadan herhangi bir keyfi iPhone uygulamasını başlatmak mümkün mü ? , Örneğin , benim uygulamada kullanıcının bir düğmeye basmasını ve doğrudan Telefon uygulamasına başlamasını istiyorsanız (mevcut uygulamayı kapatın, Telefon uygulamasını açın) .

bu mümkün olur mu? Bunun tel URL bağlantısı ile telefon görüşmesi yapmak için yapılabileceğini biliyorum, ancak bunun yerine belirli bir numarayı çevirmeden Telefon uygulamasının başlatılmasını istiyorum.

Yanıtlar:


80

Kevin'in belirttiği gibi, uygulamalar arasında iletişim kurmanın tek yolu URL Şemalarıdır. Yani hayır, keyfi uygulamalar başlatmak mümkün değil.

Ancak ister Apple'ın, ister sizin veya başka bir geliştiricinin URL Şeması'nı kaydeden herhangi bir uygulamayı başlatmak mümkündür. Dokümanlar burada:

Diğer Uygulamalarla İletişim

Telefonu başlatmak için, tel:bağlantınızın telefonun başlayabilmesi için en az üç basamağa sahip olması gerektiği anlaşılıyor. Böylece, bir numara çevirmeden uygulamaya giremezsiniz.


8
Söz konusu uygulamanın yüklenip yüklenmediğini UIApplication - (BOOL) canOpenURL kullanarak kontrol edebilirsiniz: (NSURL *) url
Willster

1
2 uygulama aynı url işleyicisini kaydeder ve sonra url çağrılırsa ne olur? Android'de bir liste ile sunulacağını biliyorum, böylece hangisini çalıştırmak istediğinizi seçebilirsiniz. İos bunu nasıl ele alıyor?
eggie5

3
Not: Birden fazla üçüncü taraf uygulaması aynı URL şemasını işlemek için kaydolursa, şu anda hangi şemaya hangi uygulamanın verileceğini belirlemeye yönelik bir işlem yoktur. Ref: developer.apple.com/library/ios/#documentation/iPhone/…
Futur

2
Bu, aynı URL şemasını işlemek için birden fazla üçüncü taraf uygulaması kaydettirmeyle ilgili nottan bahseden güncellenmiş bağlantıdır: Apple Docs
Sindri Jóelsson 6:18


78

Başka bir uygulama açabilecek bir uygulama yazmanın kolay olduğunu gördüm.

Diyelim ki FirstAppve adında iki uygulamamız var SecondApp. FirstApp'ı açtığımızda, bir düğmeye tıklayarak SecondApp'ı açabilmek istiyoruz. Bunu yapmanın çözümü:

  1. SecondApp'ta

    SecondApp plist dosyasına gidin ve bir iOSDevTips dizesiyle bir URL Şemaları eklemeniz gerekir (elbette başka bir string.it size kalmış) yazabilirsiniz.

resim açıklamasını buraya girin

2. İlk Uygulamada

Aşağıdaki işlemle bir düğme oluşturun:

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

}

Bu kadar. Şimdi FirstApp'daki düğmeyi tıklayabildiğinizde SecondApp'ı açmalıdır.


2
Tam açıklamayı burada görebilirsiniz iosdevelopertips.com/cocoa/…
youssman

1
@ Mesajınızı takip ediyorum, safari uygulamayı açabilir, ancak başka bir uygulama açık değil (düğmeye basıldığında yöntem) başka blok yürütülür, sorun nedir lütfen bana yardımcı olabilirsiniz
srinivas n

Lütfen bana problemin biraz daha detayını ver
lee

1
İşe bu alamayan insanlar, içinde 'LSApplicationQueriesSchemes' adlı dizeleri bir dizi eklemek Info.plistait FirstApp. Sonra bu durumda, açık olması için uygulama istediğiniz düzenleri eklemek Item 0olacaktıriOSDevTips

1
Ayrıca aşağıdaki KIO'nun cevabına da bakınız ( stackoverflow.com/a/33763449/394969 ). SecondApp'ın açılabilmesi için FirstApp'ın LSApplicationQueriesSchemesInfo.plist'e eklenmesi gerekir.
John Erck

28

Lee yanıtı 8'den önce iOS için kesinlikle doğru.

İOS 9 ve sonraki sürümlerinde, Uygulamanızın LSApplicationQueriesSchemes anahtarı (dizeler dizisi) altındaki Info.plist'te sorgulamak istediği URL şemalarını beyaz listeye eklemelisiniz:

resim açıklamasını buraya girin


2
En iyi cevap, @KIO ve villy393 arasındaki birleşme olmalıdır
Gustavo Barbosa

19

Swift'te

Birisinin hızlı bir Swift kopyalayıp yapıştırması istemesi durumunda.

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

Uygulamanızı başka bir uygulamadan açabilmeniz için her iki uygulamada da değişiklik yapmanız gerekir. Swift 10 ile iOS 10 güncellemesini kullanma adımları :

1. Açmak istediğiniz başvurunuzu kaydedin

Info.plistUygulamanızın özel ve benzersiz URL Şemasını tanımlayarak güncelleyin .

resim açıklamasını buraya girin

Şema adınızın benzersiz olması gerektiğini unutmayın; aksi takdirde, cihazınızda aynı URL şeması adına sahip başka bir uygulamanız varsa, bu işlemin hangisinin açıldığı belirlenir.

2. Önceki URL şemasını ana uygulamanıza ekleyin

Uygulamanın sınıf canOpenURL:yöntemiyle kullanabilmesini istediğiniz URL şemasını belirtmeniz gerekir UIApplication. Bu yüzden ana uygulamayı açın ve Info.plistdiğer uygulamanın URL şemasını ekleyin LSApplicationQueriesSchemes. (İOS 9.0'da tanıtıldı)

resim açıklamasını buraya girin

3. Başvurunuzu açan işlemi uygulayın

Şimdi her şey hazır, bu nedenle kodunuzu diğer uygulamanızı açan ana uygulamanıza yazmakta fayda var. Bu şöyle görünmelidir:

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

Mevcut uygulamanızın (AppStore'dan yüklenmiş) açılmasını istiyorsanız bu değişikliklerin yeni bir sürüm gerektirdiğini unutmayın. Apple AppStore'a daha önce yayınlamış olduğunuz bir uygulamayı açmak istiyorsanız, önce URL şeması kaydınızı içeren yeni bir sürüm yüklemeniz gerekir.


1
Bu doğru cevap. Sadece "LSApplicationQueriesSchemes" eklemenin işe yaramadığını fark ettim, "URL Şeması" nın da info.plist'e eklenmesi gerekiyor.
Shailesh


9

Bunu başarmak için her iki uygulamada da birkaç satır kod eklememiz gerekiyor

Uygulama A: Başka bir Uygulamadan açmak istediğiniz. (Kaynak)

Uygulama B : Uygulama B'den Uygulama A'yı (Hedef) açmak istiyorsunuz

Uygulama A Kodu

XML A'nın altındaki Uygulama A ve Geçmiş A'nın Açık bir Liste Kaynağı'na birkaç etiket ekleyin

<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 Uygulama delegesi - Buradan geri arama alın

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

Şimdi Uygulama B koduna geliyor -

App A'yı herhangi bir giriş parametresi olmadan açmak istiyorsanız

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

        }
}

Eğer gelen parametre geçirmek istiyorsanız App B için App A daha sonra Kod aşağıda kullanmak

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

        }
}

Not: Uygulamayı yalnızca testApp.linking: //? safari tarayıcısında


7

Uygulamanızdan bir uygulama başlatmanıza yardımcı olacak aşağıdaki kodu deneyin

Not: Fanteziyi gerçek uygulama adıyla değiştirin

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

7

Yalnızca bir URL şeması kaydetmiş uygulamaları başlatabilirsiniz. Sonra sms: kullanarak SMS uygulamasını açtığınız gibi, URL şemalarını kullanarak uygulamayı açabilirsiniz.

Bunu gösteren LaunchMe adlı dokümanlarda çok iyi bir örnek var.

6 Kasım 2017 itibariyle LaunchMe örnek kodu .


Cevap güncellendi. Umut bu yardımcı olur
lostInTransit

Teşekkürler; şans eseri, iOS Geliştirici Ailesi sohbet odalarına üye misiniz?
Eenvincible

4

Hayır değil. Belgelenen URL işleyicilerinin yanı sıra başka bir uygulama ile iletişim kurmanın / başlatmanın bir yolu yoktur.



3

Swift 4.1 ve Xcode 9.4.1'de

İki uygulama var 1) PageViewControllerExample ve 2) DelegateExample. Şimdi PageViewControllerExample uygulaması ile DelegateExample uygulamasını açmak istiyorum. PageViewControllerExample içinde aç düğmesine tıkladığımda, DelegateExample uygulaması açılacak.

Bunun için her iki uygulama için de .plist dosyalarında bazı değişiklikler yapmamız gerekiyor.

Aşama 1

DelegateExample uygulamasında .plist dosyasını açın ve URL Türlerini ve URL Şemalarını ekleyin. Burada "myapp" gibi gerekli ismimizi eklememiz gerekiyor.

resim açıklamasını buraya girin

Adım 2

PageViewControllerExample uygulamasında .plist dosyasını açın ve bu kodu ekleyin

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

Artık PageViewControllerExample öğesindeki düğmesini tıklattığımızda DelegateExample uygulamasını açabiliyoruz.

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

Harika, yardımcı olur. Şimdi argümanı kaynak uygulamadan hedef uygulamaya nasıl geçirebilirim?
Vigneswaran A

2

Bu konuyla ilgili bir yan not ...

Kayıtlı olmayan protokoller için 50 istek sınırı vardır.

Bu tartışmada , bir uygulamanın belirli bir sürümü için yalnızca canOpenUrlsınırlı sayıda sorgulayabileceğinizi ve bildirilmemiş şemalar için 50 çağrıdan sonra başarısız olacağını belirtin . Ayrıca bu başarısız duruma girdikten sonra protokol eklenirse hala başarısız olacağını gördüm.

Bunun farkında olun, birisi için yararlı olabilir.


0

@ Villy393 cevabının Swift 3 hızlı ve yapıştır versiyonu:

if UIApplication.shared.canOpenURL(openURL) {
    UIApplication.shared.openURL(openURL)
} else if UIApplication.shared.canOpenURL(installUrl) 
    UIApplication.shared.openURL(installUrl)
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.