URL berikut terbuka di iOS 8.3 dan lebih rendah, tetapi tidak berfungsi dan iOS 9
let instagramURL = NSURL(string: "instagram://app")
Mengapa URL tidak terbuka?
URL berikut terbuka di iOS 8.3 dan lebih rendah, tetapi tidak berfungsi dan iOS 9
let instagramURL = NSURL(string: "instagram://app")
Mengapa URL tidak terbuka?
Jawaban:
iOS 9 telah melakukan sedikit perubahan pada penanganan skema URL. Anda harus memasukkan daftar putih URL yang akan dipanggil aplikasi Anda untuk menggunakan LSApplicationQueriesSchemes
kunci di Info.plist
.
Silakan lihat posting di sini: http://awkwardhare.com/post/121196006730/quick-take-on-ios-9-url-scheme-changes
Kesimpulan utama adalah bahwa:
Jika Anda memanggil metode "canOpenURL" pada URL yang tidak ada dalam daftar putih Anda, itu akan mengembalikan "TIDAK", bahkan jika ada aplikasi yang diinstal yang telah terdaftar untuk menangani skema ini. "Aplikasi ini tidak diizinkan untuk meminta skema xxx" entri syslog akan muncul.
Jika Anda memanggil metode "openURL" pada URL yang tidak ada dalam daftar putih Anda, itu akan gagal secara diam-diam. "Aplikasi ini tidak diizinkan untuk meminta skema xxx" entri syslog akan muncul.
Penulis juga berspekulasi bahwa ini adalah bug dengan OS dan Apple akan memperbaikinya dalam rilis berikutnya.
-openURL:
selalu bekerja meskipun -canOpenURL:
terbatas.
Seperti yang dikatakan di atas, Anda ingin menambahkan kunci di daftar info, berikut adalah daftar untuk sebagian besar jejaring sosial
<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 pertandingan pertama Facebook (FBSDK 4.6): fbapi, fbauth2, fbshareextension. "Ha" adalah untuk snapchat
Ha://add/[username]
untuk menambahkan teman-teman snapchat dengan cepat 3
Ini adalah fitur keamanan baru iOS 9. Tonton WWDC 2015 Sesi 703 untuk informasi lebih lanjut.
Aplikasi apa pun yang dibangun dengan SDK 9 harus menyediakan LSApplicationQueriesSchemes
entri dalam file plistnya, mendeklarasikan skema mana yang coba di-query.
<key>LSApplicationQueriesSchemes</key>
<array>
<string>urlscheme</string>
<string>urlscheme2</string>
<string>urlscheme3</string>
<string>urlscheme4</string>
</array>
openURL:
. Dan itu akan memberi tahu Anda apakah pembukaan berhasil atau tidak.
Dengan asumsi dua aplikasi TestA dan TestB. TestB ingin menanyakan apakah TestA diinstal. "TestA" mendefinisikan skema URL berikut dalam file info.plist-nya:
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>testA</string>
</array>
</dict>
</array>
Aplikasi kedua "TestB" mencoba mencari tahu apakah "TestA" diinstal dengan menelepon:
[[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"TestA://"]];
Tetapi ini biasanya akan mengembalikan TIDAK di iOS9 karena "TestA" perlu ditambahkan ke entri LSApplicationQueriesSchemes dalam file info.plist TestB. Ini dilakukan dengan menambahkan kode berikut ke file info.plist TestB:
<key>LSApplicationQueriesSchemes</key>
<array>
<string>TestA</string>
</array>
Implementasi yang berfungsi dapat ditemukan di sini: https://github.com/gatzsche/LSApplicationQueriesSchemes-Working-Example
Dari, Sesi 703 WWDC 2015:
Anda dapat terus menggunakan skema URL ketika Anda membangun aplikasi untuk iOS 9 dan Anda ingin memanggil skema URL, Anda sekarang harus mendeklarasikannya di Info.plist aplikasi Anda. Ada kunci baru
LSApplicationQueriesSchemes
,, dan di sini Anda perlu menambahkan daftar skema yang Anda inginkan canOpenURL aktif.
Berbagi Facebook dari dialog berbagi gagal bahkan dengan jawaban @Matthieu (yang 100% benar untuk URL sosial lainnya). Saya harus menambahkan satu set URL yang saya balikkan dari 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>
Di Swift 4.2 dan Xcode 10.1
Dalam info.plist perlu menambahkan CFBundleURLSchemes dan LSApplicationQueriesSchemes.
-> Pilih info.plist di proyek Anda,
-> klik kanan,
-> Pilih Open As Source Code
Lihat tangkapan layar di bawah ini
-> file xml akan dibuka
-> salin - rekatkan kode di bawah ini dan ganti dengan ID Anda
CFBundleURLSchemes dan LSApplicationQueriesSchemes untuk gmail, fb, twitter, dan tertaut di.
<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>
Lihat di bawah layar file info.plist terakhir Anda
Anda dapat membuka aplikasi dengan menelepon openURL:
atau openURL:options:completionHandler:
(iOS 10 dan seterusnya) secara langsung tanpa melakukan pemeriksaan bersyarat canOpenURL:
. Silakan baca bagian diskusi di Apple doc untuk canOpenURL: metode yang mengatakan:
metode openURL: tidak dibatasi oleh
LSApplicationQueriesSchemes
persyaratan.
Tampaknya tidak ada yang membahas cara menentukan URL dengan parameter yang disematkan. URL apa pun yang berisi parameter tidak mungkin menentukan URL spesifik di LSApplicationsQueriesSchemes. Misalnya, anggap saya memiliki aplikasi email yang melewati alamat email pengirim:
myemail://mailto?bob@gmail.com
Satu-satunya cara tampaknya membuatnya berfungsi di iOS9 adalah menghapus parameter apa pun.
myemail
. Parameter tidak berperan di sini.
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)
}
}
}
Tambahkan ini di Info.plist:
<key>LSApplicationQueriesSchemes</key>
<array>
<string>instagram</string>
</array>
Ketika saya mencoba menelepon Facebook dari aplikasi saya sendiri hari ini, saya menemukan bahwa tidak ada LSApplicationQueriesSchemes
kunci yang dapat saya tambahkan ke Info.plist
(Versi Xcode 8.2.1 (8C1002)). Saya membuka Info.plist
dengan Sublime Text dan secara manual menambahkannya ke dalam file, lalu berhasil. Hanya untuk memberi tahu Anda bahwa jika Anda tidak dapat menemukan kunci, cukup tambahkan sendiri.
+canOpenURL:
kembali?