次のURLはiOS 8.3以下で開きますが、iOS 9では機能しません
let instagramURL = NSURL(string: "instagram://app")
URLが開かないのはなぜですか?
次のURLはiOS 8.3以下で開きますが、iOS 9では機能しません
let instagramURL = NSURL(string: "instagram://app")
URLが開かないのはなぜですか?
回答:
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は今後のリリースでこれを修正する予定であると推測しています。
-openURL:
あっても常に機能します-canOpenURL:
。
上記のように、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。「は」はスナップチャット用
Ha://add/[username]
迅速な3でsnapchat友だちを追加する
これは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>
openURL:
。そしてそれはオープニングが成功したかどうかを教えてくれます。
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
From、Session 703 WWDC 2015:
iOS 9向けにアプリをビルドし、URLスキームを呼び出したい場合は、URLスキームを引き続き使用できます。これで、アプリをInfo.plistで宣言する必要があります。新しいキー
LSApplicationQueriesSchemes
があります。ここで、canOpenURLにしたいスキームのリストを追加する必要があります。
共有ダイアログからの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>
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ファイルは
まあ、条件付きチェックを行わずに、openURL:
またはopenURL:options:completionHandler:
(iOS 10以降)を直接呼び出すことでアプリを開くことができますcanOpenURL:
。canOpenURL:メソッドについては、Appleドキュメントのディスカッションセクションをお読みください。
openURL:メソッドは
LSApplicationQueriesSchemes
要件による制約を受けません。
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>
+canOpenURL:
戻りますか?