# iOS预加载Web页面方案
可以先下载Demo看看效果,Github地址:< [GitHub - ming1016/STMURLCache: iOS预加载Web页面方案](https://github.com/ming1016/STMURLCache) >
可以预加载多个网址,然后在离线状态去显示那几个网址,看看是不是都完全缓存下来了。
## 使用方法
在需要开启预加载的地方创建
```objective-c
self.sCache = [STMURLCache create:^(STMURLCacheMk *mk) {
mk.whiteListsHost(whiteLists).whiteUserAgent(@"starming");
}];
```
这里是所有可设置项目,默认设置可以查看 model 的 get 方法
```objective-c
- (STMURLCacheMk *(^)(NSUInteger)) memoryCapacity; //内存容量
- (STMURLCacheMk *(^)(NSUInteger)) diskCapacity; //本地存储容量
- (STMURLCacheMk *(^)(NSUInteger)) cacheTime; //缓存时间
- (STMURLCacheMk *(^)(NSString *)) subDirectory; //子目录
- (STMURLCacheMk *(^)(BOOL)) isDownloadMode; //是否启动下载模式
- (STMURLCacheMk *(^)(NSArray *)) whiteListsHost; //域名白名单
- (STMURLCacheMk *(^)(NSString *)) whiteUserAgent; //WebView的user-agent白名单
- (STMURLCacheMk *(^)(NSString *)) addHostWhiteList; //添加一个域名白名单
- (STMURLCacheMk *(^)(NSString *)) addRequestUrlWhiteList; //添加请求白名单
//NSURLProtocol相关设置
- (STMURLCacheMk *(^)(BOOL)) isUsingURLProtocol; //是否使用NSURLProtocol,默认使用NSURLCache
```
也可以随时更新这些设置项
```objective-c
[self.sCache update:^(STMURLCacheMk *mk) {
mk.isDownloadMode(YES);
}];
```
预加载名单可以按照整个 web 页面请求进行预加载
```objective-c
[self.sCache preLoadByWebViewWithUrls:@[@"http://www.v2ex.com",@"http://www.github.com"];
```
如果需要按照单个资源列表进行预加载可以使用 *preLoadByRequestWithUrls* 这个方法。
## 白名单设置
对于只希望缓存特定域名或者地址的可以通过白名单进行设置,可以在创建时进行设置或者更新时设置。
```objective-c
NSString *whiteListStr = @"www.starming.com|www.github.com|www.v2ex.com|www.baidu.com";
NSMutableArray *whiteLists = [NSMutableArray arrayWithArray:[whiteListStr componentsSeparatedByString:@"|"]];
self.sCache = [STMURLCache create:^(STMURLCacheMk *mk) {
mk.whiteListsHost(whiteLists).whiteUserAgent(@"starming");
}];
```
这里的 *whiteUserAgent* 的设置会设置 webview 的 UserAgent,这样能够让webview以外的网络请求被过滤掉。
## 基本加载缓存实现原理
创建 *STMURLCache* 后设置 *NSURLCache* 的 *URLCache* ,在 *cachedResponseForRequest* 方法中获取 *NSURLRequest* 判断白名单,检验是否有与之对应的 Cache ,有就使用本地数据返回 *NSCachedURLResponse* ,没有就通过网络获取数据数据缓存。 *STMURLCache* 对象释放时将 *NSURLCache* 设置为不缓存,表示这次预加载完成不需要再缓存。当缓存空间超出设置大小会将其清空。
使用 *NSURLProtocol* 这种原理基本类似。
## 白名单实现原理
创建域名列表设置项 *whiteListsHost* 和 *userAgent* 设置项,在创建和更新时对其进行设置。在网络请求开始通过设置项进行过滤。具体实现如下
```objective-c
//对于域名白名单的过滤
if (self.mk.cModel.whiteListsHost.count > 0) {
id isExist = [self.mk.cModel.whiteListsHost objectForKey:[self hostFromRequest:request]];
if (!isExist) {
return nil;
}
}
//User-Agent来过滤
if (self.mk.cModel.whiteUserAgent.length > 0) {
NSString *uAgent = [request.allHTTPHeaderFields objectForKey:@"User-Agent"];
if (uAgent) {
if (![uAgent hasSuffix:self.mk.cModel.whiteUserAgent]) {
return nil;
}
}
}
```
## 具体缓存实现
缓存的实现有两种,一种是 *NSURLCache* 另一种是 *NSURLProtocol* , *STMURLCache* 同时支持了这两种,通过 *STMURLCacheModel* 里的 *isUsingURLProtocol* 设置项来选择使用哪个。
### NSURLCache的实现
没有缓存的 request 会对其进行请求将获取数据按照hash地址存两份于本地,一份是数据,一份记录时间和类型,时间记录可以用于判断失效时间。对于判断是否有缓存可以根据请求地址对应的文件进行判断。具体实现如下:
```objective-c
- (NSCachedURLResponse *)localCacheResponeWithRequest:(NSURLRequest *)request {
__block NSCachedURLResponse *cachedResponse = nil;
NSString *filePath = [self filePathFromRequest:request isInfo:NO];
NSString *otherInfoPath = [self filePathFromRequest:request isInfo:YES];
NSDate *date = [NSDate date];
NSFileManager *fm = [NSFileManager defaultManager];
if ([fm fileExistsAtPath:filePath]) {
//有缓存文件的情况
BOOL expire = false;
NSDictionary *otherInfo = [NSDictionary dictionaryWithContentsOfFile:otherInfoPath];
if (self.cacheTime > 0) {
NSInteger createTime = [[otherInfo objectForKey:@"time"] integerValue];
if (createTime + self.cacheTime < [date timeIntervalSince1970]) {
expire = true;
}
}
if (expire == false) {
//从缓存里读取数据
NSData *data = [NSData dataWithContentsOfFile:filePath];
NSURLResponse *response = [[NSURLResponse alloc] initWithURL:request.URL MIMEType:[otherInfo objectForKey:@"MIMEType"] expectedContentLength:data.length textEncodingName:[otherInfo objectForKey:@"textEncodingName"]];
NSCachedURLResponse *cachedResponse = [[NSCachedURLResponse alloc] initWithResponse:response data:data];
return cachedResponse;
} else {
//cache失效了
[fm removeItemAtPath:filePath error:nil]; //清除缓存data
[fm removeItemAtPath:otherInfoPath error:nil]; //清除缓存其它信息
return nil;
}
} else {
//从网络读取
self.isSavedOnDisk = NO;
id isExist = [self.responseDic objectForKey:request.URL.absoluteString];
if (isExist == nil) {
[self.responseDic setValue:[NSNumber numberWithBool:TRUE] forKey:request.URL.absoluteString];
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (error) {
cachedResponse = nil;
} else {
NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:[NSString stringWithFormat:@"%f",[date timeIntervalSince1970]],@"time",response.MIMEType,@"MIMEType",response.textEncodingName,@"textEncodingName", nil];
BOOL resultO = [dic writeToFile:otherInfoPath atomically:YES];
BOOL result = [data writeToFile:filePath atomically:YES];
if (resultO == NO || result == NO) {
} else {
}
cachedResponse = [[NSCachedURLResponse alloc] initWithResponse:response data:data];
}
}];
[task resume];
return cachedResponse;
}
return nil;
}
}
```
### NSURLProtocol的实现
在设置配置项和更新配置项时需要创建一个 *STMURLCacheModel* 的单例来进行设置和更新配置项给 NSURLProtocol 的实现来使用。通过 isUsingURLProtocol 设置项区分, NSURLProtocol 是通过registerClass方式将protocol实现的进行注册。
```objective-c
- (STMURLCache *)configWithMk {
self.mk.cModel.isSavedOnDisk = YES;
if (self.mk.cModel.isUsingURLProtocol) {
STMURLCacheModel *sModel = [STMURLCacheModel shareInstance];
sModel.cacheTime = self.mk.cModel.cacheTime;
sModel.diskCapacity = self.mk.cModel.diskCapacity;
sModel.diskPath = self.mk.cModel.diskPath;
sModel.cacheFolder = self.mk.cMod
没有合适的资源?快使用搜索试试~ 我知道了~
iOS预加载Web页面方案.zip
共23个文件
m:7个
h:6个
storyboard:2个
需积分: 5 0 下载量 34 浏览量
2024-01-15
08:57:03
上传
评论
收藏 25KB ZIP 举报
温馨提示
方案是为解决特定问题或达成特定目标而制定的一系列计划或步骤。它的作用是提供一种系统性的方法,以有效地应对挑战、优化流程或实现目标。以下是方案的主要作用: 问题解决: 方案的核心目标是解决问题。通过系统性的规划和执行,方案能够分析问题的根本原因,提供可行的解决方案,并引导实施过程,确保问题得到合理解决。 目标达成: 方案通常与明确的目标相关联,它提供了一种达成这些目标的计划。无论是企业战略、项目管理还是个人发展,方案的制定都有助于明确目标并提供达成目标的路径。 资源优化: 方案在设计时考虑了可用资源,以最大化其效用。通过明智的资源分配,方案可以在有限的资源条件下实现最大的效益,提高效率并减少浪费。 风险管理: 方案通常会对潜在的风险进行评估,并制定相应的风险管理策略。这有助于减轻潜在问题的影响,提高方案的可行性和可持续性。 决策支持: 方案提供了决策者所需的信息和数据,以便做出明智的决策。这种数据驱动的方法有助于减少不确定性,提高决策的准确性。 团队协作: 复杂的问题通常需要多个人的协同努力。方案提供了一个共同的框架,帮助团队成员理解各自的职责和任务,促进协作并确保整个团队朝着共同的目标努力。 监控与评估: 方案通常包括监控和评估的机制,以确保实施的有效性。通过定期的评估,可以及时调整方案,以适应变化的环境或新的挑战。 总体而言,方案的作用在于提供一种有序、有计划的方法,以解决问题、实现目标,并在实施过程中最大化资源利用和风险管理。
资源推荐
资源详情
资源评论
收起资源包目录
iOS预加载Web页面方案.zip (23个子文件)
SJT-code
STMURLCache.xcodeproj
project.pbxproj 18KB
project.xcworkspace
contents.xcworkspacedata 156B
Podfile 157B
LICENSE 1KB
.gitignore 1KB
STMURLCache
STMURLProtocol.h 166B
STMURLProtocol.m 5KB
ViewController.h 219B
STMURLCacheMk.h 1KB
Base.lproj
Main.storyboard 2KB
LaunchScreen.storyboard 2KB
AppDelegate.h 281B
STMURLCacheMk.m 3KB
STMURLCache.m 7KB
AppDelegate.m 2KB
main.m 335B
STMURLCacheModel.h 2KB
STMURLCacheModel.m 9KB
ViewController.m 2KB
Info.plist 2KB
STMURLCache.h 1KB
Assets.xcassets
AppIcon.appiconset
Contents.json 1KB
README.md 9KB
共 23 条
- 1
资源评论
JJJ69
- 粉丝: 6262
- 资源: 5775
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功