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 คุณต้องอนุญาตพิเศษของ URL ที่ app ของคุณจะเรียกออกมาใช้ที่สำคัญในของคุณLSApplicationQueriesSchemes
Info.plist
โปรดดูโพสต์ที่นี่: http://awkwardhare.com/post/121196006730/quick-take-on-ios-9-url-scheme-changes
ข้อสรุปหลักคือ:
หากคุณเรียกใช้เมธอด“ canOpenURL” ใน URL ที่ไม่อยู่ในรายการที่อนุญาตของคุณมันจะส่งคืน“ ไม่” แม้ว่าจะมีแอพที่ติดตั้งลงทะเบียนเพื่อจัดการรูปแบบนี้ ข้อความ“ แอปนี้ไม่ได้รับอนุญาตให้ค้นหาแบบแผน xxx” จะปรากฏขึ้น
หากคุณเรียกใช้เมธอด“ openURL” ใน URL ที่ไม่อยู่ในรายการที่อนุญาตของคุณมันจะล้มเหลวอย่างเงียบ ๆ ข้อความ“ แอปนี้ไม่ได้รับอนุญาตให้ค้นหาแบบแผน xxx” จะปรากฏขึ้น
ผู้เขียนยังคาดการณ์ว่านี่เป็นข้อผิดพลาดของระบบปฏิบัติการและ Apple จะแก้ไขปัญหานี้ในรุ่นถัดไป
-openURL:
ใช้ได้เสมอแม้ว่าจะ-canOpenURL:
มีข้อ จำกัด
ดังที่ได้กล่าวไว้ข้างต้นคุณต้องการเพิ่มคีย์ใน 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" สำหรับ snapchat
Ha://add/[username]
เพื่อเพิ่มเพื่อน snapchat ใน swift 3
นี่เป็นคุณลักษณะความปลอดภัยใหม่ของ iOS 9 ดูWWDC 2015 Session 703สำหรับข้อมูลเพิ่มเติม
แอปใด ๆ ที่สร้างด้วย SDK 9 จำเป็นต้องจัดเตรียมLSApplicationQueriesSchemes
รายการในไฟล์ plist โดยประกาศว่าแผนใดที่พยายามสืบค้น
<key>LSApplicationQueriesSchemes</key>
<array>
<string>urlscheme</string>
<string>urlscheme2</string>
<string>urlscheme3</string>
<string>urlscheme4</string>
</array>
openURL:
อยู่ได้ และมันจะบอกคุณว่าการเปิดประสบความสำเร็จหรือไม่
สมมติว่าทั้งสองแอพ TestA และ TestB TestB ต้องการสอบถามว่ามีการติดตั้ง TestA หรือไม่ "TestA" กำหนดรูปแบบ URL ต่อไปนี้ในไฟล์ info.plist
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>testA</string>
</array>
</dict>
</array>
แอปที่สอง "TestB" พยายามค้นหาว่ามีการติดตั้ง "TestA" หรือไม่โดยเรียก:
[[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"TestA://"]];
แต่โดยปกติจะส่งคืน NO ใน iOS9 เพราะต้องเพิ่ม "TestA" ลงในรายการ LSApplicationQueriesSchemes ในไฟล์ info.plist ของ TestB สิ่งนี้ทำได้โดยการเพิ่มรหัสต่อไปนี้ลงในไฟล์ info.plist ของ TestB:
<key>LSApplicationQueriesSchemes</key>
<array>
<string>TestA</string>
</array>
การใช้งานที่สามารถพบได้ที่นี่: https://github.com/gatzsche/LSApplicationQueriesSchemes-Working-Example
จาก, เซสชัน 703 WWDC 2015:
คุณสามารถใช้ชุดรูปแบบ URL ต่อไปได้เมื่อคุณสร้างแอพสำหรับ iOS 9 และคุณต้องการเรียกใช้ชุดรูปแบบ URL ตอนนี้คุณจะต้องประกาศชุดรูปแบบเหล่านั้นใน Info.plist ของแอพ มีคีย์ใหม่
LSApplicationQueriesSchemes
และที่นี่คุณจะต้องเพิ่มรายการของชุดรูปแบบที่คุณต้องการสามารถเปิด OpenERL
การแชร์ Facebook จากกล่องโต้ตอบการแชร์ล้มเหลวแม้จะมี @Matthieu answer (ซึ่งถูกต้อง 100% สำหรับ URL สังคมอื่น ๆ ) ฉันต้องเพิ่มชุด URL ที่ฉันย้อนกลับจาก 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>
ใน 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สุดท้ายของคุณคือ
เป็นสิ่งสำคัญที่จะต้องทราบว่ามีข้อผิดพลาดกับโทรศัพท์ที่ถูกเจลเบรคใน 9.0.x ซึ่งทำให้รูปแบบ URL แตก หากคุณใช้งานอุปกรณ์เจลเบรคให้แน่ใจว่าคุณอัปเดต Patcyh ใน Cydia
ดีที่คุณสามารถเปิดแอปโดยการเรียกopenURL:
หรือopenURL:options:completionHandler:
(iOS 10 เป็นต้นไป) canOpenURL:
ได้โดยตรงโดยไม่ต้องทำการตรวจสอบเงื่อนไข โปรดอ่านหัวข้อสนทนาในApple doc สำหรับ canOpenURL: วิธีการที่ระบุว่า:
openURL: เมธอดไม่ได้ถูก จำกัด โดย
LSApplicationQueriesSchemes
ข้อกำหนด
ดูเหมือนว่าไม่มีใครได้ระบุวิธีระบุ URL ด้วยพารามิเตอร์แบบฝัง URL ใด ๆ ที่มีพารามิเตอร์จะไม่สามารถระบุ URL เฉพาะใน LSApplicationsQueriesSchemes ตัวอย่างเช่นสมมติว่าฉันมีแอพอีเมลที่ส่งผ่านที่อยู่อีเมลของผู้ส่ง:
myemail://mailto?bob@gmail.com
วิธีเดียวที่ดูเหมือนว่าจะทำให้มันทำงานได้ใน iOS9 คือการลบพารามิเตอร์ใด ๆ
myemail
คือ พารามิเตอร์ไม่มีบทบาทที่นี่
Apple เปลี่ยนวิธี canOpenURL บน iOS 9 แอปที่กำลังตรวจสอบ URL Schemes บน iOS 9 และ iOS 10 ต้องประกาศ Schemes เหล่านี้เมื่อส่งไปยัง Apple
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>
เมื่อฉันพยายามโทรหา Facebook จากแอพของฉันเองในวันนี้ฉันพบว่าไม่มีLSApplicationQueriesSchemes
กุญแจที่ฉันสามารถเพิ่มลงในInfo.plist
(Xcode เวอร์ชัน 8.2.1 (8C1002)) ฉันเปิดInfo.plist
ด้วยSublime Textและเพิ่มด้วยตนเองลงในไฟล์จากนั้นก็ใช้งานได้ เพียงเพื่อแจ้งให้คุณทราบว่าหากคุณไม่สามารถหากุญแจได้ให้เพิ่มมันเอง
+canOpenURL:
กลับมา?