关于将UIWebView与缓存和/或cookie一起使用有很多线索,但它们似乎都与远程URL有关。
当“显示本地内容”时,我无法使用Cookie(正如iPhone文档所说的那样)。
例如,如果我从我的包资源中加载一个普通的旧HTML文件:
- (void) viewDidLoad {
[super viewDidLoad];
NSString* path = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html"];
NSURL* url = [NSURL fileURLWithPath:path];
NSData* data = [NSData dataWithContentsOfFile:path];
[web loadData:data MIMEType:@"text/html" textEncodingName:@"us-ascii" baseURL:url];
}
然后:
- (void) webViewDidFinishLoad:(UIWebView*)webView {
NSString* result = [web stringByEvaluatingJavaScriptFromString:
@"try{document.cookie='name=value';''+document.cookie;}catch(e){''+e}"];
NSLog(@"Result = '%@'", result);
}
结果:
Result = ''
将URL设置为实际文件名而不是目录会阻止获取:Result = 'Error: SECURITY_ERR: DOM Exception 18'
,但cookie似乎不会持续存在。
答案 0 :(得分:3)
我找到了一个令人满意的解决方案。通过指定一个真实的URL,例如http://localhost/...
,然后通过继承NSURLCache类来拦截加载,以便获取实际的本地内容。
- (NSCachedURLResponse*) cachedResponseForRequest:(NSURLRequest *)request {
NSString* path = [[request URL] path];
NSData* data = [... get content of local file ...];
NSURLResponse *response = [[NSURLResponse alloc]
initWithURL:[request URL]
MIMEType:[self mimeTypeForPath:path]
expectedContentLength:[data length]
textEncodingName:nil];
NSCachedURLResponse* cachedResponse = [[NSCachedURLResponse alloc]
initWithResponse:response
data:data];
[response release];
return [cachedResponse autorelease];
}
答案 1 :(得分:2)
你可以查看NSHTTPCookieStorage class reference。但是,如果您使用webView获取本地内容,使用Cookie的目的是什么?为什么不在您的应用上以其他方式保存该信息?
答案 2 :(得分:1)
如果您的目标是在UIWebView中存储数据,您还可以使用window.localStorage。它是一个哈希表,您可以在其中存储最大值。 5MB的字符串数据。
e.g。
window.localStorage['highscore_level_1']='12000';
alert(window.localStorage['highscore_level_1']);
我已成功使用它在基于UIWebView的iPhone应用程序中实现高分表。