IOS intercept webview load and save webpage resources to disk - ios

I have read that you can track individual resources being downloaded for use in loading a webview, see here. What I want to do is intercept and save each resource to file. Then, if the user wants to save the webpage, I will take the saved resources and html and store them in a permanent location. But I am a newbie and don't know how to set this up. Can someone help?

Look at URLProtocol subclassing for caching the entire network traffic, plus there are too many libraries for this.
Let me google it for you

Related

Offline Blog Reading (Images) capability (cache)?

I am creating a UITableView where I will load and show data from my blog's feed. This data will be updated daily, on launch or dynamically.
What I want to do is provide some offline capability to this screen, as such if user isnt connected to internet, he can still see the view and its contents (mainly post list with its images).
For such I will need some hints or solutions on how to do this, probably cache ?
Basically if user is connected to net, the view will update the contents and fetch he blog post feeds from my API and update it with new content, but if user isnt connected to net, he should see the last fetched/updated content (with images) till he connects to net and updates the view.
For this probably I need to save/cache 3 things which I will need and use in the View, all of which are fetched and provided by my API:- The Post Title, Date and its cover image.
Would best way would be to add them to some dictionary, use NSCache (aint it temporary ?) or download images locally and then save them as UIImage along with NSString (title/date) in a dic/array ?
I would like to know as many different approaches possible.
After testing a bit, I found caching images can solve my offline image problem, but is cache temporary or how long can it last ? How can I store that cached image with my text data in some dictionary to load it if network isnt connected ?
You can use a ready to use, opensource caching library like SDWebImage. It provides asynchronous image downloading as well as caching, so any image that is cached will appear in place when your app is offline.

Where do Instagram/Facebook store images internally?

Like the title says. In an iPhone, in what directory do Instagram/Facebook (and similar applications) store the images they downloaded at runtime?
When is that directory wiped?
For non permanent images (e.g. post thumbnails but not user profile pics) I would imagine they get stored in the <Application_Home>/Library/Caches, other content probably goes in Documents
You don't need to know what facebook or instagram do, but If I understand your question right, you want to download images asynchronously from web and cache them. For that u can use a third party class to handle the caching instead of writing your own, I would suggest SDWebImage.

Download entire website

I want to be able to download the entire contents of a website and use the data in my app. I've used NSURLConnection to download files in the past, but I don't believe it is capable of downloading all files from an entire website. I'm aware of the app Site Sucker, but don't think there is a way to integrate it's functionality into my app. I looked into AFNetworking & ASIHttpRequest, but didn't see anything useful to me. Any ideas / thoughts? Thanks.
I doubt there is anything out of the box that you can use, but existing libraries that you mentioned (AFNetworking & ASIHttpRequest) will get you pretty far.
The way this works is, you load the main website. Then you go through the source and find any resources that that page uses to display its contents and link to other pages. You then need to recursively download the contents of those resources, as well as its resources.
As you can imagine, there are few caveats to this approach:
You will only be able to download files that are mentioned in the source codes. Hidden files or files that aren't used by any page will not be downloaded as the app doesn't know of their existence.
Be aware of relative and absolute paths: ./image.jpg, /image.jpg, http://website.com/image.jpg, www.website.com/image.jpg, etc. could all link to the same image.
Keep in mind that page1.html could link to page2.html and vice versa. If you don't put any checks in place, this could lead to an infinite loop.
Check for pages that link to external websites--you probably don't want to download those as many websites have links to the outside and here you downloading the entire Internet to an iPhone with 8GB of storage.
Any dynamic pages (the ones that use a server side scripting language, such as PHP) will become static because they lose their server backend to provide them with dynamic data.
Those are the ones I could come up with, but I'm sure that there's more.

HTML contents preloaded into an app and then updated from the Internet

The title says (quite) all: I would like to distribute an app with some HTML pages preloaded into the local Documents folder (they reflect the content of a mini mobile site available on the internet); then, when the contents of the pages are updated, the local HTML files into the app should be updated, so that the user can browse the updated informations also when not connected to the internet.
The app has to work since the first start, thanks to the preloaded pages, and then update itself periodically (I didn't need to check the modify date/time of the single files, it's enough to check and update them when the local copies are older than x days).
The problem: I think I can do it all, but I was asking to myself if is there some framework/class that does it automatically, because it sounds to be a pain :)
Consider using ASIHTTPRequest. Check out this SO question.
Specifically, you might want to look into ASIWebPageRequest:
download complete webpages, including external resources like images
and stylesheets. Pages of any size can be indefinitely cached, and
displayed in a UIWebview / WebView even when you have no network
connection.
I've also used AFNetworking for my own personal projects and it's made my life 10x easier. On the AFNetworking FAQ page, there's a question regarding caching mechanisms for offline viewing. It mentions that NSURLCache in iOS 5 introduced support for caching to disk for offline use - but only for http. If you need to cache https, consider using SDURLCache.
Here's a short additional resource in regards to network caching for iOS.
Read the section titled iOS network caching
If you are looking at pre popping your iOS app with the equivalent of a browser cache then
https://github.com/rs/SDURLCache might be something to look into.
It hooks in with existing NSURLConnection frameworks such as AFNetworking and you just need to set the correct cache policy in your NSURLRequest.
Given its open source you should be able to figure out how where to place your data so it loads it without fetching from the server the first time then just specify when you want the cache to purge itself so it fetches it from the server?

UIWebView : Load percentage information

I need to get information on loaded data percentage when UIWebView loads page.
I know that UIWebView does not provide corresponding API.
I would like to know is there any workaround ?
One approach is to use an external framework (ASIHTTP, AFNetworking) that gives you some progress information to get the data, then load it into the UIWebView using – loadHTMLString:baseURL:.
ASIHTTP, although not actively developed anymore, has a very nice class for your case:
ASIWebPageRequest - download complete webpages, including external resources like images and stylesheets. Pages of any size can be indefinitely cached, and displayed in a UIWebview / WebView even when you have no network connection.

Resources