EVURLCache
这是什么?
这是增强型NSURLCache的一个子类,用于处理所有使用NSURLRequest的网页请求。(包括UIWebView)
EVURLCache旨在处理以下缓存策略
- 即使没有网络连接,应用程序也必须能够正常运行。
- 下载后,应用程序也必须能够立即正常运行。(这意味着所需的内容可以包含在应用程序中。)
- 如果可用,您还希望能够下载新/更新的内容。
其他功能
由于(可能,请参见限制条件)所有文件都将被缓存,您无需自己处理传入的数据。您可以进行NSURLRequest操作,然后在connectionDidFinishLoading中,您可以使用缓存中的文件。您可以通过调用:EVURLCache.storagePathForRequest(theRequest)来获取该文件的完整路径。
控制缓存
EVURLCache会尊重包含'no-cache'或'no-store'的HTTP头变量'Cache-Control'和'Pragma'。如果在这种情况下,响应将不会被写入缓存。但是您需要注意,如果文件已在缓存中(因为您将其放入了PreCache文件夹或使用不同头变量之前已经检索过文件),则该文件将写入缓存以更新其内容,而HTTP头变量将被忽略。
EVURLCache在从缓存中读取时还会考虑HTTP头变量'Access-Control-Max-Age'。当内容过旧时,它会尝试重新获取内容。
缓存是基于包括查询字符串参数在内的完整URL进行的。如果您出于某种原因想将多个URL存储和检索为相同的缓存项,则可以添加HTTP头部变量(服务器端)MobileAppCacheKey。
大多数Web服务器解释URL时不会区分大小写。由于iOS和OSX(不总是)具有区分大小写的文件系统,所以可能请求的URL在文件系统中不具备区分大小写的匹配项。默认情况下,EVURLCache在将路径转换为小写时存储所有文件。如果您确实想具有区分大小写的匹配项,则可以设置EVURLCache.FORCE_LOWERCASE为false。
您可以通过EVURLCache影响最大文件大小。这是由NSURLCache基类处理的设置。默认情况下设置为16MB。您可以通过设置EVURLCache.MAX_FILE_SIZE来影响它。它作为位数设置。因此将其设置为24表示缓存大小为2^24 = 16MB。
您可以通过EVURLCache影响最大总大小。这是由NSURLCache基类处理的设置。默认情况下设置为256MB。您可以通过设置EVURLCache.MAX_CACHE_SIZE来影响它。它以位数设置。因此将其设置为30表示缓存大小为2^30 = 256MB。请确保它至少比最大文件大小大16倍,否则最大文件大小将不会使用。
如果还想查看EVURLCache正在做什么,可以将EVURLCache.LOGGING设置为true。
观看演示
按照以下步骤查看演示应用操作。日志已被启用,因此请关注输出窗口以了解正在发生什么。
- 确保演示应用不在您的手机上,并将其设置为飞行模式。
- 启动应用。您仍然可以看到我的网站的主页,因为它在PreCache中。
- 从菜单选择其他页面。您将看不到任何内容,因为这些页面既不在PreCache也不在Cache文件夹中。
- 关闭飞行模式并选择一个菜单选项。您将只看到该页面。
- 打开飞行模式并导航回主页。您现在还可以访问您之前选择的页面,因为它已被缓存。其他页面仍然不可用。
创建初始缓存
只需将您希望一开始就可用的所有文件放入/PreCache文件夹。所需的目录结构将与完整URL相同。所以evict.nl/ios/samples/index.html必须存储在/PreCache/evict.nl/ios/samples/文件夹中。将此添加到项目中的最简单方法是选择'添加文件',然后选择文件夹,并选择'为任何添加的文件夹创建文件夹引用'
如果您不确定需要在PreCache文件夹中包含哪些文件,那么只需在模拟器中启用EVURLCache并运行您的应用程序,然后执行所有需要在没有互联网连接的情况下才能正常工作的功能。然后浏览到文件(请参阅~/Library/Application Support/iPhone Simulator/ ...)。下载的文件将在Documents/Cache文件夹中。查看输出窗口以获取确切位置(如果启用了调试)。您可以将其复制到PreCache文件夹中
兼容性
这个缓存应与所有使用NSURLRequest从网络下载的下载库兼容(例如AFNetworking和Alamofire)。它还适用于UIWebview中的每个请求。
局限性
下载的文件在写入磁盘之前将完全在内存中。正因为如此,大文件不会被缓存。最大文件大小可以通过在EVURLCache.swift中设置MAX_FILE_SIZE来影响
用法
只需将以下代码放入您的AppDelegate.swift中
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
EVURLCache.LOGGING = true // We want to see all caching actions
EVURLCache.MAX_FILE_SIZE = 26 // We want more than the default: 2^26 = 64MB
EVURLCache.MAX_CACHE_SIZE = 30 // We want more than the default: 2^30 = 1GB
EVURLCache.activate()
return true
}
调试
如果你在设置 EVURLCache 时遇到问题,请启用日志记录。你可以通过设置 EVURLCache.logging = true 来完成这件事。在报告问题时,包含此输出会有所帮助。
在自己的应用中使用 EVURLCache
'EVURLCache' 现在可以通过依赖管理器 CocoaPods 提供。你必须使用版本 0.36 或更高版本的 CocoaPods。目前,可以通过执行以下操作进行安装
[sudo] gem install cocoapods
如果你已安装 CocoaPods 版本 0.36 或更高版本,则只需将以下两行添加到你的 Podfile 中,即可将 EVURLCache 添加到你的工作区
use_frameworks!
pod "EVURLCache"
CocoaPods 0.36 或更高版本会将你使用的所有 pods 制作成动态框架。因此,它只支持 iOS 8.0 或更高版本。使用框架时,你还需要在 swift 文件的顶部添加一个导入,如下所示
import EVURLCache
如果你想要支持比 iOS 8.0 更旧的版本,你也可以简单地将 EVURLCache.swift 和 ReachabilitySwift.swift 复制到你的应用中。
构建 EVURLCache 演示
-
将存储库克隆到工作目录
-
CocoaPods 用于管理依赖关系。Pods 简单设置并通过 ruby gem 分发。按照网站上的简单说明进行设置。设置完成后,从 EVURLCache 的顶级目录运行以下命令以下载 EVURLCache 的依赖项
pod install
- 在 Xcode 中打开
EVURLCache.xcworkspace
并运行应用。
许可证
EVURLCache 在 MIT 3 许可证下可用。有关更多信息,请参阅 LICENSE 文件。
我的其他库
另请参阅我的其他开源iOS库
- EVReflection - 基于反射的对象映射(字典、CKRecord、JSON和XML),并支持Alamofire和Moya扩展,使用RxSwift或ReactiveSwift
- EVCloudKitDao - 简化Apple的CloudKit访问
- EVFaceTracker - 计算您的设备和您的脸之间的距离和角度,以模拟3D效果
- EVURLCache - 一个NSURLCache子类,用于处理所有使用NSURLRequest进行网络请求的情况
- AlamofireOauth2 - 使用Alamofire实现的OAuth2
- EVWordPressAPI - 使用AlamofireOauth2、AlomofireJsonToObjects和EVReflection实现的WordPress(Jetpack)API(开发中)
- PassportScanner - 扫描护照的MRZ代码并提取姓名、姓氏、护照号码、国籍、出生日期、到期日期和个人编号
- AttributedTextView - 最简单创建具有支持多个链接(url、标签、提及)的格式化文本视图的方式