第四天--OAuth2.0授權(quán)和自定義的對象的歸檔和解檔

前言:

今天主要實(shí)現(xiàn)OAuth2.0登錄和自定義的歸檔。用到的第三方和知識
1距帅、指示器 SVProgressHUD
2抖仅、網(wǎng)絡(luò)請求第三方Alamofire
3、OAuth2.0微博開放平臺
4咏窿、自定義對象的歸檔和解檔

首先看下實(shí)現(xiàn)的簡單效果

2.gif
1斟或、OAuth2.0授權(quán)的機(jī)制如下圖
B227337D-6229-4AAC-86F8-36648494A562.png

實(shí)現(xiàn)步驟
1、加載授權(quán)頁面(獲取code)
2集嵌、通過code后期accessToken
3萝挤、通過accessToken去獲取用戶的信息

采用webView來加載授權(quán)頁面

首先懶加載一個webView并遵守代理

//MARK:懶加載
lazy var webView:UIWebView = {

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

定義一些常量

   let ReBackURL:String = "https://api.weibo.com/oauth2/default.html" // 回調(diào)的URL

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

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

注意:這里需要成為新浪的開放者,并且新建自己的應(yīng)用根欧,才有上面的信息怜珍。我就不在這里詳細(xì)描述了。微博開放平臺

加載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主要下下面的代理方法中實(shí)現(xiàn),攔截URL

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

    
    let urlString:String = request.URL!.absoluteString
    
    if !urlString.hasPrefix(ReBackURL) {
        
        //如果不是回調(diào)Url就繼續(xù)加載
        return true
    }
    
    // 判斷是否授權(quán)成功
    let parameterStr = "code="
    if request.URL!.query!.hasPrefix(parameterStr) {
        
        //授權(quán)成功,取出code的參數(shù)用于
        print(request.URL!.query!)
    
        let code = request.URL!.query!.substringFromIndex(parameterStr.endIndex)
        
        // 獲取accessToken
        
        requestAccessToken(code)
        
        
        
    }
    else {
    
        navigationController?.popViewControllerAnimated(true)
    }
    
    
    return false
}

獲取accessToken的方法實(shí)現(xiàn)如下

private func requestAccessToken(code:String){

    //
    let accessTokenPath = "https://api.weibo.com/oauth2/access_token"
    
    // 參數(shù)
    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數(shù)據(jù)嫌拣,我們自定義一個Model去解析柔袁,并保存到本地。

定義的模型YJUserAccount

class YJUserAccount: NSObject,NSCoding

要對自定義的對象實(shí)現(xiàn)歸檔和解檔异逐,需要遵守NSCoding協(xié)議并實(shí)現(xiàn)下面的兩個方法

 //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")
    
}

另外一注意一點(diǎn)就是字典轉(zhuǎn)模型的捶索,有些字沒有,會出現(xiàn)崩潰的情況灰瞻,可以改下下面的方法情组,就不會崩潰了。

//為了不讓其崩潰箩祥,重寫該
override func setValue(value: AnyObject?, forUndefinedKey key: String) {
    
}

歸檔和解檔方法實(shí)現(xiàn)

// 歸檔
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
    
    }

上面就是簡單的實(shí)現(xiàn)思路院崇。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市袍祖,隨后出現(xiàn)的幾起案子底瓣,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捐凭,死亡現(xiàn)場離奇詭異拨扶,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)茁肠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門患民,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人垦梆,你說我怎么就攤上這事匹颤。” “怎么了托猩?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵印蓖,是天一觀的道長。 經(jīng)常有香客問我京腥,道長赦肃,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任公浪,我火速辦了婚禮他宛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘欠气。我一直安慰自己堕汞,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布晃琳。 她就那樣靜靜地躺著讯检,像睡著了一般。 火紅的嫁衣襯著肌膚如雪卫旱。 梳的紋絲不亂的頭發(fā)上人灼,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天,我揣著相機(jī)與錄音顾翼,去河邊找鬼投放。 笑死,一個胖子當(dāng)著我的面吹牛适贸,可吹牛的內(nèi)容都是我干的灸芳。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼拜姿,長吁一口氣:“原來是場噩夢啊……” “哼烙样!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蕊肥,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤谒获,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體批狱,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡裸准,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了赔硫。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炒俱。...
    茶點(diǎn)故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖爪膊,靈堂內(nèi)的尸體忽然破棺而出权悟,到底是詐尸還是另有隱情,我是刑警寧澤惊完,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布僵芹,位于F島的核電站处硬,受9級特大地震影響小槐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜荷辕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一凿跳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧疮方,春花似錦控嗜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至惫谤,卻和暖如春壁顶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背溜歪。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工若专, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蝴猪。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓调衰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親自阱。 傳聞我的和親對象是個殘疾皇子嚎莉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)沛豌,斷路器萝喘,智...
    卡卡羅2017閱讀 134,628評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,732評論 25 707
  • 轉(zhuǎn)載自:http://www.mamicode.com/info-detail-957988.html 1、iOS...
    哆啦_閱讀 2,249評論 0 2
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件阁簸、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,058評論 4 62
  • 1:前幾天媽咪給我100萬日元爬早,我想著算上上學(xué)期剩的錢應(yīng)該夠了。結(jié)果昨天和朋友聊天启妹,她說留學(xué)生有減免筛严,學(xué)費(fèi)才20萬...
    貓公主喵閱讀 194評論 0 1