Запустите приложение из другого (iPhone)

Можно ли запустить любое приложение iPhone из другого приложения? Например в моем приложении, если я хочу, чтобы пользователь нажал кнопку и запустил ее прямо в приложение "Телефон" (закройте текущую приложение, откройте приложение "Телефон" ).

Это возможно? Я знаю, что это можно сделать для совершения телефонных звонков с помощью ссылки по URL-адресу tel, но вместо этого я хочу просто запустить приложение "Телефон" без набора номера.

Ответ 1

Как указывает Кевин, схемы URL-адресов являются единственным способом связи между приложениями. Так что нет, невозможно запускать произвольные приложения.

Но можно запустить любое приложение, которое регистрирует схему URL, будь то Apple, ваше или другого разработчика. Документы здесь:

Общение с другими приложениями

Что касается запуска телефона, похоже, что ваша ссылка tel: должна иметь не менее трех цифр, прежде чем телефон запустится. Таким образом, вы не можете просто зайти в приложение без набора номера.

Ответ 2

Я обнаружил, что легко написать приложение, которое может открыть другое приложение.

Предположим, что у нас есть два приложения с именем FirstApp и SecondApp. Когда мы открываем FirstApp, мы хотим открыть SecondApp, нажав кнопку. Решение для этого:

  • В SecondApp

    Перейдите в файл plist SecondApp, и вам нужно добавить Схемы URL с строкой iOSDevTips (конечно, вы можете написать еще одну строку.и до вас).

enter image description here

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.

Ответ 3

Ли ответ является абсолютно правильным для iOS до 8.

В iOS 9+ вы должны внести в белый список любые схемы URL, которые ваше приложение хочет запросить в Info.plist под ключом LSApplicationQueriesSchemes (массив строк):

enter image description here

Ответ 4

В 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)      
}

Ответ 5

Чтобы вы могли открыть свое приложение из другого приложения, вам нужно будет внести изменения в оба приложения. Вот шаги с использованием Swift 3 с обновлением iOS 10:

1. Зарегистрируйте ваше приложение, которое вы хотите открыть

Обновите Info.plist, определив для своего приложения индивидуальную и уникальную схему URL.

enter image description here

Обратите внимание, что имя вашей схемы должно быть уникальным, в противном случае, если на вашем устройстве установлено другое приложение с таким же именем схемы URL, тогда будет определено время выполнения, которое будет открыто.

2. Включите предыдущую схему URL в ваше основное приложение

Вам нужно указать схему URL вы хотите, чтобы приложение, чтобы иметь возможность использовать с canOpenURL: метод UIApplication класса. Итак, откройте основной Info.plist приложений Info.plist и добавьте схему URL другого приложения в LSApplicationQueriesSchemes. (Представлено в iOS 9.0)

enter image description here

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.

Ответ 6

Вот хороший учебник для запуска приложения из другого приложения:
iOS SDK: работа с схемами URL
И невозможно запустить произвольное приложение, но собственные приложения, которые зарегистрировали Схемы URL.

Ответ 7

Для достижения этого нам нужно добавить несколько строк кода в обоих приложениях

Приложение A: которое вы хотите открыть из другого приложения. (Источник)

Приложение B: из приложения B вы хотите открыть приложение A (пункт назначения)

Код для приложения А

Добавьте несколько тегов в Plist приложения A Open Plist Источник приложения A и Past ниже XML

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

В приложении делегат из приложения 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 
}

Теперь перейдем к приложению 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];

        }
}

Если вы хотите передать параметр из приложения B в приложение A, используйте код ниже

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

        }
}

Примечание. Вы также можете открыть приложение, просто набрав testApp.linking://? в браузере сафари

Ответ 8

Вы можете запускать только приложения, которые зарегистрировали схему URL. Затем, как и вы открываете приложение SMS с помощью sms:, вы сможете открыть приложение, используя свою схему URL.

В документах LaunchMe есть очень хороший пример, который демонстрирует это.

Пример кода LaunchMe от 6 ноября 2017 года.

Ответ 9

Попробуйте следующий код, который поможет вам запустить приложение из вашего приложения.

Примечание. Замените имя фэнтези фактическим именем приложения

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

Ответ 10

Нет, нет. Помимо документированных обработчиков URL-адресов, нет способа связываться с/запускать другое приложение.

Ответ 12

В Swift 4.1 и Xcode 9.4.1

У меня есть два приложения 1) PageViewControllerExample и 2) DelegateExample. Теперь я хочу открыть приложение DelegateExample с приложением PageViewControllerExample. Когда я нажимаю кнопку Открыть в PageViewControllerExample, открывается приложение DelegateExample.

Для этого нам нужно внести некоторые изменения в файлы .plist для обоих приложений.

Шаг 1

В приложении DelegateExample откройте файл .plist и добавьте типы URL и схемы URL. Здесь нам нужно добавить наше обязательное имя, например, "myapp".

enter image description here

Шаг 2

В приложении PageViewControllerExample откройте файл .plist и добавьте этот код

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

Теперь мы можем открыть приложение DelegateExample, когда нажмем кнопку в 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
    }
}

Ответ 13

Swift 3 быстро и вставить версию @villy393 для:

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

Ответ 14

Дополнительное примечание по этой теме...

Существует ограничение в 50 запросов для протоколов, которые не зарегистрированы.

В этом обсуждении Apple упомянул, что для конкретной версии приложения вы можете запрашивать canOpenUrl только ограниченное количество раз, и произойдет сбой после 50 вызовов для необъявленных схем. Я также видел, что если протокол будет добавлен после того, как вы перейдете в это состояние сбоя, он все равно потерпит неудачу.

Знайте об этом, может быть кому-то полезно.