Starten Sie eine App aus einem anderen (iPhone)

170

Ist es möglich, eine beliebige iPhone-Anwendung aus einer anderen App heraus zu starten? Zum Beispiel in meiner Anwendung, wenn der Benutzer eine Taste drücken und direkt in die Telefon-App starten soll (schließen Sie die aktuelle App, öffnen Sie die Telefon-App) .

wäre das möglich Ich weiß, dass dies zum Telefonieren mit dem Tel-URL-Link möglich ist, aber ich möchte stattdessen nur die Telefon-App starten lassen, ohne eine bestimmte Nummer zu wählen.

Alok
quelle

Antworten:

80

Wie Kevin betont, sind URL-Schemata die einzige Möglichkeit, zwischen Apps zu kommunizieren. Nein, es ist nicht möglich, beliebige Apps zu starten.

Es ist jedoch möglich, jede App zu starten, die ein URL-Schema registriert, unabhängig davon, ob es sich um das von Apple, Ihrem oder einem anderen Entwickler handelt. Die Dokumente sind hier:

Kommunikation mit anderen Anwendungen

Beim Starten des Telefons muss Ihr tel:Link mindestens dreistellig sein, bevor das Telefon gestartet wird. Sie können also nicht einfach in die App wechseln, ohne eine Nummer zu wählen.

Gordon Wilson
quelle
8
Sie können überprüfen, ob die betreffende Anwendung installiert ist, indem Sie die URL von UIApplication - (BOOL) canOpenURL: (NSURL *)
Willster vom
1
Was passiert, wenn 2 Apps denselben URL-Handler registrieren und dann die URL aufgerufen wird? Ich weiß, dass Ihnen in Android eine Liste angezeigt wird, damit Sie auswählen können, welche der beiden ausgeführt werden soll. Wie geht ios damit um?
Eggie5
3
Hinweis: Wenn sich mehr als eine Drittanbieter-App registriert, um dasselbe URL-Schema zu verarbeiten, gibt es derzeit kein Verfahren zum Bestimmen, welcher App dieses Schema zugewiesen wird. Ref: developer.apple.com/library/ios/#documentation/iPhone/…
Futur
2
Dies ist der aktualisierte Link, der den Hinweis erwähnt, dass sich mehr als eine Drittanbieter-App registriert, um dasselbe URL-Schema zu verarbeiten: Apple Docs
Sindri Jóelsson
Wieder veraltet. Aktualisierter Link: developer.apple.com/documentation/uikit/…
Dave Nottage
78

Ich fand, dass es einfach ist, eine App zu schreiben, die eine andere App öffnen kann.

Nehmen wir an, wir haben zwei Apps namens FirstAppund SecondApp. Wenn wir die FirstApp öffnen, möchten wir die SecondApp durch Klicken auf eine Schaltfläche öffnen können. Die Lösung hierfür ist:

  1. In SecondApp

    Gehen Sie zur plist-Datei von SecondApp und Sie müssen ein URL- Schema mit einer Zeichenfolge iOSDevTips hinzufügen (natürlich können Sie eine weitere Zeichenfolge schreiben. Es liegt an Ihnen).

Geben Sie hier die Bildbeschreibung ein

2. In FirstApp

Erstellen Sie eine Schaltfläche mit der folgenden Aktion:

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

}

Das ist es. Wenn Sie nun in der FirstApp auf die Schaltfläche klicken können, sollte die SecondApp geöffnet werden.

Lee
quelle
2
Sie können die vollständige Erklärung hier sehen iosdevelopertips.com/cocoa/…
youssman
1
@Lee Ich verfolge Ihren Beitrag, Safari kann die Anwendung öffnen, aber eine andere App nicht geöffnet (Knopfdruckmethode) sonst Block wird ausgeführt, was ist das Problem können Sie mir bitte helfen
srinivas n
Bitte geben Sie mir einige Details Ihres Problems
Lee
1
Personen, die dies nicht zum Laufen bringen können, fügen eine Reihe von Zeichenfolgen mit dem Namen 'LSApplicationQueriesSchemes' in Info.plistdie FirstApp. Item 0iOSDevTips
1
Siehe auch die Antwort von KIO unten ( stackoverflow.com/a/33763449/394969 ). FirstApp muss zu LSApplicationQueriesSchemesseiner Info.plist hinzugefügt werden, um SecondApp öffnen zu können.
John Erck
28

Die Lee-Antwort ist für iOS vor 8 absolut korrekt.

In iOS 9+ müssen Sie alle URL-Schemata, die Ihre App abfragen möchte, in Info.plist unter dem Schlüssel LSApplicationQueriesSchemes (ein Array von Zeichenfolgen) auf die Whitelist setzen:

Geben Sie hier die Bildbeschreibung ein

KIO
quelle
2
Die beste Antwort sollte eine Fusion zwischen @KIO und villy393 sein
Gustavo Barbosa
19

In Swift

Nur für den Fall, dass jemand nach einem schnellen Kopieren und Einfügen von Swift sucht.

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
quelle
13

Damit Sie Ihre Anwendung von einer anderen öffnen können, müssen Sie in beiden Anwendungen Änderungen vornehmen. Hier sind die Schritte zur Verwendung von Swift 3 mit iOS 10- Update:

1. Registrieren Sie Ihre Anwendung, die Sie öffnen möchten

Aktualisieren Sie das, Info.plistindem Sie das benutzerdefinierte und eindeutige URL-Schema Ihrer Anwendung definieren.

Geben Sie hier die Bildbeschreibung ein

Beachten Sie, dass Ihr Schemaname eindeutig sein sollte. Wenn auf Ihrem Gerät eine andere Anwendung mit demselben URL-Schemanamen installiert ist, wird zur Laufzeit festgelegt, welche Anwendung geöffnet wird.

