O URL a seguir é aberto no iOS 8.3 e inferior, mas não funciona e no iOS 9
let instagramURL = NSURL(string: "instagram://app")
Por que o URL não abre?
O URL a seguir é aberto no iOS 8.3 e inferior, mas não funciona e no iOS 9
let instagramURL = NSURL(string: "instagram://app")
Por que o URL não abre?
Respostas:
O iOS 9 fez uma pequena alteração no tratamento do esquema de URL. Você deve colocar na lista branca os URLs que seu aplicativo chamará usando a LSApplicationQueriesSchemes
chave no seu Info.plist
.
Consulte a publicação aqui: http://awkwardhare.com/post/121196006730/quick-take-on-ios-9-url-scheme-changes
A principal conclusão é que:
Se você chamar o método "canOpenURL" em um URL que não esteja na sua lista de permissões, ele retornará "NÃO", mesmo se houver um aplicativo instalado registrado para lidar com esse esquema. Uma entrada syslog "Este aplicativo não tem permissão para consultar o esquema xxx" será exibida.
Se você chamar o método "openURL" em um URL que não esteja na sua lista de permissões, ele falhará silenciosamente. Uma entrada syslog "Este aplicativo não tem permissão para consultar o esquema xxx" será exibida.
O autor também especula que esse é um bug do sistema operacional e a Apple corrigirá isso em uma versão subsequente.
-openURL:
sempre funciona mesmo que -canOpenURL:
seja limitado.
Como dito acima, você deseja adicionar uma chave no info info, aqui está a lista para a maioria das redes sociais
<key>LSApplicationQueriesSchemes</key>
<array>
<string>fb</string>
<string>fbapi</string>
<string>fbauth2</string>
<string>fbshareextension</string>
<string>fb-messenger-api</string>
<string>twitter</string>
<string>viber</string>
<string>whatsapp</string>
<string>wechat</string>
<string>line</string>
<string>instagram</string>
<string> instagram-stories</string>
<string>kakaotalk</string>
<string>mqq</string>
<string>vk</string>
<string>comgooglemaps</string>
<string>googlephotos</string>
<string>ha</string>
<string>yammer</string>
</array>
* Os três primeiros jogos do Facebook (FBSDK 4.6): fbapi, fbauth2, fbshareextension. "Ha" é para snapchat
Ha://add/[username]
adicionar amigos snapchat no swift 3
Este é um novo recurso de segurança do iOS 9. Assista à WWDC 2015 Session 703 para obter mais informações.
Qualquer aplicativo criado com o SDK 9 precisa fornecer uma LSApplicationQueriesSchemes
entrada em seu arquivo plist, declarando quais esquemas ele tenta consultar.
<key>LSApplicationQueriesSchemes</key>
<array>
<string>urlscheme</string>
<string>urlscheme2</string>
<string>urlscheme3</string>
<string>urlscheme4</string>
</array>
openURL:
. E ele dirá se a abertura foi bem-sucedida ou não.
Supondo dois aplicativos TestA e TestB. TestB quer consultar se TestA está instalado. "TestA" define o seguinte esquema de URL em seu arquivo info.plist:
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>testA</string>
</array>
</dict>
</array>
O segundo aplicativo "TestB" tenta descobrir se "TestA" está instalado chamando:
[[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"TestA://"]];
Mas isso normalmente retornará NO no iOS9 porque "TestA" precisa ser adicionado à entrada LSApplicationQueriesSchemes no arquivo info.plist do TestB. Isso é feito adicionando o seguinte código ao arquivo info.plist do TestB:
<key>LSApplicationQueriesSchemes</key>
<array>
<string>TestA</string>
</array>
Uma implementação operacional pode ser encontrada aqui: https://github.com/gatzsche/LSApplicationQueriesSchemes-Working-Example
De, Sessão 703 WWDC 2015:
Você pode continuar usando esquemas de URL quando criar seu aplicativo para iOS 9 e quiser chamar esquemas de URL. Agora, será necessário declará-los no Info.plist dos aplicativos. Há uma nova chave e
LSApplicationQueriesSchemes
, aqui, você precisará adicionar a lista de esquemas em que você pode ativar o canOpenURL.
O compartilhamento no Facebook a partir de um diálogo de compartilhamento falha mesmo com a resposta @Matthieu (que é 100% correta para o restante dos URLs sociais). Eu tive que adicionar um conjunto de URL que inverti do Facebook SDK.
<array>
<string>fbapi</string>
<string>fbauth2</string>
<string>fbshareextension</string>
<string>fb-messenger-api</string>
<string>twitter</string>
<string>whatsapp</string>
<string>wechat</string>
<string>line</string>
<string>instagram</string>
<string>kakaotalk</string>
<string>mqq</string>
<string>vk</string>
<string>comgooglemaps</string>
<string>fbapi20130214</string>
<string>fbapi20130410</string>
<string>fbapi20130702</string>
<string>fbapi20131010</string>
<string>fbapi20131219</string>
<string>fbapi20140410</string>
<string>fbapi20140116</string>
<string>fbapi20150313</string>
<string>fbapi20150629</string>
</array>
No Swift 4.2 e no Xcode 10.1
Em info.plist é necessário adicionar CFBundleURLSchemes e LSApplicationQueriesSchemes.
-> Selecione info.plist no seu projeto,
-> clique direito,
-> Selecione Abrir como código-fonte
Veja a captura de tela abaixo
-> arquivo xml será aberto
-> copiar - cole o código abaixo e substitua pelo seu ID
CFBundleURLSchemes e LSApplicationQueriesSchemes para gmail, fb, twitter e vinculados em.
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLSchemes</key>
<array>
<string>li5****5</string>
<string>com.googleusercontent.apps.8***************5f</string>
<string>fb8***********3</string>
<string>twitterkit-s***************w</string>
</array>
</dict>
</array>
<key>FacebookAppID</key>
<string>8*********3</string>
<key>FacebookDisplayName</key>
<string>K************ app</string>
<key>LSApplicationQueriesSchemes</key>
<array>
<string>fbapi</string>
<string>fb-messenger-share-api</string>
<string>fbauth2</string>
<string>fbshareextension</string>
<string>twitter</string>
<string>twitterauth</string>
<string>linkedin</string>
<string>linkedin-sdk2</string>
<string>linkedin-sdk</string>
</array>
Veja na tela abaixo seu arquivo info.plist final .
Bem, você pode abrir um aplicativo ligando openURL:
ou openURL:options:completionHandler:
(iOS 10 em diante) diretamente sem fazer a verificação condicional canOpenURL:
. Leia a seção de discussão no documento da Apple para o método canOpenURL: que diz:
o método openURL: não é limitado pelo
LSApplicationQueriesSchemes
requisito.
Parece que ninguém abordou como especificar URLs com parâmetros incorporados. Qualquer URL que contenha parâmetros, não será possível especificar a URL específica em LSApplicationsQueriesSchemes. Por exemplo, suponha que eu tenha um aplicativo de email que transmita o endereço de email dos remetentes:
myemail://mailto?bob@gmail.com
A única maneira de fazê-lo funcionar no iOS9 é remover quaisquer parâmetros.
myemail
. Os parâmetros não desempenham nenhum papel aqui.
Swift 3.1, Swift 3.2, Swift 4
if let urlFromStr = URL(string: "instagram://app") {
if UIApplication.shared.canOpenURL(urlFromStr) {
if #available(iOS 10.0, *) {
UIApplication.shared.open(urlFromStr, options: [:], completionHandler: nil)
} else {
UIApplication.shared.openURL(urlFromStr)
}
}
}
Adicione-os no Info.plist:
<key>LSApplicationQueriesSchemes</key>
<array>
<string>instagram</string>
</array>
Quando tentei ligar para o Facebook a partir do meu próprio aplicativo hoje, descobri que não havia uma LSApplicationQueriesSchemes
chave que eu pudesse adicionar ao Info.plist
(Xcode Versão 8.2.1 (8C1002)). Abri o Info.plist
com Sublime Text e o adicionei manualmente ao arquivo, depois funcionou. Apenas para que você saiba que, se não conseguir encontrar a chave, basta adicioná-la.
+canOpenURL:
retorna?