iOS 9 không mở ứng dụng Instagram bằng URL SCHEME


138

URL sau mở trên iOS 8.3 trở xuống, nhưng nó không hoạt động và iOS 9

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

Tại sao URL không mở?


Điều gì +canOpenURL:trở lại?
thelaws

lỗi gì bạn nhận được? Đây không phải là một câu hỏi về xcode .
JAL

Nó không thành công "nếu UIApplication. SharedApplication (). CanOpenURL (instagramURL!)" Việc kiểm tra
Sk.Azad

Vui lòng xem bài viết tại đây: awussyhare.com/post/121196006730/ Kẻ Trong iOS 9, bạn phải chỉ định những lược đồ url nào mà ứng dụng của bạn đang tìm kiếm (tôi đã không tự làm điều này)
thelaws

3
Thêm phần này vào tập tin info.plist của bạn <key> LSApplicationQueriesSchemes </ key> <mảng> <string> URLScma1 </ string> <string> URLScma2 </ string> <string> URLScma3 </ string> </ mảng>
Kamleshwar

Câu trả lời:


210

iOS 9 đã thực hiện một thay đổi nhỏ đối với việc xử lý lược đồ URL. Bạn phải liệt kê danh sách các url mà ứng dụng của bạn sẽ gọi để sử dụng LSApplicationQueriesSchemeskhóa trong Info.plist.

Vui lòng xem bài đăng tại đây: http://awkwardhare.com/post/121196006730/quick-take-on-ios-9-url-scheme-changes

Kết luận chính là:

Nếu bạn gọi phương thức của can canpenpenL trên một URL không có trong danh sách trắng của bạn, nó sẽ trả về NÚT SỐ, ngay cả khi có một ứng dụng được cài đặt đã đăng ký để xử lý lược đồ này. Một ứng dụng này Ứng dụng này không được phép truy vấn cho sơ đồ xxx Mục nhập syslog sẽ xuất hiện.

Nếu bạn gọi phương thức openURL trực tiếp trên một URL không có trong danh sách trắng của bạn, nó sẽ thất bại trong âm thầm. Một ứng dụng này Ứng dụng này không được phép truy vấn cho sơ đồ xxx Mục nhập syslog sẽ xuất hiện.

Tác giả cũng suy đoán rằng đây là một lỗi với HĐH và Apple sẽ sửa lỗi này trong phiên bản tiếp theo.


23
Để làm rõ, KHÔNG bao gồm ": //" trong chuỗi của một ứng dụng cụ thể sẽ được đưa vào danh sách trắng trong mảng LSApplicationQueriesScheme, tức là "comgooglemaps: //". Nếu bạn bao gồm ": //" canOpenUrl: sẽ trả về NO và cung cấp "Ứng dụng này không được phép truy vấn cho sơ đồ xxx" syslog / error. Tuy nhiên, khi bạn thực hiện cuộc gọi thực tế của canOpenUrl: bạn vẫn phải bao gồm dấu hai chấm tức là canOpenUrl: @ "comgooglemaps:".
EmphaticArmPump

5
Trên thực tế, Apple đã sửa lỗi này trong một bản cập nhật gần đây. -openURL:luôn luôn hoạt động mặc dù -canOpenURL:có giới hạn.
Tim Johnsen

Điểm này là gì? Bảo mật ở đâu nếu tôi chỉ có thể liệt kê tất cả mọi thứ trong bảng và vẫn truy vấn cho nó?
Maciej Swic

@MaciejSwic Một lý do là bạn không thể thay đổi danh sách mà không gửi lại cho Apple.
thelaws

Lưu ý tất cả những điều đó chỉ liên quan đến các ứng dụng được biên dịch dựa trên iOS SDK 9. "Nếu bạn không biên dịch lại với iOS SDK 9.0, ứng dụng của bạn bị giới hạn ở 50 lược đồ riêng biệt (các cuộc gọi tới canOpenURL sau đó trả về NO)", như được chỉ định trên developers.facebook.com/docs/ios/ios9
mkll