2. Fügen Sie das vorherige URL-Schema in Ihre Hauptanwendung ein

Sie müssen das URL-Schema angeben, das die App mit der canOpenURL:Methode der UIApplicationKlasse verwenden soll. Öffnen Sie also die Hauptanwendung Info.plistund fügen Sie das URL-Schema der anderen Anwendung hinzu LSApplicationQueriesSchemes. (Eingeführt in iOS 9.0)

Geben Sie hier die Bildbeschreibung ein

3. Implementieren Sie die Aktion, mit der Ihre Anwendung geöffnet wird

Jetzt ist alles eingerichtet, sodass Sie Ihren Code gut in Ihre Hauptanwendung schreiben können, die Ihre andere App öffnet. Das sollte ungefähr so ​​aussehen:

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

Beachten Sie, dass für diese Änderungen eine neue Version erforderlich ist, wenn Ihre vorhandene App (im AppStore installiert) geöffnet werden soll. Wenn Sie eine Anwendung öffnen möchten, die Sie bereits für Apple AppStore freigegeben haben, müssen Sie zuerst eine neue Version hochladen, die Ihre URL-Schema-Registrierung enthält.

Choofie
quelle
1
Das ist die richtige Antwort. Ich habe festgestellt, dass nur das Hinzufügen von "LSApplicationQueriesSchemes" nicht funktioniert hat. Das "URL-Schema" muss auch in info.plist hinzugefügt werden.
Shailesh
11

Hier ist ein gutes Tutorial zum Starten einer Anwendung aus einer anderen App heraus:
iOS SDK: Arbeiten mit URL-Schemata
Es ist nicht möglich, eine beliebige Anwendung zu starten, sondern die nativen Anwendungen, die die URL-Schemata registriert haben .

Nickolas
quelle
9

Um dies zu erreichen, müssen wir in beiden Apps einige Codezeilen hinzufügen

App A: Welche Sie von einer anderen App aus öffnen möchten. (Quelle)

App B : In App B möchten Sie App A (Ziel) öffnen.

Code für App A.

Fügen Sie der Plist of App A einige Tags hinzu. Öffnen Sie die Plist-Quelle von App A und Past unter XML

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

Im App-Delegaten von App A - Hier einen Rückruf erhalten

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

Kommen wir nun zu App B Code -

Wenn Sie nur App A ohne Eingabeparameter öffnen möchten

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

        }
}

Wenn Sie Parameter von App B an App A übergeben möchten, verwenden Sie den folgenden Code

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

        }
}

Hinweis: Sie können die App auch öffnen, indem Sie einfach testApp.linking: //? im Safari-Browser

Alok
quelle
7

Versuchen Sie den folgenden Code, um eine Anwendung über Ihre Anwendung zu starten

Hinweis: Ersetzen Sie den Namen Fantacy durch den tatsächlichen Anwendungsnamen

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

Sie können nur Apps starten, die ein URL-Schema registriert haben. Genau wie Sie die SMS-App mithilfe von SMS: öffnen, können Sie die App auch anhand ihres URL-Schemas öffnen.

In den Dokumenten mit dem Namen LaunchMe ist ein sehr gutes Beispiel verfügbar, das dies demonstriert.

LaunchMe-Beispielcode ab 6. November 2017.

lostInTransit
quelle
Antwort aktualisiert. Hoffe das hilft
lostInTransit
Vielen Dank; Gehören Sie zufällig zu den Chatrooms der iOS Developer Family?
Unbesiegbar
4

Nein, ist es nicht. Abgesehen von den dokumentierten URL-Handlern gibt es keine Möglichkeit, mit einer anderen App zu kommunizieren oder diese zu starten.

Lily Ballard
quelle
3

In Swift 4.1 und Xcode 9.4.1

Ich habe zwei Apps: 1) PageViewControllerExample und 2) DelegateExample. Jetzt möchte ich die DelegateExample App mit der PageViewControllerExample App öffnen. Wenn ich in PageViewControllerExample auf die Schaltfläche Öffnen klicke, wird die DelegateExample-App geöffnet.

Dazu müssen wir für beide Apps einige Änderungen an den .plist-Dateien vornehmen.

Schritt 1

Öffnen Sie in der DelegateExample-App die .plist-Datei und fügen Sie URL-Typen und URL-Schemata hinzu. Hier müssen wir unseren gewünschten Namen wie "myapp" hinzufügen.

Geben Sie hier die Bildbeschreibung ein

Schritt 2

Öffnen Sie in der PageViewControllerExample-App die .plist-Datei und fügen Sie diesen Code hinzu

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

Jetzt können wir die DelegateExample-App öffnen, wenn wir in PageViewControllerExample auf die Schaltfläche klicken.

//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
quelle
Großartig, es hilft. Wie kann man nun das Argument von der Quell-App an die Ziel-App übergeben?
Vigneswaran A
2

Eine Randnotiz zu diesem Thema ...

Für nicht registrierte Protokolle gibt es ein Anforderungslimit von 50.

In dieser Diskussion erwähnt Apple, dass Sie für eine bestimmte Version einer App nur canOpenUrleine begrenzte Anzahl von Malen abfragen können und nach 50 Aufrufen für nicht deklarierte Schemata fehlschlagen . Ich habe auch gesehen, dass wenn das Protokoll hinzugefügt wird, sobald Sie in diesen fehlerhaften Zustand eingetreten sind, es immer noch fehlschlägt.

Seien Sie sich dessen bewusst, könnte für jemanden nützlich sein.

Duncan Hoggan
quelle
0

Swift 3 Quick & Paste-Version von @ villy393 Antwort für:

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