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

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

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

13 ответов

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

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

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

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

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

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

  1. Во втором приложении

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

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.

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

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

В Свифте

Просто если кто-то искал быстрое копирование и вставку 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)      
}

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

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

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

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

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

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

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.

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

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

Приложение 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>

В приложении делегат от приложения А - Обратный звонок здесь

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

Теперь переходим к коду App 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://? в браузере сафари

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

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

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

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

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

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

В Swift 4.1 и Xcode 9.4.1

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

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

Шаг 1

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

Шаг 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
    }
}

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

Я также попробовал это некоторое время назад ( Запустите приложение iPhone с Идентификатором), но определенно нет ДОКУМЕНТИРОВАННОГО способа сделать это.:)

Замечание по этой теме...

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

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

Помните об этом, может быть кому-то полезно.

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

if UIApplication.shared.canOpenURL(openURL) {
    UIApplication.shared.openURL(openURL)
} else if UIApplication.shared.canOpenURL(installUrl) 
    UIApplication.shared.openURL(installUrl)
}
Другие вопросы по тегам