【问题标题】:Cookies don't work in UIWebView displaying "local content"Cookie 在显示“本地内容”的 UIWebView 中不起作用
【发布时间】:2011-02-17 22:17:37
【问题描述】:

有很多关于使用带有缓存和/或 cookie 的 UIWebView 的线程,但它们似乎都与远程 URL 相关。

当“显示本地内容”(iPhone 文档称它为)时,我无法让 cookie 工作。

例如,如果我从我的捆绑资源中加载一个普通的旧 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 似乎不会持续存在。

【问题讨论】:

    标签: iphone cookies uiwebview local


    【解决方案1】:

    我找到了一个令人满意的解决方法。通过指定一个真实的 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];
    }
    

    【讨论】:

    • [self mimeTypeForPath:path] 来自哪里? xcode 无法识别它,应用程序崩溃,甚至 google 也没有为 mimeTypeForPath 显示任何内容:
    【解决方案2】:

    您可以查看NSHTTPCookieStorage class reference。但是,如果您将 webView 用于本地内容,那么使用 cookie 的目的是什么?为什么不以其他方式将这些信息保存在您的应用中?

    【讨论】:

    • 感谢您的建议。我一直在使用它来打印所有 cookie,但没有创建任何 cookie。使用 cookie 有两个原因:第一,从 js 向 Objective-C 传递数据很困难,并且在 js 执行时不会立即发生;其次,我希望让应用程序尽可能独立于设备 - 使在浏览器中的开发速度更快。
    【解决方案3】:

    如果您的目标是在 UIWebView 中存储数据,您也可以使用 window.localStorage。它是一个哈希表,您可以在其中存储最大值。 5MB 的字符串数据。

    例如

    window.localStorage['highscore_level_1']='12000';
    
    alert(window.localStorage['highscore_level_1']);
    

    我已经成功地使用它在基于 UIWebView 的 iPhone 应用程序中实现了一个高分表。

    【讨论】:

    • 由于某种原因无法正常工作。执行在第一行结束,并且永远不会弹出警报。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-16
    • 2020-10-31
    • 2020-12-15
    • 1970-01-01
    相关资源
    最近更新 更多