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