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

170

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

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

Alok
источник

Ответы:

80

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

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

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

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

Гордон Уилсон
источник
8
Вы можете проверить, установлено ли указанное приложение, используя UIApplication - (BOOL) canOpenURL: (NSURL *) url
Willster
1
что произойдет, если 2 приложения зарегистрируют один и тот же обработчик URL, а затем будет вызван URL? Я знаю, что в Android вы будете представлены со списком, чтобы вы могли выбрать, какой из двух вы хотите запустить. Как IOS справляется с этим?
eggie5
3
Примечание. Если для обработки одной и той же схемы URL-адресов зарегистрировано более одного стороннего приложения, в настоящее время отсутствует процесс определения того, какому приложению будет присвоена эта схема. Ссылка: developer.apple.com/library/ios/#documentation/iPhone/…
Futur
2
Это обновленная ссылка, в которой упоминается примечание о регистрации нескольких сторонних приложений для работы с одной и той же URL-схемой: Apple Docs
Синдри Йоелссон
Снова устарел. Обновленная ссылка: developer.apple.com/documentation/uikit/…
Дэйв Ноттаж
78

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

Давайте предположим, что у нас есть два приложения под названием 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.

подветренный
источник
2
Вы можете увидеть полное объяснение здесь iosdevelopertips.com/cocoa/...
youssman
1
@ См., Я следую за вашим постом, Safari может открыть приложение, но другое приложение не открывается (метод нажатием кнопки), иначе блок выполняется, в чем проблема, не могли бы вы мне помочь
srinivas n
Пожалуйста, расскажите подробнее о вашей проблеме
Ли
1
Люди , которые не могут получить эту работу, добавьте массив строк с именем «LSApplicationQueriesSchemes» в Info.plistиз FirstApp. Затем добавьте схемы, которые ваше приложение хочет открыть, в этом случае Item 0будетiOSDevTips
1
См. Также ответ KIO ниже ( stackoverflow.com/a/33763449/394969 ). FirstApp необходимо добавить LSApplicationQueriesSchemesв свой Info.plist, чтобы иметь возможность открыть SecondApp.
Джон Эрк
28

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

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

введите описание изображения здесь

КИО
источник
2
Лучшим ответом должно стать слияние между @KIO и villy393
Густаво Барбоса
19

В Свифте

На всякий случай, если кто-то ищет быстрое копирование и вставку 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)      
}
villy393
источник
13

Чтобы вы могли открыть свое приложение из другого, вам нужно будет внести изменения в оба приложения. Вот шаги с использованием 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.

choofie
источник
1
Это правильный ответ. Я заметил, что только добавление «LSApplicationQueriesSchemes» не работает, «Схема URL» также должна быть добавлена ​​в info.plist.
Шайлеш
11

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

Nickolas
источник
9

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

Приложение 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: //? в браузере сафари

Alok
источник
7

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

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

NSString *mystr=[[NSString alloc] initWithFormat:@"fantacy://location?id=1"];
NSURL *myurl=[[NSURL alloc] initWithString:mystr];
[[UIApplication sharedApplication] openURL:myurl];
btmanikandan
источник
7

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

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

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

lostInTransit
источник
Обновленный ответ. Надеюсь, это поможет
lostInTransit
Спасибо; случайно вы входите в чаты iOS Developer Family?
Eenvincible
4

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

Лили Баллард
источник
3

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

foebe
источник
2
Это задокументировано ... Проверьте документацию Apple. developer.apple.com/library/IOs/#documentation/iPhone/…
Мози
1
Я знаю, что схемы URL возможны, но я задал вопрос и спросил Джеффа, как открыть приложения, которые не поддерживают схемы URL ...
foebe
3

В 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
    }
}
IOS
источник
Отлично, это помогает. Теперь, как передать аргумент из исходного приложения в целевое приложение?
Vigneswaran A
2

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

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

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

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

Дункан Хогган
источник
0

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

if UIApplication.shared.canOpenURL(openURL) {
    UIApplication.shared.openURL(openURL)
} else if UIApplication.shared.canOpenURL(installUrl) 
    UIApplication.shared.openURL(installUrl)
}
cdescours
источник