158

Như đã nói ở trên, bạn muốn thêm một khóa trong phần thông tin, đây là danh sách cho hầu hết các mạng xã hội

<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 trận đấu đầu tiên của Facebook (FBSDK 4.6): fbapi, fbauth2, fbshareextension. "Ha" là dành cho snapchat


Thx, tôi nghĩ rằng v cần thêm "fb" vào danh sách
siva krishna

1
@sivakrishna fb không được đề cập ở đây nhà phát
triển.facebook.com/docs/ios/ios9

nhưng nếu tôi muốn chuyển hướng đến bất kỳ trang sách mặt nào như " facebook.com/....",Sau khi chỉ thêm fb thì wrkng của nó
siva krishna

Hầu như là tốt. Trong Octobr 2015 tôi đã gặp một số thất bại với các URL lạ từ hộp thoại chia sẻ của Facebook. Tôi đã thêm chúng dưới dạng câu trả lời, vui lòng thêm nó vào câu trả lời của bạn, điều này thực sự chính xác.
elbuild

1
Ha://add/[username]để thêm bạn bè snapchat trong swift 3
EssamSoft

87

Đây là một tính năng bảo mật mới của iOS 9. Xem WWDC 2015 Phiên 703 để biết thêm thông tin.

Bất kỳ ứng dụng nào được xây dựng với SDK 9 đều cần cung cấp một LSApplicationQueriesSchemesmục trong tệp plist của nó, tuyên bố những kế hoạch mà nó cố gắng truy vấn.

<key>LSApplicationQueriesSchemes</key>
<array>
 <string>urlscheme</string>
 <string>urlscheme2</string>
 <string>urlscheme3</string>
 <string>urlscheme4</string>
</array> 

Để làm cho mọi thứ rõ ràng. Điều này có loại trừ các ứng dụng như vậy cho phép người dùng nhập lược đồ URL của riêng họ + thực thi điều đó không?
Jonny

@Jonny Không, vì bạn vẫn có thể thử mở bất kỳ URL nào bằng cách sử dụng openURL:. Và nó sẽ cho bạn biết nếu mở đã thành công hay không.
Leo Natan

Vâng, nhưng canOpenURL không thể được sử dụng vì vậy chúng tôi không thể nói với người dùng nếu nó sẽ hoạt động hay không, anh ta phải tự mình thử.
Jonny

Tôi muốn mở google maps, tôi phải đặt gì vào urlscheme?
mã hóa

25

Giả sử hai ứng dụng TestA và TestB. TestB muốn truy vấn nếu TestA được cài đặt. "TestA" định nghĩa lược đồ URL sau trong tệp info.plist của nó:

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>testA</string>
        </array>
    </dict>
</array>

Ứng dụng thứ hai "TestB" cố gắng tìm hiểu xem "TestA" có được cài đặt hay không bằng cách gọi:

[[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"TestA://"]];

Nhưng điều này thường sẽ trả về NO trong iOS9 vì "TestA" cần được thêm vào mục nhập LSApplicationQueriesScheme trong tệp thông tin.plist của TestB. Điều này được thực hiện bằng cách thêm đoạn mã sau vào tệp info.plist của TestB:

<key>LSApplicationQueriesSchemes</key>
<array>
    <string>TestA</string>
</array>

Một triển khai làm việc có thể được tìm thấy ở đây: https://github.com/gatzsche/LSApplicationQueriesScheme-Working-Example


chờ đã, không nên là giá trị chuỗi của khóa LSApplicationQueriesScheme là "testA" trong in.plist của ứng dụng TestB?
Nik Yekimov

22

Từ, Phiên 703 WWDC 2015:

Bạn có thể tiếp tục sử dụng các lược đồ URL khi bạn xây dựng ứng dụng cho iOS 9 và bạn muốn gọi các lược đồ URL, bây giờ bạn sẽ cần khai báo chúng trong ứng dụng Info.plist của bạn. Có một khóa mới LSApplicationQueriesSchemes, và ở đây bạn sẽ cần thêm danh sách các lược đồ bạn muốn là canOpenURL.

