Как проверить программно, если приложение установлено?

Я разрабатываю приложение для iPhone, которое будет устанавливать несколько сторонних приложений на предприятии. У меня есть информация о идентификаторах пакета. Есть ли способ проверить, установлено ли приложение, используя некоторые системные API? В настоящее время приложение снова устанавливается, перезаписывая текущую установку. Мне нужно как-то предотвратить это. (Приложение Apple AppStore отключает параметр установки, если приложение уже установлено.)

Я думаю, что это невозможно напрямую, но если приложения регистрируют схемы uri, вы можете проверить это.

Схема URI, например, fb:// для приложения facebook. Вы можете зарегистрировать это в info.plist вашего приложения. [UIApplication canOpenURL:url] сообщит вам, будет или не будет открыт какой-либо URL-адрес. Таким образом, если будет открыто fb:// , будет указано, что установлено приложение, которое зарегистрировало fb:// – это хороший совет для приложения facebook.

 // check whether facebook is (likely to be) installed or not if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"fb://"]]) { // Safe to launch the facebook app [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"fb://profile/200538917420"]]; } 

Вот пример, чтобы проверить, установлено ли приложение facebook

 if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"fb://"]]) { // Facebook app is installed } 

Для тех, кто пытается это сделать с помощью iOS 9 / Swift 2:

Во-первых, вам нужно «переименовать белый список», добавив следующее в ваш файл Info.plist (функция безопасности – см . Ответ Льва Натана ):

 LSApplicationQueriesSchemes  fb  

После этого вы можете узнать, доступно ли приложение и имеет ли зарегистрированная схема:

 guard UIApplication.sharedApplication().canOpenURL(NSURL(string: "fb://")!) else { NSLog("No Facebook? You're a better man than I am, Charlie Brown.") return } 

Swift 3.1, Swift 3.2, Swift 4

 if let urlFromStr = URL(string: "fb://") { if UIApplication.shared.canOpenURL(urlFromStr) { if #available(iOS 10.0, *) { UIApplication.shared.open(urlFromStr, options: [:], completionHandler: nil) } else { UIApplication.shared.openURL(urlFromStr) } } } 

Добавьте их в Info.plist:

 LSApplicationQueriesSchemes  fb  

Когда дело доходит до социальных сетей, лучше всего проверить несколько схем. (Поскольку схема «fb» устарела для SDK IOS9, например.):

 NSArray* fbSchemes = @[ @"fbapi://", @"fb-messenger-api://", @"fbauth2://", @"fbshareextension://"]; BOOL isInstalled = false; for (NSString* fbScheme in fbSchemes) { isInstalled = [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:fbScheme]]; if(isInstalled) break; } if (!isInstalled) { // code return; } 

Конечно, Info.plist также должен содержать все необходимые схемы:

 LSApplicationQueriesSchemes  fbapi fb-messenger-api fbauth2 fbshareextension  

iOS 9 и более новое обновление:

Из-за некоторых изменений безопасности, сделанных Apple в iOS 9, в дополнение к canOpenURL, упомянутому в других ответах, вам также необходимо добавить массив LSApplicationQueriesSchemes со строками в info.plist. Смотрите скриншот для примера с помощью Twitter.

info.plist Массив LSApplicationQueriesSchemes

Если вы хотите добавить Facebook, вы просто добавите еще один элемент в массив со строковым значением «fb».

  • NSDictionary с упорядоченными ключами
  • Выбрать программную строку таблицы таблиц
  • Проверить версию iOS во время выполнения?
  • используя objc_msgSend для вызова функции Objective C с именованными аргументами
  • Как я могу изменить NSArray в Objective-C?
  • viewDidLoad в NSViewController?
  • Как установить приложение Cocoa в качестве браузера по умолчанию?
  • Как анализировать длительность ISO-8601 в Objective C?
  • Отправить почту без MFMailComposeViewController
  • захват себя в этом блоке, вероятно, приведет к циклу сохранения
  • Управление несколькими асинхронными соединениями NSURLConnection
  • Interesting Posts

    Изменение привязок emacs в Mac OS X для команды meta

    Переключение fragmentов внутри вкладки

    Как создать вертикальное меню прокрутки в spritekit?

    Зимует-Викисклад annotations-4.0.1.Final.jar; недопустимый заголовок LOC (плохая подпись)?

    Регулярное выражение для исключения слова / строки

    Создайте перечисление со строковыми значениями в TypeScript

    Jqgrid – группировка данных уровня строки

    Что заставляет javac выдавать предупреждение «использует непроверенные или небезопасные операции»

    Тип аксессуара UITableViewCell, проверенный на доступ и установка других непроверенных

    Благотворительное использование пропускной способности для загрузки?

    Есть ли метод, который вычисляет факториал в Java?

    Когда вызов функции-члена в экземпляре null приводит к неопределенному поведению?

    Совместить целую строку

    Копирование данных в структуру данных «cufftComplex»?

    Как заставить ELMAH работать с атрибутом ASP.NET MVC ?

    Давайте будем гением компьютера.