2013-04-26 28 views
6

Tôi đã xem manyquestions yêu cầu (và trả lời) cách cung cấp bằng chứng xác thực khi bạn biết trước rằng yêu cầu yêu cầu chúng.Làm cách nào để phát hiện một thách thức xác thực từ UIWebView?

Khi tôi tải một trang web mà yêu cầu một thách thức xác thực, (trả lời bằng HTTP 401), tôi UIWebViewDelegate chỉ nhận được callbacks sau: webView:shouldStartLoadWithRequest:navigationType: và đôi khi webViewDidStartLoad: (webViewDidStartLoad: dường như được gọi là nếu tôi hướng trực tiếp đến trang web, và nó dường như không được gọi nếu tôi được chuyển hướng đến đó).

Bằng cách ghi đè -[NSObject respondsToSelector:], UIWebViewDelegate nhận một số cuộc gọi đến uiWebView:resource:canAuthenticateAgainstProtectionSpace:forDataSource:uiWebView:resource:didReceiveAuthenticationChallenge:fromDataSource:, điều này có thể hữu ích, nhưng tất nhiên đó là API riêng tư và có thể sẽ khiến ứng dụng của tôi bị từ chối.

Tôi đã thử nghiệm một vài ứng dụng chính thống khác với nhúng UIWebView s. Cho đến nay, chỉ Chrome xử lý các thách thức xác thực này một cách chính xác. Tôi thậm chí đã thiết lập máy chủ của riêng mình và xác thực rằng Chrome chỉ POST s một lần. Twitter và Tweetbot không chỉ hiển thị màn hình tải mãi mãi, giống như tôi.

Có cách nào khác (có thể rất khó hiểu) để phát hiện những thách thức xác thực khác ngoài việc sử dụng số liệu đầu cơ thứ hai NSURLConnection? Nếu tôi thực hiện yêu cầu POST, điều đó sẽ tăng gấp đôi POST mọi thứ, điều đó thật tệ.

I've added a radar to request an enhancement to UIWebView for this. Hãy sao chép nó.

+0

Cảm ơn bạn đã đưa ra yêu cầu về radar - Tôi đã lừa nó! –

Trả lời

6

Apple now has sample code that solves this problem. Nó cũng giống như tài liệu hoàn chỉnh nhất về cách thực hiện một NSURLProtocol đúng cách.

+0

Tôi gặp sự cố với mã mẫu này. Một trong những NSURLConnections của tôi ngừng nhận cuộc gọi lại. Tuy nhiên, điều này vẫn có vẻ là lựa chọn tốt nhất trên mạng. Tôi đã gửi một TSI với DTS, và hy vọng Apple có thể giúp tôi giải quyết vấn đề của mình. –

+1

Sự cố của tôi xảy ra vì tôi có một 'NSURLProtocol' khác đã sử dụng' NSURLConnection', chặn các cuộc gọi 'UIWebView'. Sau khi nói chuyện với Apple DTS, có vẻ như bạn không thể sử dụng 'NSURLProtocol' dựa trên' NSURLProtocol' với 'UIWebView'. Mã mẫu của Apple sử dụng 'NSURLSession' để nó ổn. –

3

Bạn có thể tải tất cả các yêu cầu trong số NSURLConnection của riêng mình, sau đó cấp dữ liệu vào webview dưới dạng chuỗi. Điều này sẽ cho phép bạn chặn kết nối trong tất cả các vinh quang của nó và vẫn nhận được kết xuất bản địa UIWebView. Tôi không chắc liệu nó có hoạt động tốt hay không khi truyền dữ liệu vào chế độ xem web khi nó đến, nhưng hy vọng chúng tôi không nói quá nhiều dữ liệu ở đây.

+0

Cảm ơn. Đây là những gì tôi đang làm bây giờ. –

+0

Tôi muốn nghe, ở đây hoặc trên Twitter, cách hoạt động, đặc biệt nếu bạn cố gắng tải chuỗi HTML một cách từng bước. –

+0

Tôi không dự định thực hiện tải trọng gia tăng. Tôi sẽ cố gắng để viết blog về điều này một khi tôi nhận được nó đi. –