次のURLはiOS 8.3以前では開きますが、iOS 9では機能しません
let instagramURL = NSURL(string: "instagram://app")
なぜURLが開かないのですか?
iOS 9では、URLスキームの処理に小さな変更が加えられました。あなたのアプリがあなたのInfo.plist
でLSApplicationQueriesSchemes
キーを使うことを要求するURLをホワイトリストに載せなければなりません。
こちらの投稿を参照してください。 http://awkwardhare.com/post/121196006730/quick-take-on-ios-9-url-scheme-changes
主な結論は以下のとおりです。
ホワイトリストに登録されていないURLで「canOpenURL」メソッドを呼び出すと、このスキームを処理するように登録されているアプリがインストールされていても、「NO」が返されます。 「このアプリは方式xxxのクエリを許可されていません」というsyslogエントリが表示されます。
ホワイトリストに登録されていないURLに対して「openURL」メソッドを呼び出すと、暗黙のうちに失敗します。 「このアプリは方式xxxのクエリを許可されていません」というsyslogエントリが表示されます。
著者はまた、これはOSのバグであると推測しており、Appleはこれを今後のリリースで修正する予定です。
上記のように、あなたは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>
* Facebookの最初の3試合(FBSDK 4.6):fbapi、fbauth2、fbshareextension。 「ハ」はスナップチャット用です
これはiOS 9の新しいセキュリティ機能です。詳細については、 WWDC 2015 Session 703 をご覧ください。
SDK 9でビルドされたアプリは、plistファイルにLSApplicationQueriesSchemes
エントリを提供して、どのスキームをクエリしようとしているかを宣言する必要があります。
<key>LSApplicationQueriesSchemes</key>
<array>
<string>urlscheme</string>
<string>urlscheme2</string>
<string>urlscheme3</string>
<string>urlscheme4</string>
</array>
TestAとTestBの2つのアプリを想定しています。 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://"]];
しかしTest9のinfo.plistファイルのLSApplicationQueriesSchemesエントリに "TestA"を追加する必要があるので、これは通常iOS9ではNOを返します。これは、TestBのinfo.plistファイルに次のコードを追加することによって行われます。
<key>LSApplicationQueriesSchemes</key>
<array>
<string>TestA</string>
</array>
実用的な実装はここで見つけることができます。 https://github.com/gatzsche/LSApplicationQueriesSchemes-Working-Example
共有ダイアログからの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のに置き換えます。
Gmail、fb、TwitterのCFBundleURLSchemesとLSApplicationQueriesSchemesにリンクしています。
<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についての アップルのドキュメントのディスカッションセクションを読んでください:method
openURL:メソッドは
LSApplicationQueriesSchemes
の要求に制約されません。
URLスキームを壊した9.0.xのジェイルブレイク電話にバグがあったことに注意することは重要です。あなたが脱獄したデバイスを実行しているなら、あなたはCydiaでPatcyhを更新するようにしてください
埋め込みパラメータを使用してURLを指定する方法を誰もが説明しているようには見えません。パラメータを含むどのURLでもLSApplicationsQueriesSchemesで特定のURLを指定することはできません。たとえば、送信者のEメールアドレスを渡すEメールアプリがあるとします。
myemail://[email protected]
IOS9で動作させるための唯一の方法は、パラメータを削除することです。
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>
AppleはiOS 9のcanOpenURLメソッドを変更しました。iOS9とiOS 10でURLスキームをチェックしているアプリケーションは、Appleに送信されるときにこれらのスキームを宣言する必要があります。