之前我们在自己的程序中使用新浪微博进行分享时,在没有服务器的情况下,(单机版应用通常都没有服务器), 需要在加入新浪微博SDK才能进行, 虽然各个分享SDK已经做得比较完善,但是使用起来门槛还是挺高的。 使用SDK的好处就在于支持SSO。
如果你的应用不需要使用SSO的情况下,且有服务器的支持情况下, 则可以使用webview的方式登陆, 这样来说对客户端的工作量会大大减少。
下面主要描述两种方式来进行webview的方式登陆
方式一:
客户端先发送一个request 向自己的服务器,去请求uiwebview即将加载的url地址,发起的请求类似:
http://xxx.com/staging/client/connect/loginrequest?name=sina&app=movie&client=iphone&apiver=2.0.0&version=3.0.1&udid=8e7c7936e4b066d7d49b7e7e785a77ac&userid=-1&channel=com_dot_apple&loc=MTE2LjQ3MDc0MSwzOS45NjA4MDg=&width=640&height=960&openudid=69eb80bdc32e35f919557712449ac11298347eef&systemversion=6.0&gzip=0
https://api.weibo.com/oauth2/authorize?client_id=4087175723&redirect_uri=http://xxx.com/staging/client/connect/loginconfirm/sina?udid=8e7c7936e4b066d7d49b7e7e785a77ac&apiver=2.0.0&client=iphone&channel=com_dot_apple&width=640&height=960&systemversion=6.0&loc=MTE2LjQ3MDc0MSwzOS45NjA4MDg=&version=3.0.1&response_type=code&display=mobile
然后在这个登陆的UIViewController中实现UIWebView的回调方法,
- (void)webViewDidFinishLoad:(UIWebView *)webView{},
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {}
当然,这里客户端的这个webview就会显示出新浪微博的登陆界面,让用户输入用户名和密码,用户输入完成后,
UIWebView会自动进行跳转, 先转向https://api.weibo.com/oauth2/authorize,
然后再 向:
http://xxx.com/staging/client/connect/loginconfirm/sina?udid=8e7c7936e4b066d7d49b7e7e785a77ac&code=5b0d59aa2d90c17d58bda3287333a4e0
然后在我们实现的
webView: shouldStartLoadWithRequest方法中,可以对上面这个url进行解析,当其中出现了code,即是我们所要的东东,客户端把这个code拿到后,通过同步或者异步上传到自己的服务器上, (因为当前的位置是在webview的回调方法中,所以使用同步调用更好一点),通常我们可以直接把上面的这个url直接用httprequest到自己的服务器上。然后服务器会去向新浪微博服务器进行确认,确认完成后, 会有回复的数据显示用户登陆成功还是失败。
用户就完成了登陆的过程。
方式二:上面这种使得客户端还是需要做一些编程,并且因为使用了一些同步的调用,使得客户端服务器都在等着,为解决上面的情况,所以有下面这种更加方便的方式。
客户端启动一个uiwebview来向服务器发起请求,这个url是事先和自己服务器商量好的一下url,如
http://xxx.com/staging/client/connect/loginrequest?name=sina&app=movie&client=iphone&apiver=2.0.0&version=3.0.1&udid=8e7c7936e4b066d7d49b7e7e785a77ac&userid=-1&channel=com_dot_apple&loc=MTE2LjQ3MDc0MSwzOS45NjA4MDg=&width=640&height=960&openudid=69eb80bdc32e35f919557712449ac11298347eef&systemversion=6.0&gzip=0
这个url到服务器后, 服务器直接使这个url进行重定向到新浪微博服务器, 这时webview会因为重定向到api.weibo.com/xxxx, 而显示给用户一个登陆界面, 用户在这个界面中输入用户名和密码, 新浪收到这个用户的数据后,会看用户是否是微博用户,如果是, 则新浪微博继续使用这个webview进行转向,转到自己的服务器,并带上用户的tokenid, 自己的服务器收到这个后,再通过webview的重定向带上用户在自己服务器上的信息进行转向, 而这个时候的转向其实已经没有意义,只是想通过这个重定向把数据让客户端获取。
客户端由于实现了方法
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {}
所以客户端能收到服务器回来的数据,然后判定出自己登陆成功,判断成功后,在shouldStartLoadWithRequest中返回NO,使这个webview不再继续加载,然后提示给用户。
分析上面两种情况的区别,实际上是在于服务器,如果服务器做的事情较多,就像第二种情况一样,客户端就可以减少逻辑复杂度。 若服务器做的事情少,则需要像第一种方式那样,客户端做的事情就多。