我正在制作iOS APP,数据来自网站。当用户将tableView滚动到底部时,我正在弄清楚如何加载更多数据。
注意:我创建的UIWebView在后台,这样我就可以获得webView以这种黑客方式显示的内容,但是用户只能进行交互的是UITableView。
因为我的APP需要的数据来自网站( Ajax )。我用这种方法来获取网站的内容。是的,我使用UIWebView
委托方法中的webView:shouldStartLoadWithRequest
完成了此操作。
NSString *htmlString = [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.innerHTML"];
这很完美,我得到了内容。
但问题发生在我之前说过,当用户滚动到底部时,tableView需要加载更多数据。因此,我的UIWebView
还需要加载更多内容来解析内容中的更多数据,以便tableView可以继续。 注意:我无法控制服务器上的页面,所以我无法获得API。 (可能会跨域请求吗?)
我考虑过这两种方法:
方法1.模拟向上滑动手势以触发加载更多 (当webView滚动到底部时,将自动触发加载更多操作)
方法2.注入一个javascript,告诉UIWebView
加载更多数据。
我在Chrome中使用了Developer Tool来捕获更多请求。 这是我得到的。
Remote Address:54.165.215.138:443
Request URL:https://color.adobe.com/api/v2/themes?filter=public&startIndex=144&maxNumber=36&sort=like_count&time=week
Request Method:GET
Status Code:200 OK
Request Headersview source
Accept:application/json, text/javascript, */*; q=0.01
Accept-Encoding:gzip, deflate, sdch
accept-language:zh
accept-version:2.0.0
Cache-Control:max-age=0
Connection:keep-alive
Content-Type:application/json
Cookie:AMCV_9E1005A551ED61CA0A490D45@AdobeOrg=T; international=cn; storeregion=cn; __lc.visitor_id.1031448=S1421040023.3b40036efc; 57472748-VID=111520816012303; sfdc_session=-; mbox=PC#1422579254596-83420.19_07#1423794285|session#1422583820268-575696#1422586545|check#true#1422584745; kuler-loc=zh; cookies-enabled=1; s_pers=%20s_fid%3D35A9926601E31AD1-1D7E51664BFBD9C5%7C1485743101094%3B%20s_vs%3D1%7C1422586501096%3B%20gpv%3Dcolor.adobe.com%2520%253A%2520Explore%2520%253A%2520Most%2520Popular%2520%253A%2520Week%7C1422586501098%3B%20s_nr%3D1422584701102-Repeat%7C1454120701102%3B; s_sess=%20s_ppv%3D-%252C100%252C18%252C8054%3B%20s_cpc%3D0%3B%20s_cc%3Dtrue%3B%20s_sq%3D%3B; s_vi=[CS]v1|2A3C2EE20548B5C7-40000105000065EB[CE]; aam_uuid=33030698550757492143013270951098470183
Host:color.adobe.com
If-Modified-Since:Sat, 1 Jan 2000 00:00:00 GMT
Referer:https://color.adobe.com/zh/explore/most-popular/?time=week
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.93 Safari/537.36
x-api-key:7810788A1CFDC3A717C58F96BC4DD8B4
X-NewRelic-ID:UQAPV1JRGwEGV1RVBgQ=
X-Requested-With:XMLHttpRequest
Query String Parametersview sourceview URL encoded
filter:public
startIndex:144
maxNumber:36
sort:like_count
time:week
Response Headersview source
Access-Control-Allow-Headers:Accept, Accept-Version, Content-Length, Content-MD5, Content-Type, Content-Language, Date, Api-Version, Response-Time, X-API-Key
Access-Control-Allow-Methods:GET, POST
Access-Control-Allow-Origin:*
Access-Control-Expose-Headers:Api-Version, Request-Id, Response-Time, X-API-Key
Api-Version:2.0.0
Cache-Control:no-cache, must-revalidate
Connection:keep-alive
Content-Encoding:gzip
Content-Language:zh
Content-MD5:Hbz5uI3q/P2aEQ0+0TfZgg==
Content-Security-Policy:default-src 'self'; img-src 'self' *.behance.net *.s2stagehance.com data: *.typekit.net *.adobe.com *.newrelic.com *.nr-data.net; font-src 'self' data: *.typekit.net; style-src 'self' 'unsafe-inline' *.typekit.net *.adobe.com adobe.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' *.services.adobe.com *.adobe.com *.adobetag.com *.typekit.net *.tt.omtrdc.net adobe.demdex.net *.newrelic.com *.adobelogin.com *.behance.net net.s2stagehance.com *.adobesunbreak.com; frame-src 'self' *.services.adobe.com *.adobelogin.com *.adobe.com adobe.com *.adobeku.com *.facebook.com *.adobe.demdex.net adobe.demdex.net; report-uri /api/v2/csp-reports; connect-src 'self' accounts.adobe.com www-stage.adobesunbreak.com *.services.adobe.com;
Content-Type:application/json
Date:Fri, 30 Jan 2015 02:25:26 GMT
Expires:-1
Request-Id:4043bed0-a827-11e4-98a0-81fb44ac31c8
Response-Time:20
Server:kuler-prod
Strict-Transport-Security:max-age=31104000
transfer-encoding:chunked
X-Content-Type-Options:nosniff
X-Frame-Options:SAMEORIGIN
X-XSS-Protection:1; mode=block
所以我想知道有没有办法在 UIWebView 中触发 加载更多 。有没有黑客的方法呢?如果我的问题不明确,请随时问。感谢。
答案 0 :(得分:1)
在网页的HTML中确定当您滚动到底部时调用了哪个javascript函数,然后只需使用stringByEvaluatingJavaScriptFromString:
调用该函数,此时UIWebView
将触发该函数。然而,缺点是当AJAX加载新内容时,您不会以任何方式收到通知,因此您必须为此提出另一种解决方法。
另外,你提到了:
我无法控制服务器上的页面
我读作:
如果页面发生变化,我的应用可能会中断
为什么围绕可能发生变化的网页构建应用程序,而不是直接与文档化的API进行通信?
答案 1 :(得分:1)
这完全取决于网页如何加载更多内容(即JS调用的内容以及他们如何知道何时调用它)。一般情况下,让您的应用依赖某些您无法控制的网站内容并不是一个好主意。如果他们更改了格式,您的应用就会中断,您需要提交应用更新。
如果你绝对需要这个网站的数据,那么我会创建你自己的包装网络服务,它接受你需要的参数(即页码)并返回你想要的数据。这样做的好处是: