基于Swift语言开发微信、QQ和微博的SSO授权登录代码分析
发布时间:2020-12-14 01:54:10 所属栏目:百科 来源:网络整理
导读:一,总体架构 1,引入第三方库 除了必须引入对应的登录SDK外,额外引入了SDWebImage,SVProgressHUD,看名字大家都明白吧,引入登录SDK请各自看官方的开发文档,需要加入什么系统库文件,需要配置Other Linker Flags 等,请参考各自官方文档即可; 2,配置连
一,总体架构1,引入第三方库除了必须引入对应的登录SDK外,额外引入了SDWebImage,SVProgressHUD,看名字大家都明白吧,引入登录SDK请各自看官方的开发文档,需要加入什么系统库文件,需要配置Other Linker Flags 等,请参考各自官方文档即可; 2,配置连接桥文件因为创建的工程是基于Swift语言,目前官方SDK和其它三方库都是用OC写的,所以为了在swift中调用oc代码,需要配置连接桥文件Bridging-Header.h,搜索objective-C bridging Header健,然后在值里面输入XXXLogin/Bridging-Header.h,注意是绝对路径,里面可以输入需要调用的头文件,如 #import "WXApi.h" #import "SVProgressHUD.h" #import "UIImageView+WebCache.h" 3,配置工程因为是SSO跳转方式,需要配置URL Schemes,以便程序返回识别宿主程序,配置方法很简单,参考各自文档即可,在info里面可以可视化添加,各自的key值采用官方demo所提供; 二,微信1,注册func application(application: UIApplication,didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { // Override point for customization after application launch. //向微信注册 WXApi.registerApp(kWXAPP_ID) return true } 2,授权登录
3,回调
4,获取用户信息//微信回调通知,获取code 第二步 func onRecviceWX_CODE_Notification(notification:NSNotification) { SVProgressHUD.showSuccessWithStatus("获取到code",duration: 1) var userinfoDic : Dictionary = notification.userInfo! let code: String = userinfoDic["code"] as! String println("Recevice Code: (code)") self.getAccess_token(code) } //获取token 第三步 func getAccess_token(code :String){ //https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code var requestUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=(kWXAPP_ID)&secret=(kWXAPP_SECRET)&code=(code)&grant_type=authorization_code" dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),{ var requestURL: NSURL = NSURL(string: requestUrl)! var data = NSData(contentsOfURL: requestURL,options: NSDataReadingOptions(),error: nil) dispatch_async(dispatch_get_main_queue(),{ var jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(data!,options: NSJSONReadingOptions.MutableContainers,error: nil) as! NSDictionary println("Recevice Token: (jsonResult)") SVProgressHUD.showSuccessWithStatus("获取到Token和openid",duration: 1) let token: String = jsonResult["access_token"] as! String let openid: String = jsonResult["openid"] as! String self.getUserInfo(token,openid: openid) }) }) } //获取用户信息 第四步 func getUserInfo(token :String,openid:String){ // https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID var requestUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=(token)&openid=(openid)" dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,{ var requestURL: NSURL = NSURL(string: requestUrl)! var data = NSData(contentsOfURL: requestURL,error: nil) as! NSDictionary println("Recevice UserInfo: (jsonResult)") /* Recevice UserInfo: { city = Chaoyang; country = CN; headimgurl = "http://wx.qlogo.cn/mmopen/FrdAUicrPIibcpGzxuD0kjfssQogj3icL8QTJQYUCLpgzSnvY6rJFGORreicPUiaPCzojwNlsXq4ibbc8e3gGFricWqJU5ia7ibicLVhfT/0"; language = "zh_CN"; nickname = "U706bU9505U6599"; openid = "oyAaTjkR8T6kcKWyA4VPYDa_Wy_w"; privilege = ( ); province = Beijing; sex = 1; unionid = "o1A_Bjg52MglJiEjhLmB8SyYfZIY"; } */ SVProgressHUD.showSuccessWithStatus("获取到用户信息",duration: 1) let headimgurl: String = jsonResult["headimgurl"] as! String let nickname: String = jsonResult["nickname"] as! String self.headerImg.sd_setImageWithURL(NSURL(string: headimgurl)) self.nicknameLbl.text = nickname }) }) } 5,跳转//微信的跳转回调 func application(application: UIApplication,openURL url: NSURL,sourceApplication: String?,annotation: AnyObject?) -> Bool { return WXApi.handleOpenURL(url,delegate: self) } func application(application: UIApplication,handleOpenURL url: NSURL) -> Bool { return WXApi.handleOpenURL(url,delegate: self) } 三,QQ1,注册func sendBtnClick(sneder:UIButton) { sendQQAuthRequest() } //第一步 QQ登录 func sendQQAuthRequest(){ tencentOAuth = TencentOAuth(appId: kQQAPP_ID,andDelegate: self) var permissions = [kOPEN_PERMISSION_GET_INFO,kOPEN_PERMISSION_GET_USER_INFO,kOPEN_PERMISSION_GET_SIMPLE_USER_INFO] tencentOAuth.authorize(permissions,inSafari: false) } 2,授权登录如上 3,回调//第二步 登录成功回调 func tencentDidLogin() { let accessToken = tencentOAuth.accessToken println("accessToken:(accessToken)") //641B23508B62392C52D6DFADF67FAA9C getUserInfo() } //失败 func tencentDidNotLogin(cancelled: Bool) { println("登录失败了") } //无网络 func tencentDidNotNetWork() { println("没有网络") } 4,获取用户信息//第三步 获取用户信息 func getUserInfo() { SVProgressHUD.showWithStatus("正在获取用户信息...") tencentOAuth.getUserInfo() } //第四步 在获取用户回调中获取用户信息 func getUserInfoResponse(response: APIResponse!) { SVProgressHUD.dismissWithSuccess("获取用户信息成功",afterDelay: 1) var dic:Dictionary = response.jsonResponse println("dic:(dic)") // [is_lost: 0,figureurl: http://qzapp.qlogo.cn/qzapp/222222/C5527A2F775D9EA7C20317128FAC202B/30,vip: 0,is_yellow_year_vip: 0,province: 北京,ret: 0,is_yellow_vip: 0,figureurl_qq_1: http://q.qlogo.cn/qqapp/222222/C5527A2F775D9EA7C20317128FAC202B/40,yellow_vip_level: 0,level: 0,figureurl_1: http://qzapp.qlogo.cn/qzapp/222222/C5527A2F775D9EA7C20317128FAC202B/50,city: 海淀,figureurl_2: http://qzapp.qlogo.cn/qzapp/222222/C5527A2F775D9EA7C20317128FAC202B/100,nickname: 竹中雨滴,msg:,gender: 男,figureurl_qq_2: http://q.qlogo.cn/qqapp/222222/C5527A2F775D9EA7C20317128FAC202B/100] refeshUserInfo(dic) } //第五步 刷新用户界面 func refeshUserInfo(dic : NSDictionary){ let headimgurl: String = dic["figureurl_qq_2"] as! String let nickname: String = dic["nickname"] as! String self.headerImg.sd_setImageWithURL(NSURL(string: headimgurl)) self.nicknameLbl.text = nickname } 5,跳转func application(application: UIApplication,annotation: AnyObject?) -> Bool { return TencentOAuth.HandleOpenURL(url) } func application(application: UIApplication,handleOpenURL url: NSURL) -> Bool { return TencentOAuth.HandleOpenURL(url) } 四,微博1,注册func application(application: UIApplication,didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { // Override point for customization after application launch. WeiboSDK.registerApp(kAppKey) return true } 2,授权登录func sendBtnClick(sneder:UIButton) { sendSinaAuthRequest() } //第一步 微博登录 func sendSinaAuthRequest(){ var request : WBAuthorizeRequest = WBAuthorizeRequest.request() as! WBAuthorizeRequest request.redirectURI = kRedirectURI request.scope = "all" request.userInfo = ["SSO_Key":"SSO_Value"] WeiboSDK.sendRequest(request) } 3,回调func didReceiveWeiboRequest(request: WBBaseRequest!) { } func didReceiveWeiboResponse(response: WBBaseResponse!) { if response.isKindOfClass(WBAuthorizeResponse){ if (response.statusCode == WeiboSDKResponseStatusCode.Success) { var authorizeResponse : WBAuthorizeResponse = response as! WBAuthorizeResponse var userID = authorizeResponse.userID var accessToken = authorizeResponse.accessToken println("userID:(userID)naccessToken:(accessToken)") var userInfo = response.userInfo as Dictionary NSNotificationCenter.defaultCenter().postNotificationName("SINA_CODE",userInfo: userInfo) } } } //第二步 通过通知得到登录后获取的用户信息 func onRecviceSINA_CODE_Notification(notification:NSNotification) { SVProgressHUD.showSuccessWithStatus("获取到用户信息",duration: 1) var userinfoDic : Dictionary = notification.userInfo! println("userInfo:(userinfoDic)") /* userID:2627289515 accessToken:2.002BqnrCyY87OC80500cab28Ofqd3B userInfo: [uid: 2627289515,remind_in: 647057,scope: invitation_write,refresh_token: 2.002BqnrCyY87OC10f7877765yPietB,app: { logo = "http://ww1.sinaimg.cn/square/65745bf7jw1ea399us692j2028028glf.jpg"; name = "SDKU5faeU535aU5e94U7528demo"; },access_token: 2.002BqnrCyY87OC80500cab28Ofqd3B,expires_in: 647057 ] */ var userAppInfo: Dictionary<String,String> = userinfoDic["app"] as! Dictionary refeshUserInfo(userAppInfo) } //第三步 刷新用户界面 func refeshUserInfo(dic : NSDictionary){ let headimgurl: String = dic["logo"] as! String let nickname: String = dic["name"] as! String self.headerImg.sd_setImageWithURL(NSURL(string: headimgurl)) self.nicknameLbl.text = nickname } 5,跳转
原文链接: http://www.52php.cn/article/p-odpjyttp-wc.html
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |