第四天--OAuth2.0授权和自定义的对象的归档和解档

前言:

今天主要实现OAuth2.0登录和自定义的归档。用到的第三方和知识
1、指示器 SVProgressHUD
2、网络请求第三方Alamofire
3、OAuth2.0微博开放平台
4、自定义对象的归档和解档

首先看下实现的简单效果

2.gif
1、OAuth2.0授权的机制如下图
B227337D-6229-4AAC-86F8-36648494A562.png

实现步骤
1、加载授权页面(获取code)
2、通过code后期accessToken
3、通过accessToken去获取用户的信息

采用webView来加载授权页面

首先懒加载一个webView并遵守代理

//MARK:懒加载
lazy var webView:UIWebView = {

   
    let webView = UIWebView()
    
    
    
    webView.delegate = self
    
    return webView
}()

定义一些常量

   let ReBackURL:String = "https://api.weibo.com/oauth2/default.html" // 回调的URL

let AppKey:String = "2100191772" // 程序appkey

let AppSecret:String = "20701cb27e6279060eae21c1a7522f8c" // APPSecret

注意:这里需要成为新浪的开放者,并且新建自己的应用,才有上面的信息。我就不在这里详细描述了。微博开放平台

加载web view

   let urlString = "https://api.weibo.com/oauth2/authorize?client_id=\(AppKey)&redirect_uri=\(ReBackURL)";
    
    let url = NSURL(string: urlString)
    
    let request = NSURLRequest(URL: url!)
    
    webView.loadRequest(request)

获取和获取accessToken主要下下面的代理方法中实现,拦截URL

func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {

    
    let urlString:String = request.URL!.absoluteString
    
    if !urlString.hasPrefix(ReBackURL) {
        
        //如果不是回调Url就继续加载
        return true
    }
    
    // 判断是否授权成功
    let parameterStr = "code="
    if request.URL!.query!.hasPrefix(parameterStr) {
        
        //授权成功,取出code的参数用于
        print(request.URL!.query!)
    
        let code = request.URL!.query!.substringFromIndex(parameterStr.endIndex)
        
        // 获取accessToken
        
        requestAccessToken(code)
        
        
        
    }
    else {
    
        navigationController?.popViewControllerAnimated(true)
    }
    
    
    return false
}

获取accessToken的方法实现如下

private func requestAccessToken(code:String){

    //
    let accessTokenPath = "https://api.weibo.com/oauth2/access_token"
    
    // 参数
    let params = ["client_id":AppKey,"client_secret":AppSecret,"grant_type":"authorization_code","code":code,"redirect_uri":ReBackURL]
    
    
    Alamofire.request(.POST, accessTokenPath, parameters: params, encoding: .URL, headers: nil).responseJSON { (response) in
        
        print(response.request)
        
        print(response.response)
        
        print(response.data)
        
        print(response.result)
        
        if let json = response.result.value {
        
            print("json\(json)")
            
            let userAccount = YJUserAccount(dict: json as![String:AnyObject])
            
            print(userAccount.access_token)
            userAccount.loginSuccess = true
            
            userAccount.savaAccount()
            
            //获取accessToken成功,证明登录成功了
            let base = YJBaseTabBarViewController()
            base.selectedIndex = 1
            
            UIApplication.sharedApplication().keyWindow?.rootViewController = base
            
            SVProgressHUD.showInfoWithStatus("登录成功")
            
        }
        
        
    }
}

通过上一步的code,去换取accessToken,请求成功后返回JSON数据,我们自定义一个Model去解析,并保存到本地。

定义的模型YJUserAccount

class YJUserAccount: NSObject,NSCoding

要对自定义的对象实现归档和解档,需要遵守NSCoding协议并实现下面的两个方法

 //MARK:NSCoding
func encodeWithCoder(aCoder: NSCoder) {
    
    /*  var access_token:String?  // 令牌
     var expires_in:NSNumber?  //  过期时间戳
     var uid: NSNumber? // 用户ID
     var loginSuccess:Bool = false // 是否登录成功*/
    
    aCoder.encodeObject(access_token, forKey: "access_token")
    aCoder.encodeObject(expires_in, forKey: "expires_in")
    aCoder.encodeObject(uid, forKey: "uid")
    aCoder.encodeBool(loginSuccess, forKey: "loginSuccess")
    
    
}

required init?(coder aDecoder: NSCoder) {
    
   access_token = aDecoder.decodeObjectForKey("access_token") as? String
   expires_in =  aDecoder.decodeObjectForKey("expires_in") as? NSNumber
   uid =  aDecoder.decodeObjectForKey("uid") as? NSNumber
   loginSuccess =  aDecoder.decodeBoolForKey("loginSuccess")
    
}

另外一注意一点就是字典转模型的,有些字没有,会出现崩溃的情况,可以改下下面的方法,就不会崩溃了。

//为了不让其崩溃,重写该
override func setValue(value: AnyObject?, forUndefinedKey key: String) {
    
}

归档和解档方法实现

// 归档
internal func savaAccount()   {

    let path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).last
    
    if let savePath = path {
    
        let archievePath = savePath.stringByAppendingString("/account.plist")
        
        print(archievePath)
        
       if  NSKeyedArchiver.archiveRootObject(self, toFile: archievePath)
       {
        
        print("归档成功")
        }
        
    }
    
    
  
}

// 解档
internal class func loadAccount() -> YJUserAccount? {
    let path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).last
    
    
        
    let archievePath = path!.stringByAppendingString("/account.plist")
        
    let userAccoutn = NSKeyedUnarchiver.unarchiveObjectWithFile(archievePath) as? YJUserAccount
    return userAccoutn
    
    }

上面就是简单的实现思路。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,596评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,451评论 25 707
  • 转载自:http://www.mamicode.com/info-detail-957988.html 1、iOS...
    哆啦_阅读 2,233评论 0 2
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,019评论 4 62
  • 1:前几天妈咪给我100万日元,我想着算上上学期剩的钱应该够了。结果昨天和朋友聊天,她说留学生有减免,学费才20万...
    猫公主喵阅读 190评论 0 1