上星期项目其中的一个模块在微信开发中做过一次了,经理说直接从微信端移植到app就可以了,于是涉及到了WebView展示微信网页的知识。大家应该都清楚webview展示网页的一些基本知识。以前也做过Android中的混合开发。但是这次和以前不太一样,需要在进入模块前通过微信授权拿到用户的UserId。接着需要我们调用接口登录,拿到Cookies。以后每个页面都需要携带登录时返回的Cookies。
于是根据这个流程去查阅了一些ios的资料,最终找到了它:NSHttpCookieStorage,NSHttpCookieStorage是单例的,可以根据域名来保存请求头部的信息。
接下来通过代码看一下,基本的流程。
微信授权就不说了,从拿到userId开始:
//下面这部分代码是当我们微信授权之后拿到了用户的OpenId后,
//调用接口去帮助用户登录我们自己的后台系统
var iServiceClient = new RestClient("http://登录接口域名/");
var request = new RestRequest("登录接口", Method.GET);
request.RequestFormat = DataFormat.Json;
request.AddQueryParameter("UserId", "XXXX");
var authResponse = iServiceClient.Get<AuthenticateResponse>(request);
if (authResponse != null && authResponse.Cookies.Count > 0)
{
//set cookies
List<NSHttpCookie> cookies = new List<NSHttpCookie>();
string path = string.Empty;
string domain = string.Empty;
//循环保存登录时返回正常的几个cookies
foreach (var sessionCookie in authResponse.Cookies)
{
NSHttpCookieStorage.SharedStorage.AcceptPolicy = NSHttpCookieAcceptPolicy.Always;
var cookieDict = new NSMutableDictionary();
cookieDict.Add(NSHttpCookie.KeyName, new NSString(sessionCookie.Name));
cookieDict.Add(NSHttpCookie.KeyValue, new NSString(sessionCookie.Value));
cookieDict.Add(NSHttpCookie.KeyPath, new NSString(sessionCookie.Path));
cookieDict.Add(NSHttpCookie.KeyDomain, new NSString(sessionCookie.Domain));
path = sessionCookie.Path;
domain = sessionCookie.Domain;
cookies.Add(new NSHttpCookie(cookieDict));
}
//将cookie设置到单例的网页请求中
NSHttpCookieStorage.SharedStorage.SetCookies(cookies.ToArray(),
new NSUrl("http://域名/"),
new NSUrl("http://域名/"));
}
设置完成之后在本界面或者其他界面调用时,只要是"http://登录接口域名/",
同一域名下的webview的NSMutableUrlRequest请求的头部都会携带刚才登录后获得的cookies了。
NSUrl path = new NSUrl("http://刚才的域名/登陆之后你要操作的网址");
NSMutableUrlRequest request = new NSMutableUrlRequest();
request.Url = path;
_webView.LoadRequest(request);
_webView.ScalesPageToFit = false;
_webView.ContentMode = UIViewContentMode.ScaleAspectFit;
_webView.BackgroundColor = MvxTouchColor.BackGray;
_webView.DataDetectorTypes = UIDataDetectorType.All;
如上面所示,这时你请求的这个域名下的网址都会携带登录之后保存的cookies信息。
如果不需要了还可以将cookies清除掉。
其实现在看看真的好简单,但是上周有两天的时间挂在这上面了,导致周末加班。
最终原因是在下面的网络请求时,和后台没有沟通好,除了cookie外还有一些数据没有传入。(蛋碎了一地啊!!!!)
希望大家一定吸取教训,不同工种协同好作业,否则太伤身了。
可能是对iOS一些平台的知识还不够了解,好多知识都是查iOS原生的解决方案,对着c代码去改c#(蛋好疼)。
因为现在项目比较紧张,目前的状态是拿到需求,根据需求去查阅资料。等闲下来了还是要主动去看看iOS平台相关的知识。
发现Xamarin开发方式还是非常接近的,基本上都是在调用原生的API,所以他的性能要比h5要高的多吧。