O iOS 9 não abre o aplicativo do Instagram com o esquema de URL

138

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?

Sk.Azad
fonte
O que +canOpenURL:retorna?
thelaws
que erro você está tendo? Esta não é uma pergunta sobre o xcode .
JAL
Ele falha "se UIApplication.sharedApplication (). CanOpenURL (instagramURL!)" A verificação
Sk.Azad 22/15/15
Por favor, consulte o artigo aqui: awkwardhare.com/post/121196006730/... Em iOS 9 você deve especificar o url esquemas seu aplicativo está procurando (eu não fiz isso sozinho)
thelaws
3
Adicione isso ao seu arquivo info.plist <key> LSApplicationQueriesSchemes </key> <array> <string> URLScma1 </string> <string> URLScma2 </string> <string> URLScma3 </string> </array>
Kamleshwar

Respostas:

210

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 LSApplicationQueriesSchemeschave 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.

as leis
fonte
23
Como ponto de esclarecimento, NÃO inclua ": //" na sequência de um aplicativo específico a ser incluído na lista de permissões na matriz LSApplicationQueriesSchemes, ou seja, "comgooglemaps: //". Se você incluir ": //", canOpenUrl: retornará NÃO e fornecerá o syslog / erro "Este aplicativo não tem permissão para consultar o esquema xxx". No entanto, ao fazer a chamada real de canOpenUrl: você ainda deve incluir os dois pontos, ou seja, canOpenUrl: @ "comgooglemaps:".
EmphaticArmPump
5
De fato, a Apple corrigiu isso em uma atualização recente. -openURL:sempre funciona mesmo que -canOpenURL:seja limitado.
Tim Johnsen
Qual o sentido disso? Onde está a segurança se eu puder listar tudo na lista e ainda assim consultá-la?
Maciej Swic
@MaciejSwic Uma razão é que você não pode alterar a lista sem reenviar para a Apple.
Thelaws
Observe que tudo isso está relacionado a aplicativos compilados apenas no iOS SDK 9. "Se você não estiver recompilando com o iOS SDK 9.0, seu aplicativo está limitado a 50 esquemas distintos (as chamadas para canOpenURL depois retornam NO)", conforme especificado em developers.facebook.com/docs/ios/ios9
mkll
158

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

Matthieu Rouif
fonte
Thx, eu acho v necessidade de acrescentar "fb" à lista
siva krishna
1
@sivakrishna fb não é mencionado aqui developers.facebook.com/docs/ios/ios9
Matthieu Rouif 6/15
mas se eu quiser redirecionar para qualquer página do livro de rosto como " facebook.com/....",After acrescentando fb apenas a sua wrkng
siva krishna
Quase bom. No Octobr 2015, recebi algumas falhas com URLs estranhos nos diálogos de compartilhamento do Facebook. Eu os adicionei como resposta, fique à vontade para adicioná-lo ao seu, o que é realmente correto.
elbuild
1
e Ha://add/[username]adicionar amigos snapchat no swift 3
EssamSoft 6/17/17
87

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 LSApplicationQueriesSchemesentrada 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> 
Leo Natan
fonte
Para esclarecer as coisas. Isso excluirá os aplicativos que permitem ao usuário inserir seu próprio esquema de URL + executar isso?
Jonny
@ Jonny Não, porque você ainda pode tentar abrir qualquer URL usando openURL:. E ele dirá se a abertura foi bem-sucedida ou não.
Leo Natan
Sim, mas o canOpenURL não pode ser usado, por isso não podemos dizer ao usuário se ele funcionará ou não, ele apenas precisa tentar por si mesmo.
Jonny
Quero abrir o google maps, o que devo colocar no urlscheme?
coding22
25

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

Awsed
fonte
aguarde, não deve ser o valor da string da chave LSApplicationQueriesSchemes como "testA" no into.plist do aplicativo TestB?
Nik Yekimov
22

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.

Por exemplo, no caso de FB

Kaey
fonte
1
Sim, não é isso. Ele ainda não vai funcionar comgooglemaps, mesmo com o info.plist
Radu
você encontrou uma correção para isso?
Salman Hasrat Khan
1
uma imagem vale mais que 1000 palavras. obrigado pela captura de tela. era tudo que eu precisava.
precisa saber é o seguinte
3

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>
elbuild
fonte
Você sabe qual aplicativo posso usar para exibir um documento e pode me fornecer o código para ele?
Nishat Jahan
2

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

insira a descrição da imagem aqui

-> 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 .

insira a descrição da imagem aqui

iOS
fonte
1

É importante observar que houve um erro nos telefones com jailbreak no 9.0.x que quebrou os esquemas de URL. Se você estiver executando um dispositivo jailbroken, atualize o Patcyh no Cydia

Buzzrick
fonte
1

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 LSApplicationQueriesSchemesrequisito.

iphondroid
fonte
0

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://[email protected]

A única maneira de fazê-lo funcionar no iOS9 é remover quaisquer parâmetros.

Dave
fonte
4
Hã? O que você deve adicionar na lista é myemail. Os parâmetros não desempenham nenhum papel aqui.
Leo Natan
0

A Apple alterou o método canOpenURL no iOS 9. Os aplicativos que estão verificando os Esquemas de URL no iOS 9 e iOS 10 precisam declarar esses Esquemas à medida que são enviados à Apple.

Nish
fonte
0

Para o PayPal, adicione esquemas de URL abaixo:

insira a descrição da imagem aqui

Consulte este link

Naveen Kumar M
fonte
0

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>
Vini App
fonte
-1

Quando tentei ligar para o Facebook a partir do meu próprio aplicativo hoje, descobri que não havia uma LSApplicationQueriesSchemeschave que eu pudesse adicionar ao Info.plist(Xcode Versão 8.2.1 (8C1002)). Abri o Info.plistcom 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.

number_x
fonte