IT技术博客大学习 共学习 共进步

ios webview 相关

小小子 2014-12-29 00:10:12 浏览 1,944 次

使用ios ,通过oc 使webview加载页面相关操作,遇到了如下两个问题。解决过程略有心酸,记录如下:

  1. 带登录状态(cookie)请求webview,cookie含有httponly标记

  2. 请求url由url变为url#时,webview的异常表现

cookie httponly flag

带cookie请求webview 可参考这篇文章《 IOS 网络请求中设置cookie》

那么问题来了:NSHTTPCookie 不支持httponly标记,仅有一个只读属性HTTPOnly。而为了防止xss,我们需要对cookie进行httponly标记,如何实现?

#在viewControlle中,加载之前、之后先清除cookie,防止cookie污染
-(void) viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    
    //清除cookies
    NSHTTPCookie*cookie;
    NSHTTPCookieStorage*storage=[NSHTTPCookieStoragesharedHTTPCookieStorage];
    for(cookie in[storage cookies])
    {
        [storage deleteCookie:cookie];
    }
}

#pragma mark --视图即将不可见时
-(void) viewWillDisappear:(BOOL)animated
{
    //清除cookies
    NSHTTPCookie*cookie;
    NSHTTPCookieStorage*storage=[NSHTTPCookieStoragesharedHTTPCookieStorage];
    for(cookie in[storage cookies])
    {
        [storage deleteCookie:cookie];
    }
    
    [super viewWillDisappear:animated];
}

#在view层
-(void)loadUrl:(NSURL*)url WithCookie:cookieVal
{
    NSMutableURLRequest*request=[NSMutableURLRequest requestWithURL:url];//创建NSURLRequest
    
    if(cookieVal){
        NSString*cookieString=[[NSStringalloc] initWithFormat:@"CookieName=%@;path=/;domain=.domain.cn;httponly",cookieVal];
        //这里可以传递多个cookie
        NSArray*cookies=[NSArray arrayWithObjects:cookieString,nil];
        for(NSString*cookieincookies){
            NSDictionary*cookieDict=[NSDictionary dictionaryWithObject:cookie forKey:@"Set-Cookie"];
            NSArray*headerCookie   =[NSHTTPCookie cookiesWithResponseHeaderFields:cookieDict forURL:url];
            //保存相关cookie至进程
            [[NSHTTPCookieStoragesharedHTTPCookieStorage] setCookies:headerCookie
                                                               forURL:url
                                                      mainDocumentURL:nil];
            
        }
    }
    [_webView loadRequest:request];
}

load url with #

系统一般会实现webview的delegate:
webView:shouldStartLoadWithRequest:navigationType: 、webViewDidFinishLoad:

但是发现比如页面有js实现了层级的变化,但是会将url增加#时,即由:http://www.xiaoxiaozi.com/index.php 变成 http://www.xiaoxiaozi.com/index.php# 时,系统只会触发对shoudStartLoadWithRequest的调用,而不会调用webViewDidFinishLoad。

当我们实现“请稍候”弹层时,一定要将弹层自动化隐藏~

其他

也许有更合适的应对上述问题的解决办法,还请评论的同学不要藏私!

webview还有挺深的水,后续补充。

建议继续学习

  1. IOS安全–浅谈关于IOS加固的几种方法 (阅读 19,227)
  2. iOS内存暴增问题追查与使用陷阱 (阅读 5,687)
  3. 10个必需的iOS开发工具和资源 (阅读 5,067)
  4. 在Visual Studio中使用MonoTouch开发iOS应用程序(上):环境配置 (阅读 4,927)
  5. iOS push服务 (阅读 4,807)
  6. iOS安全系列之二:HTTPS进阶 (阅读 4,267)
  7. iPhone 5/iOS 6前端开发指南 (阅读 4,173)
  8. 在Visual Studio中使用MonoTouch开发iOS应用程序(下):开发体验 (阅读 4,123)
  9. iOS到Android到底有多远 (阅读 4,125)
  10. iOS设备唯一标识获取策略 (阅读 3,688)