Uruchom aplikację z innego (iPhone)

170

Czy można uruchomić dowolną aplikację na iPhone'a z poziomu innej aplikacji ?, Na przykład w mojej aplikacji, jeśli chcę, aby użytkownik nacisnął przycisk i uruchomił się bezpośrednio w aplikacji Telefon (zamknij bieżącą aplikację, otwórz aplikację Telefon) .

czy to byłoby możliwe? Wiem, że można to zrobić, aby wykonywać połączenia telefoniczne za pomocą linku tel URL, ale zamiast tego chcę po prostu uruchomić aplikację Telefon bez wybierania określonego numeru.

Alok
źródło

Odpowiedzi:

80

Jak wskazuje Kevin, schematy adresów URL to jedyny sposób komunikacji między aplikacjami. Więc nie, nie można uruchamiać dowolnych aplikacji.

Możliwe jest jednak uruchomienie dowolnej aplikacji, która rejestruje schemat adresu URL, niezależnie od tego, czy jest to Apple, Twój czy inny programista. Dokumenty są tutaj:

Komunikacja z innymi aplikacjami

Jeśli chodzi o uruchamianie telefonu, wygląda na to, że tel:łącze musi mieć co najmniej trzy cyfry, zanim telefon zostanie uruchomiony. Nie możesz więc po prostu wejść do aplikacji bez wybierania numeru.

Gordon Wilson
źródło
8
Możesz sprawdzić, czy dana aplikacja jest zainstalowana, używając narzędzia UIApplication - (BOOL) canOpenURL: (NSURL *) url
Willster
1
co się stanie, jeśli 2 aplikacje zarejestrują ten sam program obsługi adresu URL, a następnie zostanie wywołany adres URL? Wiem, że w systemie Android zostanie wyświetlona lista, dzięki czemu możesz wybrać, który z dwóch chcesz uruchomić. Jak radzi sobie z tym iOS?
eggie5
3
Uwaga: jeśli więcej niż jedna aplikacja innej firmy zarejestruje się w celu obsługi tego samego schematu adresu URL, obecnie nie ma procesu określania, która aplikacja otrzyma ten schemat. Ref: developer.apple.com/library/ios/#documentation/iPhone/…
Futur
2
To jest zaktualizowany link, który wspomina o notatce o więcej niż jednej aplikacji innej firmy rejestrującej się w celu obsługi tego samego schematu adresu URL: Apple Docs
Sindri Jóelsson
Znowu nieaktualne. Zaktualizowany link: developer.apple.com/documentation/uikit/ ...
Dave Nottage
78

Zauważyłem, że łatwo jest napisać aplikację, która może otwierać inną aplikację.

Załóżmy, że mamy dwie aplikacje o nazwie FirstAppi SecondApp. Kiedy otwieramy FirstApp, chcemy mieć możliwość otwarcia SecondApp poprzez kliknięcie przycisku. Aby to zrobić, możesz:

  1. W SecondApp

    Przejdź do pliku plist SecondApp i musisz dodać schematy adresów URL za pomocą ciągu iOSDevTips (oczywiście możesz napisać inny ciąg. To zależy od Ciebie).

wprowadź opis obrazu tutaj

2. W FirstApp

Utwórz przycisk z poniższą akcją:

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

}

Otóż ​​to. Teraz, kiedy możesz kliknąć przycisk w FirstApp, powinno to otworzyć SecondApp.

zawietrzny
źródło
2
Możesz zobaczyć pełne wyjaśnienie tutaj iosdevelopertips.com/cocoa/ ...
youssman
1
@Lee, śledzę twój post, safari może otworzyć aplikację, ale inna aplikacja nie otwiera się (metoda naciśnięcia przycisku), w przeciwnym razie blok jest wykonywany, w czym problem, czy możesz mi pomóc
srinivas n
Proszę o więcej szczegółów na temat twojego problemu
lee
1
Ludzie, którzy nie mogą uzyskać to do pracy, dodać tablicę ciągów o nazwie „” w LSApplicationQueriesSchemes Info.plistz FirstApp. Następnie dodaj schematy, które Twoja aplikacja chce otworzyć, w tym przypadku Item 0będzie toiOSDevTips
1
Zobacz także odpowiedź KIO poniżej ( stackoverflow.com/a/33763449/394969 ). FirstApp musi dodać LSApplicationQueriesSchemesdo swojej Info.plist, aby móc otworzyć SecondApp.
John Erck,
28

Odpowiedź lee jest absolutnie poprawna dla iOS przed 8.

W iOS 9+ musisz dodać do białej listy wszelkie schematy adresów URL, które Twoja aplikacja chce przesyłać w Info.plist pod kluczem LSApplicationQueriesSchemes (tablica ciągów):

wprowadź opis obrazu tutaj

KIO
źródło
2
Najlepszą odpowiedzią powinno być połączenie @KIO i villy393
Gustavo Barbosa
19

W Swift

Na wypadek, gdyby ktoś szukał szybkiej funkcji szybkiego kopiowania i wklejania.

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
źródło
13

Aby umożliwić otwieranie aplikacji z innej aplikacji, musisz wprowadzić zmiany w obu aplikacjach. Oto kroki przy użyciu Swift 3 z aktualizacją iOS 10 :

1. Zarejestruj aplikację, którą chcesz otworzyć

Zaktualizuj Info.plist, definiując niestandardowy i niepowtarzalny schemat adresu URL aplikacji.

wprowadź opis obrazu tutaj

Zauważ, że nazwa twojego schematu powinna być unikalna, w przeciwnym razie, jeśli masz inną aplikację z tą samą nazwą schematu URL zainstalowaną na twoim urządzeniu, zostanie to określone w czasie wykonywania, który zostanie otwarty.

