Запуск програми з іншого (iPhone)


170

Чи можливо запустити будь-яку довільну програму iPhone з іншого додатка? Наприклад, у моїй програмі, якщо я хочу, щоб користувач натискав кнопку та запускався прямо в додаток Phone (закрийте поточний додаток, відкрийте додаток Phone) .

це було б можливо? Я знаю, що це можна зробити для здійснення телефонних дзвінків за посиланням тел-URL, але я хочу просто запустити додаток Phone без набору конкретного номера.

Відповіді:


80

Як зазначає Кевін, URL-схеми - це єдиний спосіб спілкування між додатками. Отже, ні, запустити довільні програми неможливо.

Але можна запустити будь-який додаток, який реєструє схему URL-адрес, будь то Apple, ваш або інший розробник. Документи тут:

Спілкування з іншими програмами

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


8
Ви можете перевірити, чи встановлено відповідну програму, скориставшись UIApplication's - (BOOL) canOpenURL: (NSURL *) URL
Willster

1
що станеться, якщо 2 програми зареєструють один і той же обробник URL-адреси, а потім викликається URL-адреса? Я знаю, що в Android вам буде представлений список зі списком, щоб ви могли вибрати, який з двох потрібно запустити. Як ios справляється з цим?
eggie5

3
Примітка. Якщо більше однієї сторонньої програми зареєстровано для обробки однієї і тієї ж схеми URL-адрес, наразі не існує процесу визначення того, якому додатку буде надано цю схему. Ref: developer.apple.com/library/ios/#documentation/iPhone/…
Futur

2
Це оновлене посилання, в якому згадується примітка про реєстрацію більше ніж однієї сторонньої програми для обробки однієї і тієї ж URL-схеми: Apple Docs
Sindri Jóelsson

Знову застаріло. Оновлено посилання: developer.apple.com/documentation/uikit/…
Дейв

78

Я виявив, що легко написати додаток, який може відкрити інший додаток.

Припустимо, що у нас є дві програми під назвою FirstAppта SecondApp. Коли ми відкриваємо FirstApp, ми хочемо мати можливість відкрити SecondApp, натиснувши кнопку. Рішення для цього:

  1. У SecondApp

    Перейдіть до файлу плістів SecondApp і вам потрібно додати схеми URL-адреси за допомогою рядка iOSDevTips (звичайно, ви можете написати ще один рядок.it залежить від вас).

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

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
@Lee Я стежу за вашим дописом, safari може відкрити програму, але інша програма не відкриється (метод натиснутою кнопкою) інший блок виконується, у чому проблема, чи можете ви мені допомогти
srinivas n

Будь ласка , дайте мені ще деякі деталі вашої проблеми
підвітряного

1
Люди , які не можуть отримати цю роботу, додайте масив рядків з ім'ям «LSApplicationQueriesSchemes» в Info.plistз FirstApp. Потім додайте схеми, які хочете відкрити ваш додаток, у цьому випадку це Item 0будеiOSDevTips

1
Дивіться також відповідь KIO нижче ( stackoverflow.com/a/33763449/394969 ). FirstApp потрібно додати LSApplicationQueriesSchemesдо свого Info.plist, щоб мати можливість відкрити SecondApp.
Джон Ерк

28

Відповідь lee абсолютно правильна для 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)      
}

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-адрес.


1
Це правильна відповідь. Я помітив, що лише додавання "LSApplicationQueriesSchemes" не спрацювало, "URL-схему" також потрібно додати в info.plist.
Шайлеш


9

Для цього нам потрібно додати кілька рядків коду в обох додатках

Додаток A: який потрібно відкрити з іншого додатка. (Джерело)

Додаток B : з App B ви хочете відкрити додаток A (призначення)

Код для програми A

Додайте кілька тегів у Plist App A Відкрите джерело списку додатків A та минулого нижче 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: //? у веб-переглядачі сафарі


7

Спробуйте, наступний код допоможе вам запустити програму зі своєї програми

Примітка. Замініть фантазію імені фактичною назвою програми

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

7

Ви можете запускати лише програми, які зареєстрували схему URL-адрес. Тоді так само, як ви відкриєте додаток SMS за допомогою sms:, ви зможете відкрити додаток за допомогою їх URL-схеми.

У документах під назвою LaunchMe є дуже хороший приклад, який демонструє це.

Зразок коду LaunchMe станом на 6 листопада 2017 року


Оновлена ​​відповідь. Сподіваюсь, що це допомагає
lostInTransit

Дякую; Ви випадково належите до сімейних чатів для iOS Developer Family?
Eenvincible

4

Ні це не так. Окрім документально оброблених URL-адрес, немає можливості спілкуватися з / запускати інший додаток.


3

Я також спробував це деякий час тому ( запустити додаток iPhone з ідентифікатором ), але точно не існує ДОКУМЕНТОВАНОГО способу зробити це. :)


2
Це задокументовано ... Перевірте документацію Apple. developer.apple.com/library/IOs/#documentation/iPhone/…
Moszi

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

Чудово, це допомагає. Тепер як передати аргумент від вихідного додатка до додатка призначення?
Vigneswaran

2

Побічна примітка щодо цієї теми ...

Для протоколів, які не зареєстровані, існує обмеження на 50 запитів.

У цьому обговоренні яблуко згадує, що для конкретної версії програми ви можете запитувати canOpenUrlлише обмежену кількість разів і не вдасться після 50 дзвінків за незадекларованими схемами . Я також бачив, що якщо протокол буде додано, як тільки ви перейшли в цей невдалий стан, він все одно буде вийти з ладу.

Будьте в курсі цього, хтось може бути корисним.


0

Швидкий 3 швидкий і вставте версію @ villy393 відповіді за:

if UIApplication.shared.canOpenURL(openURL) {
    UIApplication.shared.openURL(openURL)
} else if UIApplication.shared.canOpenURL(installUrl) 
    UIApplication.shared.openURL(installUrl)
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.