iOS 9 ไม่เปิดแอพ Instagram ด้วย URL SCHEME


138

URL ต่อไปนี้เปิดใน iOS 8.3 และต่ำกว่า แต่ใช้งานไม่ได้และ iOS 9

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

ทำไม URL จะไม่เปิดขึ้น


อะไร+canOpenURL:กลับมา?
thelaws

คุณได้รับข้อผิดพลาดอะไร นี้ไม่ได้เป็นคำถามเกี่ยวกับXcode
JAL

มันล้มเหลว "ถ้า UIApplication.sharedApplication (). canOpenURL (instagramURL!)" การตรวจสอบ
Sk.Azad

โปรดดูบทความที่นี่: awkwardhare.com/post/121196006730/ …ใน iOS 9 คุณต้องระบุสิ่งที่ URL ของแอพของคุณกำลังมองหา (ฉันยังไม่ได้ทำด้วยตัวเอง)
thelaws

3
เพิ่มไปยังไฟล์ info.plist คุณ <key> LSApplicationQueriesSchemes </ key> <อาร์เรย์> <สตริง> URLScma1 </ สตริง> <สตริง> URLScma2 </ สตริง> <สตริง> URLScma3 </ สตริง> </ อาร์เรย์>
คมเลชวาร์

คำตอบ:


210

iOS 9 ได้ทำการเปลี่ยนแปลงเล็กน้อยในการจัดการรูปแบบ URL คุณต้องอนุญาตพิเศษของ URL ที่ app ของคุณจะเรียกออกมาใช้ที่สำคัญในของคุณLSApplicationQueriesSchemesInfo.plist

โปรดดูโพสต์ที่นี่: http://awkwardhare.com/post/121196006730/quick-take-on-ios-9-url-scheme-changes

ข้อสรุปหลักคือ:

หากคุณเรียกใช้เมธอด“ canOpenURL” ใน URL ที่ไม่อยู่ในรายการที่อนุญาตของคุณมันจะส่งคืน“ ไม่” แม้ว่าจะมีแอพที่ติดตั้งลงทะเบียนเพื่อจัดการรูปแบบนี้ ข้อความ“ แอปนี้ไม่ได้รับอนุญาตให้ค้นหาแบบแผน xxx” จะปรากฏขึ้น

หากคุณเรียกใช้เมธอด“ openURL” ใน URL ที่ไม่อยู่ในรายการที่อนุญาตของคุณมันจะล้มเหลวอย่างเงียบ ๆ ข้อความ“ แอปนี้ไม่ได้รับอนุญาตให้ค้นหาแบบแผน xxx” จะปรากฏขึ้น

ผู้เขียนยังคาดการณ์ว่านี่เป็นข้อผิดพลาดของระบบปฏิบัติการและ Apple จะแก้ไขปัญหานี้ในรุ่นถัดไป


23
เพื่อจุดประสงค์ในการชี้แจงอย่ารวม ": //" ในสตริงของแอพที่ระบุไว้ในรายการที่อนุญาตในอาร์เรย์ LSApplicationQueriesSchemes เช่น "comgooglemaps: //" หากคุณรวม ": //" canOpenUrl: จะส่งคืน NO และระบุ "แอพนี้ไม่ได้รับอนุญาตให้ค้นหาโครงร่าง xxx" syslog / error อย่างไรก็ตามเมื่อคุณทำการโทรจริงของ canOpenUrl: คุณจะต้องรวมเครื่องหมายโคลอนเช่น canOpenUrl: @ "comgooglemaps:"
EmphaticArmPump

5
อันที่จริงแล้ว Apple ทำการแก้ไขในการอัพเดทล่าสุด -openURL:ใช้ได้เสมอแม้ว่าจะ-canOpenURL:มีข้อ จำกัด
Tim Johnsen

ประเด็นนี้คืออะไร? ความปลอดภัยอยู่ที่ไหนถ้าฉันสามารถแสดงรายการทุกอย่างไว้ใน plist และยังสามารถสืบค้นได้
Maciej Swic

@MaciejSwic เหตุผลหนึ่งคือคุณไม่สามารถเปลี่ยนรายการโดยไม่ต้องส่งไปที่ Apple
thelaws

โปรดทราบทั้งหมดที่เกี่ยวข้องกับแอพที่รวบรวมกับ iOS SDK 9 เท่านั้น "หากคุณไม่ได้คอมไพล์ซ้ำกับ iOS SDK 9.0 แอปของคุณจะถูก จำกัด 50 รูปแบบที่แตกต่างกัน (การโทรไปที่ canOpenURL หลังจากนั้นจะส่งคืน NO)" ตามที่ระบุไว้ในdevelopers.facebook.com/docs/ios/ios9
mkll

158

ดังที่ได้กล่าวไว้ข้างต้นคุณต้องการเพิ่มคีย์ใน 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


ขอบคุณฉันคิดว่า v จำเป็นต้องเพิ่ม "fb" ลงในรายการ
siva krishna

1
@sivakrishna fb ไม่ได้กล่าวถึงที่นี่Developers.facebook.com/docs/ios/ios9
Matthieu Rouif

แต่ถ้าฉันต้องการเปลี่ยนเส้นทางไปยังหน้าหนังสือหน้าใด ๆ เช่น " facebook.com/ .... ", หลังจากเพิ่ม fb เฉพาะ wrkng ของมัน
krishna

