iOS 9がURLスキームでInstagramアプリを開かない


138

次のURLはiOS 8.3以下で開きますが、iOS 9では機能しません

let instagramURL = NSURL(string: "instagram://app")

URLが開かないのはなぜですか?


何が+canOpenURL:戻りますか?
thelaws 2015年

どのようなエラーが発生していますか?これはxcodeに関する質問ではありません。
JAL

「ifUIApplication.sharedApplication()。canOpenURL(instagramURL!)」のチェックに失敗する
Sk.Azad

こちらの記事をご覧ください:awkwardhare.com/post/121196006730/…iOS 9では、アプリが探しているURLスキームを指定する必要があります(私はこれを自分で実行していません)
thelaws

3
これをinfo.plistファイルに追加します<key> LSApplicationQueriesSchemes </ key> <array> <string> URLScma1 </ string> <string> URLScma2 </ string> <string> URLScma3 </ string> </ array>
Kamleshwar

回答:


210

iOS 9では、URLスキームの処理に小さな変更が加えられています。アプリでのLSApplicationQueriesSchemesキーを使用するために呼び出すURLをホワイトリストに登録する必要がありますInfo.plist

こちらの投稿をご覧ください:http : //awkwardhare.com/post/121196006730/quick-take-on-ios-9-url-scheme-changes

主な結論は次のとおりです。

ホワイトリストにないURLで「canOpenURL」メソッドを呼び出すと、このスキームを処理するように登録されているアプリがインストールされていても、「NO」を返します。「このアプリはスキームxxxのクエリを実行できません」というsyslogエントリが表示されます。

ホワイトリストにないURLで「openURL」メソッドを呼び出すと、警告なしに失敗します。「このアプリはスキームxxxのクエリを実行できません」というsyslogエントリが表示されます。

著者はまた、これはOSのバグであり、Appleは今後のリリースでこれを修正する予定であると推測しています。


23
明確にするために、LSApplicationQueriesSchemes配列でホワイトリストに登録する特定のアプリの文字列に「://」を含めないでください。つまり、「comgooglemaps://」です。「://」を含めると、canOpenUrl:はNOを返し、「このアプリはスキームxxxのクエリを実行できない」syslog /エラーを提供します。ただし、canOpenUrl:の実際の呼び出しを行うときは、コロンを含める必要があります(つまり、canOpenUrl:@ "comgooglemaps:")。
EmphaticArmPump 2015

5
実際、Appleは最近のアップデートでこれを修正しました。制限が-openURL:あっても常に機能します-canOpenURL:
Tim Johnsen

これの意味は何ですか?plistにすべてをリストし、それでもクエリできる場合、セキュリティはどこにありますか?
Maciej Swic 2015

@MaciejSwic 1つの理由は、Appleに再送信しないとリストを変更できないことです。
thelaws 2015

これらはすべて、iOS SDK 9に対してコンパイルされたアプリにのみ関連しています。上で指定されたとおり、「あなたはiOSのSDK 9.0で再コンパイルされていない場合は、アプリが50件の異なるスキームに限定されている(canOpenURLへの呼び出しは、その後NOを返す)」developers.facebook.com/docs/ios/ios9
mkll

158

上記のように、info plistにキーを追加します。これは、ほとんどのソーシャルネットワークのリストです

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

*最初の3つはFacebook(FBSDK 4.6)と一致します:fbapi、fbauth2、fbshareextension。「は」はスナップチャット用


Thx、vは "fb"をリストに追加する必要があると思います
siva krishna

1
@sivakrishna FBここで言及されていないdevelopers.facebook.com/docs/ios/ios9
マチューRouif

しかし、「facebook.com / .... 」のようなフェイスブックのページにリダイレクトしたい場合は、fbのみを追加した後、そのwrkng
siva

ほとんど良い。Octobr 2015では、Facebookの共有ダイアログからの奇妙なURLでいくつかのエラーが発生しました。私はそれらを答えとして追加しました。実際に正しいものを自由に追加してください。
elbuild 2015年

1
そしてHa://add/[username]迅速な3でsnapchat友だちを追加する
EssamSoft

87

これはiOS 9の新しいセキュリティ機能です。WWDC2015セッション703をご覧ください。詳細については、をご覧ください。

SDK 9で構築されたアプリLSApplicationQueriesSchemesは、plistファイルにエントリを提供し、クエリを試行するスキームを宣言する必要があります。

<key>LSApplicationQueriesSchemes</key>
<array>
 <string>urlscheme</string>
 <string>urlscheme2</string>
 <string>urlscheme3</string>
 <string>urlscheme4</string>
</array> 

物事を明確にするために。これにより、ユーザーが独自のURLスキームを入力して実行できるようなアプリが除外されますか?
ジョニー2015

@ジョニーいいえ、まだを使用して任意のURLを開こうとすることができるためですopenURL:。そしてそれはオープニングが成功したかどうかを教えてくれます。
レオナタン

