2012-03-14 5 views
0

В зависимости от URL, иногда несколько URLs могут быть загружены, например, предположим, что вы загрузите URL http://www.zagat.com/ в UIWebView тогда shouldStartLoadWithRequest: будет вызываться много раз с URLs следующим образом:Как определить, когда UIWebView действительно закончил загрузку при перенаправлении?

http://www.zagat.com/ 
http://pixel.fetchback.com/serve/fb/pdj?cat=&name=landing&sid=3997 
https://m.google.com/app/plus/poswidget/?hl=en-US&jsh=m%3B%2F_%2Fapps-static%2F_%2Fjs%2Fgapi%2F__features__%2Frt%3Dj%2Fver%3Dt_fRXLZrGUk.en_US.%2Fsv%3D1%2Fam%3D!wJ3zzZyr7MyIPjLesA%2Fd%3D1#url=http%3A%2F%2Fwww.zagat.com%2F&size=small&count=true&id=I1_1331701330274&parent=http%3A%2F%2Fwww.zagat.com&rpctoken=375018132&_methods=onPlusOne%2C_ready%2C_close%2C_open%2C_resizeMe%2C_renderstart 

http://pixel.fetchback.com/serve/fb/blank 
https://www.googleapis.com/static/proxy.html?jsh=m%3B%2F_%2Fapps-static%2F_%2Fjs%2Fgapi%2F__features__%2Frt%3Dj%2Fver%3Dt_fRXLZrGUk.en_US.%2Fsv%3D1%2Fam%3D!wJ3zzZyr7MyIPjLesA%2Fd%3D1#parent=https%3A%2F%2Fm.google.com&rpctoken=809526044 
https://m.google.com/app/plus/poswidget/?hl=en-US&jsh=m%3B%2F_%2Fapps-static%2F_%2Fjs%2Fgapi%2F__features__%2Frt%3Dj%2Fver%3Dt_fRXLZrGUk.en_US.%2Fsv%3D1%2Fam%3D!wJ3zzZyr7MyIPjLesA%2Fd%3D1&jsh=m%3B%2F_%2Fapps-static%2F_%2Fjs%2Fgapi%2F__features__%2Frt%3Dj%2Fver%3Dt_fRXLZrGUk.en_US.%2Fsv%3D1%2Fam%3D!wJ3zzZyr7MyIPjLesA%2Fd%3D1#bub=1&url=http://www.zagat.com/&id=I2_1331701333045&parent=http%3A%2F%2Fwww.zagat.com&rpctoken=257947967&_methods=_onopen%2C_ready%2C_onclose%2C_close%2C_open%2C_resizeMe%2C_renderstart 

(полученный путем добавления NSLog to shouldShartLoadWithRequest)

Как загрузить один URL-адрес может привести к загрузке нескольких URL-адресов с помощью UIWebView, как можно узнать, когда загруженная вами страница полностью загружена?

Я попытался инъекционным следующий JavaScript на страницу:

var script = document.createElement('script'); 
script.type = 'text/javascript'; 
script.text = window.onload = function DOMHasLoaded() { 
document.location.href = "mydomain://anything.stuff"; 
}; 

Но при выполнении порядка адресов, переданных shouldStartLoadWithRequest является:

http://www.zagat.com/ 
http://pixel.fetchback.com/serve/fb/pdj?cat=&name=landing&sid=3997 
http://pixel.fetchback.com/serve/fb/blank 
https://m.google.com/app/plus/poswidget/?hl=en-US&jsh=m%3B%2F_%2Fapps-static%2F_%2Fjs%2Fgapi%2F__features__%2Frt%3Dj%2Fver%3Dt_fRXLZrGUk.en_US.%2Fsv%3D1%2Fam%3D!wJ3zzZyr7MyIPjLesA%2Fd%3D1#url=http%3A%2F%2Fwww.zagat.com%2F&size=small&count=true&id=I1_1331701452309&parent=http%3A%2F%2Fwww.zagat.com&rpctoken=248478838&_methods=onPlusOne%2C_ready%2C_close%2C_open%2C_resizeMe%2C_renderstart 
https://www.googleapis.com/static/proxy.html?jsh=m%3B%2F_%2Fapps-static%2F_%2Fjs%2Fgapi%2F__features__%2Frt%3Dj%2Fver%3Dt_fRXLZrGUk.en_US.%2Fsv%3D1%2Fam%3D!wJ3zzZyr7MyIPjLesA%2Fd%3D1#parent=https%3A%2F%2Fm.google.com&rpctoken=230813838 
mydomain://anything.stuff 
https://m.google.com/app/plus/poswidget/?hl=en-US&jsh=m%3B%2F_%2Fapps-static%2F_%2Fjs%2Fgapi%2F__features__%2Frt%3Dj%2Fver%3Dt_fRXLZrGUk.en_US.%2Fsv%3D1%2Fam%3D!wJ3zzZyr7MyIPjLesA%2Fd%3D1&jsh=m%3B%2F_%2Fapps-static%2F_%2Fjs%2Fgapi%2F__features__%2Frt%3Dj%2Fver%3Dt_fRXLZrGUk.en_US.%2Fsv%3D1%2Fam%3D!wJ3zzZyr7MyIPjLesA%2Fd%3D1#bub=1&url=http://www.zagat.com/&id=I2_1331701453238&parent=http%3A%2F%2Fwww 

т.е. MYDOMAIN: //anything.stuff получает прошло to shouldStartLoadWithRequest в результате изменения document.location.href, но он не передается в качестве окончательного URL-адреса.

Итак, как можно узнать, когда страница окончательно завершила загрузку и больше не будет обрабатываться URL?

ответ

0

Только одно предложение у меня есть - использовать некоторый класс подключения для получения данных и отображения их на веб-просмотре. Преимущество в том, что вы полностью контролируете соединение, например, вы можете отслеживать коды ответов 3xx и знать, что перенаправление произошло. К сожалению, это сокращает удобную поддержку некоторых документов (например, файлов MS Office), и есть много дополнительной работы, которую вы, вероятно, не можете сделать. В качестве ярлыка вы можете попытаться использовать готовый GDataHTTPFetcher, который объявляет поддержку перенаправления.

В основном, поскольку я понимаю HTTP-перенаправление, код состояния 200 ответа означает, что вы находитесь в конце маршрута перенаправления, но другого способа я не знаю, чтобы получить код состояния ответа.

+0

Благодарим за ответ - что вы подразумеваете под этим, отрезая легкую поддержку некоторых документов? – Gruntcakes

+0

Предположим, что вы хотите отобразить документ MS Word в UIWebView, есть только два способа сделать это afaik: загрузить его непосредственно из Web с помощью [webview loadRequest: это работает отлично, но если у меня есть NSData-содержимое файла, я имею чтобы сохранить файл в песочнице и использовать loadRequest с локальным запросом url, потому что loadData: по моему опыту работает не так хорошо (это дало мне пустой вид с правильным типом mime, указанным, в то время как loadRequest отображал даже файлы docx снова iOS 3.1). –

Смежные вопросы