Chẳng hạn, bao gồm FB


1
Vâng, không phải vậy. Nó vẫn không hoạt động comgooglemaps, ngay cả với thông tin.plist
Radu

bạn đã tìm thấy một sửa chữa cho điều này?
Salman Hasrat Khan

1
một bức tranh có giá trị 1000 từ. cảm ơn vì ảnh chụp màn hình đó là tất cả những gì tôi cần
sean808080

3

Chia sẻ Facebook từ hộp thoại chia sẻ không thành công ngay cả với câu trả lời @Matthieu (chính xác 100% cho các URL xã hội còn lại). Tôi đã phải thêm một bộ URL tôi đã đảo ngược từ SDK Facebook.

<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>

Bạn có biết ứng dụng nào tôi có thể sử dụng để xem tài liệu và bạn có thể cung cấp cho tôi mã cho nó không?
Nishat Jahan

2

Trong Swift 4.2 và Xcode 10.1

Trong info.plist cần thêm CFBundleURLScheme và LSApplicationQueriesScheme.

-> Chọn info.plist trong dự án của bạn,

-> nhấp chuột phải,

-> Chọn Mở dưới dạng Mã nguồn

Xem ảnh chụp màn hình bên dưới

nhập mô tả hình ảnh ở đây

-> tập tin xml sẽ được mở

-> sao chép - dán mã bên dưới và thay thế bằng ID của bạn

CFBundleURLScheme và LSApplicationQueriesScheme cho gmail, fb, twitter và được liên kết trong.

<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>

Xem bên dưới màn hình cuối cùng của bạn info.plist tập tin là

nhập mô tả hình ảnh ở đây


1

Điều quan trọng cần lưu ý là đã xảy ra lỗi với điện thoại đã bẻ khóa trên 9.0.x, đã phá vỡ các lược đồ url. Nếu bạn đang chạy một thiết bị đã bẻ khóa thì hãy đảm bảo bạn cập nhật Patcyh trong Cydia


1

Vâng, bạn có thể mở một ứng dụng bằng cách gọi trực tiếp openURL:hoặc openURL:options:completionHandler:(iOS 10 trở đi) mà không cần thực hiện kiểm tra có điều kiện canOpenURL:. Vui lòng đọc phần thảo luận trong tài liệu Apple cho canOpenURL: phương thức có nội dung:

phương thức openURL: không bị ràng buộc bởi LSApplicationQueriesSchemesyêu cầu.


0

Dường như không có ai đề cập đến cách chỉ định URL với các tham số được nhúng. Bất kỳ URL nào chứa tham số đều không thể chỉ định URL cụ thể trong LSAppluggestQueriesScheme. Ví dụ: giả sử tôi có một ứng dụng email vượt qua địa chỉ email của người gửi:

myemail://mailto?bob@gmail.com

Cách duy nhất để nó hoạt động trong iOS9 là xóa mọi tham số.


4
Huh? Những gì bạn nên thêm vào trong plist là myemail. Các thông số không có vai trò ở đây.
Leo Natan

0

Apple đã thay đổi phương thức canOpenURL trên iOS 9. Các ứng dụng đang kiểm tra Lược đồ URL trên iOS 9 và iOS 10 phải khai báo các Lược đồ này khi được gửi cho 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)
        }
    }
}

Thêm những thứ này trong Info.plist:

<key>LSApplicationQueriesSchemes</key>
<array>
    <string>instagram</string>
</array>

-1

Khi tôi cố gắng gọi Facebook từ ứng dụng của mình ngày hôm nay, tôi thấy rằng không có LSApplicationQueriesSchemeskhóa nào tôi có thể thêm vào Info.plist(Phiên bản Xcode 8.2.1 (8C1002)). Tôi đã mở Info.plistvới Sublime Text và tự thêm nó vào tệp, sau đó nó hoạt động. Chỉ để cho bạn biết rằng nếu bạn không thể tìm thấy chìa khóa, chỉ cần tự thêm nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.