そうですが、canOpenURLは使用できないので、ユーザーにそれが機能するかどうかを通知することはできません。彼は自分で試す必要があります。
ジョニー2015

Googleマップを開きたいのですが、urlschemeに何を入れなければなりませんか?
コーディング22

25

2つのアプリTestAとTestBを想定しています。TestBは、TestAがインストールされているかどうかを照会する必要があります。「TestA」は、info.plistファイルで次のURLスキームを定義します。

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>testA</string>
        </array>
    </dict>
</array>

2番目のアプリ「TestB」は、次の呼び出しによって「TestA」がインストールされているかどうかを確認しようとします。

[[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"TestA://"]];

ただし、これは通常、iOS9ではNOを返します。これは、TestBのinfo.plistファイルのLSApplicationQueriesSchemesエントリに「TestA」を追加する必要があるためです。これは、TestBのinfo.plistファイルに次のコードを追加することによって行われます。

<key>LSApplicationQueriesSchemes</key>
<array>
    <string>TestA</string>
</array>

動作する実装はここにあります:https : //github.com/gatzsche/LSApplicationQueriesSchemes-Working-Example


ちょっと待ってください。TestBアプリのinto.plistにある "testA"としてLSApplicationQueriesSchemesキーの文字列値であってはなりませんか?
Nik Yekimov

22

From、Session 703 WWDC 2015:

iOS 9向けにアプリをビルドし、URLスキームを呼び出したい場合は、URLスキームを引き続き使用できます。これで、アプリをInfo.plistで宣言する必要があります。新しいキーLSApplicationQueriesSchemesがあります。ここで、canOpenURLにしたいスキームのリストを追加する必要があります。

例えば、FBの場合


1
ええ、それだけではありません。info.plistを使用しても、comgooglemapsは引き続き機能しません
Radu

これの修正は見つかりましたか?
Salman Hasrat Khan 2016

1
写真は1000語の価値があります。スクリーンショットをありがとう。必要なのはそれだけでした。
sean808080 2017

3

共有ダイアログからのFacebook共有は、@ Matthieu回答でも失敗します(これは、残りのソーシャルURLに対して100%正解です)。Facebook SDKとは逆の一連のURLを追加する必要がありました。

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

ドキュメントを表示するためにどのアプリを使用できますか。また、そのためのコードを提供してもらえますか?
Nishat Jahan

2

Swift 4.2およびXcode 10.1

info.plistでは、CFBundleURLSchemesとLSApplicationQueriesSchemesを追加する必要があります。

->プロジェクトでinfo.plistを選択し、

->右クリック、

-> ソースコードとして開くを 選択

以下のスクリーンショットを参照してください

ここに画像の説明を入力してください

-> xmlファイルが開きます

->コピー-コードの下に貼り付け、IDで置き換えます

CFBundleURLSchemesおよびLSApplicationQueriesSchemesは、gmail、fb、twitterにリンクされます。

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

下の画面を見て、最終的なinfo.plistファイルは

ここに画像の説明を入力してください


1

9.0.xのジェイルブレイクされた電話には、URLスキームを破るバグがあったことに注意してください。ジェイルブレイクしたデバイスを実行している場合は、CydiaでPatcyhを更新してください


1

まあ、条件付きチェックを行わずに、openURL:またはopenURL:options:completionHandler:(iOS 10以降)を直接呼び出すことでアプリを開くことができますcanOpenURL:canOpenURL:メソッドについては、Appleドキュメントのディスカッションセクションをお読みください。

openURL:メソッドはLSApplicationQueriesSchemes要件による制約を受けません。


0

パラメータが埋め込まれたURLを指定する方法について誰も対処していないようです。パラメータを含むURLは、LSApplicationsQueriesSchemesで特定のURLを指定することはできません。たとえば、送信者のメールアドレスを渡すメールアプリがあるとします。

myemail://mailto?bob@gmail.com

iOS9で機能するように見える唯一の方法は、パラメーターを削除することです。


4
えっ?plistに追加する必要があるのはmyemailです。ここではパラメータは何の役割も果たしません。
レオナタン

0

AppleはiOS 9でcanOpenURLメソッドを変更しました。iOS9およびiOS 10でURLスキームをチェックするアプリは、Appleに送信されるときにこれらのスキームを宣言する必要があります。



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

これらをInfo.plistに追加します。

<key>LSApplicationQueriesSchemes</key>
<array>
    <string>instagram</string>
</array>

-1

今日、自分のアプリからFacebookを呼び出そうとしたところLSApplicationQueriesSchemesInfo.plist(Xcodeバージョン8.2.1(8C1002))に追加できるキーがないことがわかりました。私Info.plistSublime Textでを開き、手動でファイルに追加しましたが、うまくいきました。キーが見つからない場合は、自分で追加することをお知らせください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.