2016-02-10 21 views
10

Tôi có liên kết phổ dụng iOS được nhắm mục tiêu tại myApp. Khi tôi nhấp vào liên kết đó trong một ứng dụng khác, myApp sẽ mở ra và hiển thị hoàn toàn tiền thưởng phù hợp, nó hoạt động.wkwebview vẫn không xử lý liên kết phổ quát

Nhưng myApp bao gồm trình duyệt tích hợp sử dụng WKWebView. Khi tôi nhấp vào cùng một liên kết phổ quát từ bên trong trình duyệt tích hợp của tôi, iOS không gửi liên kết đến myApp, nó sẽ tìm nạp một trang web.

Apple docs nói

Nếu bạn tạo một đối tượng SFSafariViewController, WKWebView, hoặc UIWebView để xử lý một liên kết phổ biến, iOS mở ra trang web của bạn trong Safari thay vì mở ứng dụng của bạn. Tuy nhiên, nếu người dùng nhấn vào một liên kết phổ quát trong một đối tượng SFSafariViewController, WKWebView hoặc UIWebView được nhúng, iOS sẽ mở ứng dụng của bạn.

Tôi lưu ý điều này là similar question trong đó đề xuất là để xác định đại diện WKWebView. Tôi có cả hai WKWebView đại biểu được xác định và đang sử dụng trong myApp và điều đó không giúp ích gì. Điều này other question có rất nhiều upvotes nhưng không có câu trả lời.

My WKWebView thực sự có thể mở các liên kết phổ dụng đến các ứng dụng khác. Nếu tôi nhấp vào liên kết https://open.spotify.com/artist/3hv9jJF3adDNsBSIQDqcjp từ trong số myAppWKWebView thì nó sẽ mở ứng dụng spotify mà không cần mở bất kỳ trang web trung gian nào (mặc dù menu báo chí dài trong myApp không cung cấp "mở trong spotify"). Nhưng iOS sẽ không cung cấp liên kết phổ dụng đến myApp khi tôi nhấp vào liên kết đó từ bên trong myApp.

Sau khi thử nghiệm nhiều, tôi phát hiện ra rằng tôi có thể ngăn chặn việc hiển thị của trang web liên quan đến việc liên kết phổ biến bằng cách tìm kiếm các URL cụ thể và hủy bỏ việc hiển thị:

func webView(webView: WKWebView, decidePolicyForNavigationResponse navigationResponse: WKNavigationResponse, decisionHandler: (WKNavigationResponsePolicy) -> Void) { 
    if let urlString = navigationResponse.response.URL?.absoluteString { 
     if urlString.hasPrefix(myULPrefix) { // it's a universal link targetted at myApp 
      decisionHandler(.Cancel) 
      return 
     } 
    } 
    decisionHandler(.Allow) 
} 

tôi phải làm điều này trong quyết định xử lý cho các phản ứng, không phải là một cho hành động. Khi tôi thực hiện việc này, liên kết phổ quát được xếp hàng để giao hàng đến myApp. NHƯNG nó không thực sự được phân phối bởi iOS cho đến khi tôi thoát khỏi ứng dụng của mình (ví dụ, bằng cách nhấn vào nút trang chủ) và khởi chạy lại nó. Chức năng appDelegate quy định như truyền đạt thông điệp này trong các tài liệu của Apple tham chiếu ở trên

func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool {} 

không được gọi. Nó được gọi khi tôi thực hiện một liên kết sâu thông thường hơn - nhấp vào liên kết phổ biến trong Safari để mở myApp.

Đây có phải là lỗi không? Hoặc một tính năng? Hay tôi, như thường lệ, vừa sủa cây sai?

Cảm ơn!

+0

Nghe có vẻ như là một lỗi? Tôi khuyên bạn nên nâng cấp nó với Apple qua https://bugreport.apple.com –

+0

Bạn có giải pháp nào không? – AntiMoron

+0

Gần đây tôi chưa thực hiện dự án đó, vì vậy tôi không biết liệu có bất kỳ điều gì đã thay đổi hay không. Chúng tôi đã để nó bằng cách nhấn nút home và nhập lại ứng dụng để nhận liên kết. Nó tương đối hiếm đối với người dùng của chúng tôi vì vậy làm nhiều hơn là không hữu ích. Cá nhân tôi đã không gửi nó như là một lỗi cho Apple. Xin lỗi, tôi không thể truy cập nhiều hơn vào lúc này :-( – emrys57

Trả lời

0

Đây sẽ là hành vi nếu tên miền trang wkwebview wep của bạn giống với tên miền liên kết chung của bạn. Trong ảnh, Nếu trang web được mở trong Safari, SFSafariVC, WKWebView hoặc UIWebView có miền giống với liên kết ứng dụng của ứng dụng (liên kết phổ quát), nó sẽ không liên kết phổ dụng,

+0

Bạn có tài liệu cho điều đó không? – CoachNono

+0

Tôi không nghĩ Apple đã ghi lại điều này. Hành vi này tôi đã quan sát thấy trong việc sử dụng thực tế các liên kết phổ dụng. –

Các vấn đề liên quan