Запустите приложение из другого (iPhone)
Можно ли запустить какое-либо произвольное приложение iPhone из другого приложения? Например, в моем приложении, если я хочу, чтобы пользователь нажал кнопку и запустился прямо в приложении "Телефон" (закройте текущее приложение, откройте приложение "Телефон").
это будет возможно? Я знаю, что это можно сделать для телефонных звонков по телефонной ссылке, но я хочу вместо этого просто запустить приложение Телефон без набора какого-либо определенного номера.
13 ответов
Как указывает Кевин, схемы URL-адресов являются единственным способом связи между приложениями. Нет, запускать произвольные приложения невозможно.
Но можно запустить любое приложение, которое регистрирует схему URL, будь то Apple, ваше или другого разработчика. Документы здесь:
Общение с другими приложениями
Что касается запуска телефона, выглядит как ваш tel:
ссылка должна иметь не менее трех цифр, прежде чем телефон будет запущен. Таким образом, вы не можете просто зайти в приложение без набора номера.
Я обнаружил, что легко написать приложение, которое может открыть другое приложение.
Давайте предположим, что у нас есть два приложения под названием FirstApp
а также SecondApp
, Когда мы открываем FirstApp, мы хотим иметь возможность открыть SecondApp, нажав кнопку. Решение для этого:
Во втором приложении
Перейдите к 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®istered=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)
}