เกือบดี ในเดือนตุลาคม 2015 ฉันพบข้อผิดพลาดบางอย่างกับ URL แปลก ๆ จากกล่องโต้ตอบแชร์ Facebook ฉันเพิ่มพวกเขาเป็นคำตอบอย่าลังเลที่จะเพิ่มไปยังของคุณซึ่งถูกต้องแน่นอน
elbuild

1
และHa://add/[username]เพื่อเพิ่มเพื่อน snapchat ใน swift 3
EssamSoft

87

นี่เป็นคุณลักษณะความปลอดภัยใหม่ของ 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> 

เพื่อทำให้สิ่งต่าง ๆ ชัดเจน กฎนี้จะใช้แอพดังกล่าวที่ให้ผู้ใช้ป้อนชุดรูปแบบ URL ของตัวเอง + ดำเนินการหรือไม่
จอนนี่

@ จอนนี่ไม่เพราะคุณยังสามารถลองเปิด URL ที่ใช้openURL:อยู่ได้ และมันจะบอกคุณว่าการเปิดประสบความสำเร็จหรือไม่
Leo Natan

ใช่ แต่ canOpenURL ไม่สามารถใช้งานได้ดังนั้นเราจึงไม่สามารถบอกผู้ใช้ว่ามันใช้งานได้หรือไม่เขาแค่ต้องลองด้วยตัวเอง
จอนนี่

ฉันต้องการเปิด Google Maps ฉันต้องใส่อะไรลงไปใน urlscheme?
coding22

25

สมมติว่าทั้งสองแอพ 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


รอไม่ควรเป็นค่าสตริงของคีย์ LSApplicationQueriesSchemes เป็น "testA" ในคำอธิบายรายการของแอป TestB?
Nik Yekimov

22

จาก, เซสชัน 703 WWDC 2015:

คุณสามารถใช้ชุดรูปแบบ URL ต่อไปได้เมื่อคุณสร้างแอพสำหรับ iOS 9 และคุณต้องการเรียกใช้ชุดรูปแบบ URL ตอนนี้คุณจะต้องประกาศชุดรูปแบบเหล่านั้นใน Info.plist ของแอพ มีคีย์ใหม่LSApplicationQueriesSchemesและที่นี่คุณจะต้องเพิ่มรายการของชุดรูปแบบที่คุณต้องการสามารถเปิด OpenERL

ตัวอย่างเช่นกรณีของ FB


1
ใช่นั่นไม่ใช่มัน มันยังไม่สามารถใช้งาน comgooglemaps ได้แม้กับ info.plist
Radu

คุณพบการแก้ไขสำหรับสิ่งนี้หรือไม่?
Salman Hasrat Khan

1
รูปภาพมีค่า 1,000 คำ ขอบคุณสำหรับภาพหน้าจอ มันคือทั้งหมดที่ฉันต้องการ
sean808080

3

การแชร์ 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>

คุณรู้หรือไม่ว่าแอพใดที่ฉันสามารถใช้เพื่อดูเอกสารและคุณสามารถให้รหัสแก่ฉันได้หรือไม่
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 แตก หากคุณใช้งานอุปกรณ์เจลเบรคให้แน่ใจว่าคุณอัปเดต Patcyh ใน Cydia


1

ดีที่คุณสามารถเปิดแอปโดยการเรียกopenURL:หรือopenURL:options:completionHandler:(iOS 10 เป็นต้นไป) canOpenURL:ได้โดยตรงโดยไม่ต้องทำการตรวจสอบเงื่อนไข โปรดอ่านหัวข้อสนทนาในApple doc สำหรับ canOpenURL: วิธีการที่ระบุว่า:

openURL: เมธอดไม่ได้ถูก จำกัด โดยLSApplicationQueriesSchemesข้อกำหนด


0

ดูเหมือนว่าไม่มีใครได้ระบุวิธีระบุ URL ด้วยพารามิเตอร์แบบฝัง URL ใด ๆ ที่มีพารามิเตอร์จะไม่สามารถระบุ URL เฉพาะใน LSApplicationsQueriesSchemes ตัวอย่างเช่นสมมติว่าฉันมีแอพอีเมลที่ส่งผ่านที่อยู่อีเมลของผู้ส่ง:

myemail://mailto?bob@gmail.com

วิธีเดียวที่ดูเหมือนว่าจะทำให้มันทำงานได้ใน iOS9 คือการลบพารามิเตอร์ใด ๆ


4
ฮะ? สิ่งที่คุณควรเพิ่มใน plist myemailคือ พารามิเตอร์ไม่มีบทบาทที่นี่
Leo Natan

0

Apple เปลี่ยนวิธี canOpenURL บน iOS 9 แอปที่กำลังตรวจสอบ URL Schemes บน iOS 9 และ iOS 10 ต้องประกาศ Schemes เหล่านี้เมื่อส่งไปยัง 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 จากแอพของฉันเองในวันนี้ฉันพบว่าไม่มีLSApplicationQueriesSchemesกุญแจที่ฉันสามารถเพิ่มลงในInfo.plist(Xcode เวอร์ชัน 8.2.1 (8C1002)) ฉันเปิดInfo.plistด้วยSublime Textและเพิ่มด้วยตนเองลงในไฟล์จากนั้นก็ใช้งานได้ เพียงเพื่อแจ้งให้คุณทราบว่าหากคุณไม่สามารถหากุญแจได้ให้เพิ่มมันเอง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.