2. Uwzględnij poprzedni schemat adresów URL w głównej aplikacji

Musisz określić schemat adresu URL, którego aplikacja ma używać z canOpenURL:metodą UIApplicationklasy. Otwórz więc główną aplikację Info.plisti dodaj schemat adresu URL drugiej aplikacji do LSApplicationQueriesSchemes. (Wprowadzone w iOS 9.0)

wprowadź opis obrazu tutaj

3. Zaimplementuj akcję, która otwiera Twoją aplikację

Teraz wszystko jest skonfigurowane, więc dobrze jest napisać kod w głównej aplikacji, która otwiera drugą aplikację. Powinno to wyglądać mniej więcej tak:

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

Pamiętaj, że te zmiany wymagają nowej wersji, jeśli chcesz, aby Twoja istniejąca aplikacja (zainstalowana z AppStore) została otwarta. Jeśli chcesz otworzyć aplikację, którą już opublikowałeś w Apple AppStore, musisz najpierw przesłać nową wersję, która zawiera rejestrację schematu adresu URL.

choofie
źródło
1
To jest właściwa odpowiedź. Zauważyłem, że nie działało samo dodanie „LSApplicationQueriesSchemes”, w info.plist trzeba też dodać „Schemat URL”.
Shailesh
9

Aby to osiągnąć, musimy dodać kilka linii kodu w obu App

Aplikacja A: którą chcesz otworzyć z innej aplikacji. (Źródło)

Aplikacja B : Z aplikacji B chcesz otworzyć aplikację A (miejsce docelowe)

Kod aplikacji A

Dodaj kilka tagów do Plist of App A Open Plist Source of App A and Past poniżej XML

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

W aplikacji delegata aplikacji A - tutaj uzyskaj połączenie zwrotne

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

Teraz przechodzę do kodu aplikacji B -

Jeśli chcesz tylko otworzyć aplikację A bez żadnego parametru wejściowego

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

        }
}

Jeśli chcesz przekazać parametr z aplikacji B do aplikacji A, użyj poniższego kodu

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

        }
}

Uwaga: Aplikację można również otworzyć, wpisując po prostu testApp.linking: //? w przeglądarce safari

Alok
źródło
7

Wypróbuj poniższy kod, który pomoże Ci uruchomić aplikację z Twojej aplikacji

Uwaga: Zastąp nazwę fantazji rzeczywistą nazwą aplikacji

NSString *mystr=[[NSString alloc] initWithFormat:@"fantacy://location?id=1"];
NSURL *myurl=[[NSURL alloc] initWithString:mystr];
[[UIApplication sharedApplication] openURL:myurl];
btmanikandan
źródło
7

Możesz uruchamiać tylko aplikacje, które zarejestrowały schemat adresu URL. Następnie, tak jak otwierasz aplikację SMS za pomocą sms:, będziesz mógł otworzyć aplikację za pomocą ich schematu adresu URL.

W dokumentach o nazwie LaunchMe dostępny jest bardzo dobry przykład, który to demonstruje.

Przykładowy kod LaunchMe na dzień 6 listopada 2017 r.

lostInTransit
źródło
Zaktualizowana odpowiedź. Mam nadzieję, że to pomoże
lostInTransit
Dzięki; Czy przypadkiem należysz do czatów rodziny programistów iOS?
Eenvincible
4

Nie, nie jest. Oprócz udokumentowanych programów obsługi adresów URL nie ma możliwości komunikacji z inną aplikacją / uruchomienia innej aplikacji.

Lily Ballard
źródło
3

W Swift 4.1 i Xcode 9.4.1

Mam dwie aplikacje 1) PageViewControllerExample i 2) DelegateExample. Teraz chcę otworzyć aplikację DelegateExample z aplikacją PageViewControllerExample. Kiedy kliknę przycisk Otwórz w PageViewControllerExample, zostanie otwarta aplikacja DelegateExample.

W tym celu musimy wprowadzić pewne zmiany w plikach .plist dla obu aplikacji.

Krok 1

W aplikacji DelegateExample otwórz plik .plist i dodaj typy adresów URL oraz schematy adresów URL. Tutaj musimy dodać naszą wymaganą nazwę, np. „Myapp”.

wprowadź opis obrazu tutaj

Krok 2

W aplikacji PageViewControllerExample otwórz plik .plist i dodaj ten kod

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

Teraz możemy otworzyć aplikację DelegateExample po kliknięciu przycisku w 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
źródło
Świetnie, to pomaga. Jak teraz przekazać argument z aplikacji źródłowej do aplikacji docelowej?
Vigneswaran A
2

Dodatkowa uwaga dotycząca tego tematu ...

Istnieje limit 50 żądań dla protokołów, które nie są zarejestrowane.

W tej dyskusji Apple wspomina, że ​​w przypadku określonej wersji aplikacji można wysłać zapytanie tylko do canOpenUrlograniczonej liczby razy i zakończy się niepowodzeniem po 50 wywołaniach niezadeklarowanych schematów . Widziałem również, że jeśli protokół zostanie dodany po wejściu w ten stan awarii, nadal zawiedzie.

Bądź tego świadomy, może być dla kogoś przydatny.

Duncan Hoggan
źródło
0

Szybka i wklej szybka 3 wersja odpowiedzi @ villy393 na:

if UIApplication.shared.canOpenURL(openURL) {
    UIApplication.shared.openURL(openURL)
} else if UIApplication.shared.canOpenURL(installUrl) 
    UIApplication.shared.openURL(installUrl)
}
cdescours
źródło