Como verificar programaticamente se um aplicativo está instalado?

Estou desenvolvendo um aplicativo para iPhone que instalará poucos aplicativos de terceiros em uma empresa. Eu tenho as informações sobre os IDs do pacote. Existe uma maneira de verificar se o aplicativo já está instalado, usando algumas APIs do sistema? Atualmente, o aplicativo é instalado novamente, sobrescrevendo a instalação atual. Eu preciso evitar isso de alguma forma. (O aplicativo AppStore da Apple desativa a opção de instalação se o aplicativo já estiver instalado.)

Eu acho que isso não é possível diretamente, mas se os aplicativos registrarem os uri, você pode testar isso.

Um esquema de URI é, por exemplo, fb:// para o aplicativo do facebook. Você pode registrar isso no info.plist do seu aplicativo. [UIApplication canOpenURL:url] informará se um determinado URL será aberto ou não. Portanto, testar se fb:// abrir, indicará que existe um aplicativo instalado que registrou fb:// – o que é uma boa dica para o aplicativo do 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"]]; } 

Aqui está um exemplo para testar se o aplicativo do facebook está instalado

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

Para quem está tentando fazer isso com o iOS 9 / Swift 2:

Primeiro, você precisará ‘colocar na lista de permissions’ o URL adicionando o seguinte ao seu arquivo Info.plist (um recurso de segurança – veja a resposta de Leo Natan ):

 LSApplicationQueriesSchemes  fb  

Depois disso, você pode perguntar se o aplicativo está disponível e tem um esquema registrado:

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

Adicione estes em Info.plist:

 LSApplicationQueriesSchemes  fb  

Quando se trata de redes sociais, é melhor verificar vários esquemas. (Como o esquema ‘fb’ é obsoleto para o SDK do IOS9, por exemplo):

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

É claro que o Info.plist também deve conter todos os esquemas necessários:

 LSApplicationQueriesSchemes  fbapi fb-messenger-api fbauth2 fbshareextension  

iOS 9 e atualização mais recente:

Por causa de algumas mudanças de segurança que a Apple fez a partir do iOS 9, além do canOpenURL mencionado em outras respostas, você também precisa adicionar uma matriz LSApplicationQueriesSchemes com strings em info.plist. Veja a captura de canvas para um exemplo usando o Twitter.

array de info.plist LSApplicationQueriesSchemes

Se você quiser adicionar o Facebook, basta adicionar outro item na matriz com um valor de string “fb”.