Cookies在显示“本地内容”的UIWebView中不起作用

时间:2011-02-17 22:17:37

标签: iphone cookies uiwebview local

关于将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似乎不会持续存在。

3 个答案:

答案 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应用程序中实现高分表。