ios内嵌浏览器cookie保存

//

//  FMUIWebViewBridge.h

//  sgcard

//

//  Created by Apple on 13-9-10.

//

//

 

#import <Foundation/Foundation.h>

#import <CoreLocation/CoreLocation.h>

#import <UIKit/UIKit.h>

 

#import "FMLayerWebView.h"

 

@interface FMUIWebViewBridge : NSObject<UIWebViewDelegate, UIAlertViewDelegate>

{

    CFMLayerWebView * mLayerWebView;

    UIWindow        * mWindow;

    UIView          * mView;

    UIWebView       * mWebView;

    UIToolbar       * mToolbar;

    UIBarButtonItem * mBackButton;

    NSString        * mUrl;

    NSData          * mData;

}

 

- (void)setLayerWebView : (CFMLayerWebView*) iLayerWebView URLString:(const char*) urlString;

- (void)backClicked:(id)sender;

- (void)webViewDidStartLoad:(UIWebView *)webView;

- (void)webViewDidFinishLoad:(UIWebView *)webView;

- (BOOL)webView:(UIWebView *)webView

        shouldStartLoadWithRequest:(NSURLRequest *)request

        navigationType:(UIWebViewNavigationType)navigationType;

 

- (void) addCookiesToDisk:(NSString *)path withData:(NSMutableDictionary *)cookiesData;

 

- (NSMutableDictionary *) getCookiesFromDisk:(NSString *)path;

 

 

#define COOKIES_PATH "cookies/"

#define COOKIES_FILE "data"

 

@end

 

//

//  FMUIWebViewBridge.cpp

//  sgcard

//

//  Created by Apple on 13-9-10.

//

//

 

#import "FMUIWebViewBridge.h"

#import "EAGLView.h"

 

#include "GameAdapt.h"

 

//用于处理 cookie 相关的头文件

#include <dirent.h>

#include <sys/stat.h>

 

usingnamespacecocos2d;

usingnamespacesgcard;

 

@implementation FMUIWebViewBridge

- (id)init

{

    if(self = [super init])

    {

        mData = nil;

        

        //在网页启动时加存放在磁盘中的 cookies 加载进来

        //debuging - add cookies to uiwebview

        //获得读写位置

        std::string path = CCFileUtils::sharedFileUtils()->getWritablePath();

        path.append(COOKIES_PATH);

        NSString *nspath = [NSStringstringWithCString:path.c_str() encoding:NSUTF8StringEncoding];

        NSMutableDictionary *data = [self getCookiesFromDisk:nspath];

        NSEnumerator *keys = [data keyEnumerator];

        NSHTTPCookieStorage *cookies = [NSHTTPCookieStoragesharedHTTPCookieStorage];

        id key;

        NSHTTPCookie *cookie = nil;

        NSLog(@"read from disk ============= start");

        while ((key = [keys nextObject])) {

            cookie = [data valueForKey:key];

            NSLog(@"read from disk =============%@", cookie);

            [cookies setCookie:cookie];

        }

        NSLog(@"read from disk ============= end");

    }

    returnself;

}

 

- (void)dealloc

{

    //在网页退出时将 cookies 保存在 存储空间中

    //store cookies

    NSHTTPCookie *cookie;

    NSHTTPCookieStorage *cookies = [NSHTTPCookieStoragesharedHTTPCookieStorage];

    NSMutableDictionary *data = [[NSMutableDictionaryalloc] init];

    //获得读写位置

    std::string path = CCFileUtils::sharedFileUtils()->getWritablePath();

    path.append(COOKIES_PATH);

    NSString *nspath = [NSStringstringWithCString:path.c_str() encoding:NSUTF8StringEncoding];

    

    int x= 0;

    for(cookie in [cookies cookies]) {

        NSLog(@"%d =============%@", x++, cookie);

        if(!cookie.isSessionOnly)

            [data setObject:cookie forKey:cookie.name];

    }

    NSLog(@"============= addCookiesToDisk start");

    [selfaddCookiesToDisk:nspath withData:data];

    NSLog(@"============= addCookiesToDisk end");

    NSLog(@"============= self: %@", self);

 

    mLayerWebView->onClose();

    //[mWebView release];

    [mWindowrelease];

    [super dealloc];

}

 

