Как программно проверить, установлено ли приложение? - PullRequest
39 голосов
/ 18 августа 2010

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

Ответы [ 6 ]

62 голосов
/ 18 августа 2010

Я думаю, что это невозможно напрямую, но если приложения регистрируют схемы 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"]];
}
31 голосов
/ 13 июня 2011

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

if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"fb://"]]) {
    // Facebook app is installed
}
24 голосов
/ 08 августа 2015

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

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

<key>LSApplicationQueriesSchemes</key>
<array>
    <string>fb</string>
</array>

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

guard UIApplication.sharedApplication().canOpenURL(NSURL(string: "fb://")!) else {
    NSLog("No Facebook?  You're a better man than I am, Charlie Brown.")
    return
}
4 голосов
/ 23 сентября 2017

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:

<key>LSApplicationQueriesSchemes</key>
<array>
    <string>fb</string>
</array>
1 голос
/ 20 марта 2016

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

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 также должен содержать все необходимые схемы:

<key>LSApplicationQueriesSchemes</key>
<array>
    <string>fbapi</string>
    <string>fb-messenger-api</string>
    <string>fbauth2</string>
    <string>fbshareextension</string>
</array>
0 голосов
/ 18 мая 2018

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

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

info.plist LSApplicationQueriesSchemes array

Если вы хотите добавить Facebook, вы просто добавили бы другой элемент в массиве со строковым значением"FB".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...