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

时间: 2024-10-12 16:57:49

ios内嵌浏览器cookie保存的相关文章

cocos2d-x调用android内嵌浏览器打开网页

cocos2d-x调用android内嵌浏览器打开网页,可以从入口传入网址,C++调用android 的api即可实现.方法也很简单 1. 修改"cocos2dx\platform\win32"下的CCApplication.h和CCApplication.cpp,添加函数 头文件声明 void openURL(const char* pszUrl); cpp文件实现: void CCApplication::openURL(const char* pszUrl) { ShellExe

android之在view中内嵌浏览器的方法

我要做的一个东西是在一个页面的中间嵌入浏览器,一开始不知道从哪里开始,因为以前用的都是Textveiw或者editVeiw之类的控件,而它们并不能用来显示网页的内容,怎么办呢? 首先想到的是:是不是有一个用来显示网页的View呢,于是我就在eclipse里xml编辑器里输入<web,哈哈,果然下面有个提示是webVeiw,那么能不能用它呢?于是到网上搜一下它的资料,果然可以的,下面就开始吧. 先在xml里把webview建好,在代码里用findViewById()将其取出来.我的代码是: Web

Jcef内嵌浏览器windows版本的编译及使用

背景 去年年底接到的新需求,需要将原来用Swing做的桌面应用中的一个功能做成Web版的,并且要集成到原应用中,换言之就是要使用内嵌浏览器.最开始考虑的是JavaFx提供的WebView,优点是不需要其他第三方库,jdk1.7开始集成.但是开发完成之后发现两个比较严重的问题,一是界面有一个比较复杂的曲线图会严重卡顿,另一个是有几率会导致虚拟机崩溃,并且速度上也不是很让人满意.最后只能考虑换一个内嵌浏览器框架,然后就找到jcef,基于chrome,速度兼容性都很好. 关于jcef就不多作介绍,不了

iOS 内嵌 View 的响应

遇到一个问题就是我有一个 UITextField,点击后不能编辑而是会显示一个自定义的 dialog. 但发现问题是,UITextField 的对点击事件的反应非常吃顿,有时候好使有时候不好使. 后来发现原因是,UITextField 我放在了一个 UIScrollView 里.而 UIScrollView 似乎会使内嵌的 View 反应变迟钝. 解决办法:对 UIScrollView 调用一个方法 aScrollView.delaysContentTouches = NO;

Mindmanager内嵌浏览器无法编辑超链接的Office文档

适用于: MindManager 8 症状:当打开超链接的 Office 文档时,例如 Excel, Word 或者 PowerPoint 时, 用户试图编辑文本, 该文件显示 一个警告信息提示:该文件是只读文件.用户没有修改该文件的权限. 下列信息显示: Microsoft Excel: 表格中的格子或者表格被保护并且提示是只读的. Microsoft Word: 这个文档被保护,不被无意识做出的编辑改变. (会询问 password 来解锁). Microsoft PowerPoint: 该

微信内嵌浏览器如何直接打开外部浏览器下载APP(APK)

想必大家会经常碰到网页链接在微信内无法打开和微信内无法打开app下载页的情况.通常这种情况微信会给个提示 “已停止访问该网址” ,那么导致这个情况的因素有哪些呢,主要有以下四点 1.网页链接被举报次数过多.2.网页含违规内容,含敏感词.3.被腾讯检测系统判断为诱导分享内容.4.转发分享次数达上限 那么上述问题怎么办呢?只要我们实现微信跳转浏览器的功能即可. 功能目的 生成微信跳转链接,实现微信内置浏览器跳转外部浏览器打开网页. 功能效果 对网页所属的PHP代码进行相关处理,加入跳转接口即可实现.

解决微信内嵌浏览器无法响应上传文件(图片)的思路(2种办法)

进园一年多来,第一次写博客,好激动.原因主要是自己平时都是有写笔记,不习惯写博客,这次想写博客的原因是,这个问题确实我做了很久,已经做了近两周才解决了这个问题,,而且两周时间里尝试过了很多种办法,然后由于网上又没有多少人分享这个,决定自己写一下. 先自我介绍下,我是惠州学院大二(准大三)的学生,在去年暑假时候加了一个工作室开始写代码,也是在那个时候加入博客园,最近因为工作室要做微信端网页的开发需要一个上传图片功能,然后编码的时候发现用平时的方法做的上传功能在Android的微信端上实现不了,百度

Atitit java集成内嵌浏览器与外嵌浏览器attilax总结

HTML5将颠覆原生App世界.这听起来有点危言耸听,但若认真分析HTML5的发展史,你会发现,这个世界的发展趋势确实就是这样. 熟知历史才能预知未来,先让我们来看看HTML5为什么诞生.这8年是怎么过来的. HTML5的诞生 自W3C于1999年发布HTML4后,Web世界快速发展,一片繁荣.人们一度认为HTML标准不需要升级了.一些致力于发展Web App的公司另行成立了WHATWG组织,直到2007年,W3C从WHATWG接手相关工作,重新开始发展HTML5 ###overview Swi

微信内嵌浏览器自动打开手机系统浏览器(手机默认浏览器)

最近在做一个项目,有一项功能是从微信中的分享页或者产品推广页面中下载app:在微信中直接下载app时微信是"拒绝"的,所以一般的做法是点击下载按钮弹出遮罩层,提示在浏览器中打开,然后进入外部浏览器,再次点击下载按钮进行下载,这种做法虽然能够实现下载的功能,但是这么长的操作非常容易导致潜在用户的流失. 那么最好的方法当然是在微信中点击下载按钮就能进入下载页(android可以跳至手机浏览器下载,ios则直接打开appstore). 这个技术似乎有些产品已经实现了,实现方式: 月牙跳转是一