-(void) setLayerWebView : (CFMLayerWebView*) iLayerWebView URLString:(const char*) urlString

{

    mLayerWebView   = iLayerWebView;

    CCSize size     = CGameAdapt::get()->size();

    float coeffi    = CGameAdapt::get()->coefficient();

//    float width     = ( size.width * coeffi ) / [UIScreen mainScreen].scale;

//    float height    = ( size.height * coeffi ) / [UIScreen mainScreen].scale;

    //将网页设置为全屏

    float width     = [UIScreenmainScreen].bounds.size.width;

    float height    = [UIScreenmainScreen].bounds.size.height;

    //Bottom size

    int wBottomMargin = 50 * coeffi / [UIScreen mainScreen].scale;

    mWebView = [[UIWebView alloc] initWithFrame:CGRectMake(0, wBottomMargin

                                                           , width, height - wBottomMargin )];

    /*

    mWebView = [[UIWebView alloc] initWithFrame:CGRectMake( CGameAdapt::get()->offsetx() * coeffi / [UIScreen mainScreen].scale

                                                           , CGameAdapt::get()->offsety() * coeffi / [UIScreen  mainScreen].scale + wBottomMargin

                                                           , width, height - wBottomMargin )];

    */

    NSLog(@"============ width: %f, height: %f", width, height);

    

    mWebView.delegate = self;

    [mWebViewsetUserInteractionEnabled:NO]; //don't let the user scroll while things are

    // add the webView to the view

    EAGLView * view = [EAGLView sharedEGLView];

    [view.windowmakeKeyAndVisible];

    [view addSubview:mWebView];

    

    mUrl = [NSStringstringWithCString:urlString encoding:NSUTF8StringEncoding];

    id request = [NSURLRequestrequestWithURL:[NSURLURLWithString:mUrl]];

    [mWebViewloadRequest:request];

    //[NSURLConnection connectionWithRequest:request delegate:self];

}

 

//- (void)connection:(NSURLConnection *)theConnection didReceiveData:(NSData *)data

//{

//    if (mData == nil) {

//        mData = [[NSMutableData alloc] initWithData:data];

//    } else {

//        [mData appendData:data];

//    }

//    NSLog(@"response connection");

//}

//

//- (void)connectionDidFinishLoading:(NSURLConnection *)theConnection

//{

//    NSString *responseString = [[NSString alloc] initWithData:mData encoding:NSUTF8StringEncoding];

//    NSLog(@"response body%@", responseString);

//    [mWebView loadHTMLString:responseString baseURL:[NSURL URLWithString:mUrl]];

//    [mWebView setUserInteractionEnabled:YES];

//    

//    mLayerWebView->webViewDidFinishLoad();

//}

 

- (void)webViewDidStartLoad:(UIWebView *)thisWebView

{

    

}

 

- (void)webViewDidFinishLoad:(UIWebView *)thisWebView

{

    //[self.view.window makeKeyAndVisible];

    [mWebViewsetUserInteractionEnabled:YES];

    NSString *swizzleCloseWindowJS =

    @"var script = document.createElement('script');"

    "script.type = 'text/javascript';"

    "script.text = \"window.close = function windowOnClose() { "

    "   javascript:window.location='hackCloseWindowFrame://'"

    "}\";"

    "document.getElementsByTagName('head')[0].appendChild(script);";

    [mWebViewstringByEvaluatingJavaScriptFromString:swizzleCloseWindowJS];

    

    mLayerWebView->webViewDidFinishLoad();

}

 

- (void)webView:(UIWebView *)thisWebView didFailLoadWithError:(NSError *)error

