2008-12-05 34 views
11

Tôi có một ứng dụng đơn giản tải trang web được tối ưu hóa cho iPhone trong một số UIWebView.Có thể lưu trữ tài nguyên được tải trong UIWebView của iPhone không?

Vấn đề là, bộ nhớ đệm dường như không làm việc:

[webView loadRequest: [NSURLRequest requestWithURL: [NSURL URLWithString: url] 
             cachePolicy: NSURLRequestUseProtocolCachePolicy 
            timeoutInterval: 60.0]]; 

Bất kỳ điều tham chiếu trong trang xa xôi này (css, hình ảnh, file javascript bên ngoài) không bao giờ được lưu trữ (yêu cầu không bao giờ gửi một If-Modified- Vì tiêu đề hoặc bất kỳ điều gì khác trong cách kiểm soát bộ nhớ cache.)

Có thể không? Có vẻ như với một Cocoa WebView thông thường, có một phương thức ủy nhiệm được gọi cho mỗi yêu cầu tài nguyên và tải bài đăng (-didFinishLoadingFromDataSource:) mà bạn có thể sử dụng để cuộn bộ nhớ đệm của riêng mình .. nhưng điều đó dường như không áp dụng ở đây.

Toàn bộ trang của tôi (trang và tài nguyên được tham chiếu của nó) là khoảng 89K nén .. chậm hơn 3G ở một số điểm và thậm chí tệ hơn EDGE. Yêu cầu đến ít nhất cho biết rằng nó chấp nhận nén (accept-encoding=gzip, deflate), vì vậy đó là tốt, tôi giả sử.

Tôi đọc this yui study, điều này dường như chỉ ra rằng iPhone sẽ lưu vào bộ nhớ cache 25k cho mỗi mục. Điều duy nhất được tham chiếu là hơn 25k không nén là jquery (đóng gói nhưng không nén - nó là 30k). Mọi thứ khác nên được lưu trữ. Không có yêu cầu cho bất cứ điều gì được tham chiếu trong trang được tìm nạp đang kích hoạt 304 ở phía máy chủ.

Nghiên cứu yui đó là từ gần một năm trước và tôi đoán chỉ bằng safari di động.

Điều này đang sử dụng UIWebView trong ứng dụng iPhone gốc.

Trả lời

2

Bạn luôn có thể thực hiện các yêu cầu bằng tay, dù rằng sẽ khó khăn - và sau đó bạn có thể cache thứ với nội dung trái tim của bạn. Tạo một số UIWebViewDelegate bắt đầu yêu cầu trong webView:shouldStartLoadWithRequest:navigationType:, lưu vào bộ nhớ cache kết quả và sử dụng loadHTMLString:baseURL: của UIWebView để cập nhật chế độ xem.

Nó sẽ rất xấu, và mọi thứ sẽ không hoạt động trơn tru như bạn muốn, nhưng nó có thể đủ tốt cho những gì bạn cần.

7

Một workaround của vấn đề này như tôi thấy là để

1) tải về HTML code

2) lưu trữ nó trong chuỗi

3) tìm tất cả các liên kết ngoài trong nó như

<img src="img.gif" width="..." height="..." /> 

4) tải xuống tất cả

5) thay thế bằng cơ sở được nhúng Phiên bản được mã hóa 64

<img src="data:image/gif;base64,R0lGODlhUAAPA...JADs= " width="..." height="..." /> 

6) cuối cùng lưu trữ HTML hoàn chỉnh với hình ảnh được nhúng như bạn muốn.

+10

Thiên tài, mặc dù khá đáng lo ngại. –

+0

Cách tốt nhất để làm điều đó sai. Người đàn ông, chúng tôi đang tìm kiếm ở đây cho ít nhất một chút giải pháp tiện dụng –

+0

@ eagle.dan.1349 tại sao nó là cách tốt nhất để làm điều đó sai? trong trường hợp không có "giải pháp hữu ích hơn một chút" này * là * giải pháp tiện dụng nhất – abbood

4

Bây giờ bạn có thể thử ASIWebPageRequest bởi tất cả Thấy Interactive:

ASIWebPageRequest là một bổ sung thực nghiệm mới cho gia đình ASIHTTPRequest. Nó có thể được sử dụng để tải xuống một trang web hoàn chỉnh, bao gồm các tài nguyên bên ngoài như hình ảnh và bảng định kiểu, trong một yêu cầu duy nhất. Khi trang web được tải xuống, yêu cầu sẽ phân tích cú pháp nội dung, tìm tài nguyên bên ngoài, tải xuống chúng và chèn trực tiếp chúng vào nguồn html bằng URIS dữ liệu. Sau đó, bạn có thể nhận phản hồi và đưa nó trực tiếp vào một UIWebView/WebView trên Mac.

Tôi chỉ có thể khuyên mọi người sử dụng thư viện tuyệt vời của Ben Copsey cho mọi loại hoạt động HTTP anyways.

CẬP NHẬT: Ben đã ngừng ASIHTTPRequest. Tôi không còn đề nghị sử dụng nó nữa.

+0

Hey @rage, bạn có thể đề xuất bất kỳ giải pháp thay thế nào cho ASIWebPageRequest không? –

+0

AFNetworking khá tốt. Ngoài ra MKNetworking. Công chúng chưa quyết định cái nào sẽ là tiêu chuẩn thực tế tiếp theo. Tôi không chắc chắn là một trong số họ có hỗ trợ tải xuống trang web đầy đủ hay không. – rage

+0

Cảm ơn @rage. Tôi sử dụng AFNetworking cho các cuộc gọi api của tôi nhưng không phải để tải xuống/lưu trữ toàn bộ trang web. Tôi đang viết một ứng dụng container chứa một ứng dụng web Backbone bên trong một UIWebview và tôi đang tìm cách để làm cho nó tải nhanh hơn. –

5

Từ https://github.com/phonegap/phonegap-iphone/issues/148:

NSURLCache* cache = [NSURLCache sharedURLCache]; 
[cache setMemoryCapacity:4 * 1024 * 1024]; 
[cache setDiskCapacity:512*1024]; 

[NSURLRequest requestWithURL:appURL 
       cachePolicy:NSURLRequestReturnCacheDataElseLoad 
      timeoutInterval:10.0]; 
+0

Tôi nghĩ rằng liên kết bị hỏng –

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