{

    if ([error code] != -999 && error != NULL)

    { //error -999 happens when the user clicks on something before it's done loading.

        UIAlertView *alert = [[UIAlertViewalloc] initWithTitle:@"Network Error"message:@"Unable to load the page. Please keep network connection."

                                                       delegate:self cancelButtonTitle:nil otherButtonTitles:@"OK", nil];

        [alert show]; 

        [alert release]; 

    }

}

 

- (void)backClicked:(id)sender

{

    mWebView.delegate = nil

    [mToolbarremoveFromSuperview]; 

    [mWebViewremoveFromSuperview]; 

    [mViewremoveFromSuperview]; 

    mLayerWebView->onBackbuttonClick(); 

}

 

- (BOOL)webView:(UIWebView *)webView

        shouldStartLoadWithRequest:(NSURLRequest *)request

        navigationType:(UIWebViewNavigationType)navigationType

{

    NSLog( @"absolute url :%@", request.URL.absoluteString );

    NSLog( @"url scheme :%@", request.URL.scheme );

 

    if ([request.URL.schemeisEqualToString:[@"hackCloseWindowFrame"lowercaseString]])

    {

        [self backClicked:nil];

        return NO;

    }

    

    //跳转的字符串格式为 sgapp:openid:{openid}:nick:{nikename}

    NSString *requestString = request.URL.absoluteString;

    NSArray *components = [requestString componentsSeparatedByString:@":"];

    if ([components count] > 1 && [(NSString *)[components objectAtIndex:0] isEqualToString:@"sgapp"])

    {

        const char *idx = NULL;

        const char *name = NULL;

        if([(NSString *)[components objectAtIndex:1] isEqualToString:@"openid"])

        {

//            const char * idx =[(NSString *)[components objectAtIndex:2] UTF8String];

            idx =[(NSString *)[components objectAtIndex:2] UTF8String];

            CCLOG("========== id: %s", idx);

//            mLayerWebView->onQQLogin( idx, NULL );

        }

        

        //兼容老版本只有 idx 值的情况

        if([components count] > 4 && [(NSString *)[components objectAtIndex:3] isEqualToString:@"nick"])

        {

            //由于使用 url, 所以中文字符会被 encode 成另外格式的字符串 (%??)

            //所以需要 decode

//            name = [(NSString *)[components objectAtIndex:4] UTF8String];

            name = [[(NSString *)[components objectAtIndex:4] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding] UTF8String];

            CCLOG("========== name: %s", name);

        }

        

        

        //放在 cookie 保存之后, 因为 onQQLogin 执行完成后 FMUIWebViewBridge 对象就被 release 掉了

        mLayerWebView->onQQLogin( idx, name );

        return NO;

    }

    

    returnYES;

}

 

- (void) addCookiesToDisk:(NSString *)path withData:(NSMutableDictionary *)cookiesData {

    

    NSLog(@"========== addCookiesToDisk cookies: path: %@", path);

    DIR *pdir = opendir([path cStringUsingEncoding:NSUTF8StringEncoding]);

    if( !pdir) {

        mkdir([path cStringUsingEncoding:NSUTF8StringEncoding], S_IRWXU | S_IRWXG | S_IRWXO);

    }

    

    NSString *savePath = [path stringByAppendingString:[NSStringstringWithCString:COOKIES_FILEencoding:NSUTF8StringEncoding]];

    [NSKeyedArchiver archiveRootObject:cookiesData toFile:savePath];

    

}

 

- (NSMutableDictionary *) getCookiesFromDisk:(NSString *)path {

    DIR *pdir = opendir([path cStringUsingEncoding:NSUTF8StringEncoding]);

    if(!pdir) {

        NSLog(@"========== getCookiesFromDisk file don't exists");

        return nil;

    }

    else {

        NSLog(@"========== getCookiesFromDisk cookies: path: %@", path);

        NSString *savePath = [path stringByAppendingString:[NSStringstringWithCString:COOKIES_FILEencoding:NSUTF8StringEncoding]];

        return [NSKeyedUnarchiverunarchiveObjectWithFile:savePath];

    }

}

 

@end

posted on 2014-06-05 12:56  the seal  阅读(483)  评论(0编辑  收藏  举报