OAuth 授權(quán) ?和 SSO 授權(quán)區(qū)別:
OAuth 授權(quán) 是彈出一個(gè) 網(wǎng)頁(yè). ? ? ? ? ?
? ? ? ? ? ? ? 缺點(diǎn): 需要用戶輸入用戶名 和密碼 ,相對(duì)于SSO 不安全
? ? ? ? ? ? ?優(yōu)點(diǎn):(例如要分享到新浪 )用戶不需要按鈕新浪客戶端,只要有網(wǎng)頁(yè)就行.
SSO 授權(quán): (產(chǎn)品經(jīng)理最愛,用戶體驗(yàn)好) ?
? ? ? ? ? ? ? 缺點(diǎn): 需要用戶安裝了對(duì)應(yīng)的APP,并且需要提前在對(duì)應(yīng)的APP端是登錄狀態(tài)
? ? ? ? ? ? ?優(yōu)點(diǎn): 相對(duì)于OAuth授權(quán)安全,不需要在配置賬號(hào) 和 密碼.更加快捷. 深受廣大產(chǎn)品經(jīng)理喜歡,因?yàn)橛脩趔w驗(yàn)好.(當(dāng)沒有對(duì)應(yīng)客戶端,就會(huì)調(diào)用OAuth授權(quán),如果沒有設(shè)置OAuth授權(quán).就會(huì)授權(quán)失敗,分享失敗)
為了方便,我們給程序起個(gè)別名: ? ? ?微信應(yīng)用程序 叫做 WA. ? ? ?新聞應(yīng)用程序 ?叫做 XB
1> 現(xiàn)在新聞應(yīng)用程序 XB 想要跳轉(zhuǎn)到 WA 應(yīng)用程序里,進(jìn)行分享
? ? ? 我們需要在 WA 的 “工程”-> “info” ->”URL Types” -> URL Schemes :“weixin” ? (或者其他,讓別人跳轉(zhuǎn)的字符串).
? ? ? ? 這是一個(gè)協(xié)議:應(yīng)用之間的跳轉(zhuǎn)是通過協(xié)議來完成的. ?一般的有: http:// ? ?https:// ? ?ftp:// ?sms:// ? tel:// ?等等. ?
? ? ?這里其實(shí)也是一個(gè)協(xié)議,但是我們?cè)趚code里.xcode系統(tǒng)會(huì)我們?cè)O(shè)置了后面的:// ,我們只需要寫一個(gè) 自定義的字符串就行. ? ? ?
? ? 就好比我們?cè)跒g覽器里輸入一個(gè) www.baidu.com 也能跳轉(zhuǎn)到百度一樣.是瀏覽器內(nèi)部替我們?cè)谇懊嬖黾恿?http:// ?或者 https://
? ? ? 我們需要在 XB 程序里 進(jìn)行跳轉(zhuǎn),跳轉(zhuǎn)是應(yīng)用之間的跳轉(zhuǎn),我們應(yīng)改使用 應(yīng)用程序 單例對(duì)象,進(jìn)行操作對(duì)應(yīng)的事情.
在新聞程序 XB,設(shè)置:
//跳轉(zhuǎn)APP應(yīng)用,是需要遵守協(xié)議的.協(xié)議頭,是根據(jù)要跳轉(zhuǎn)到的應(yīng)用來寫的.
//跳轉(zhuǎn)APP應(yīng)用是應(yīng)用級(jí)別的跳轉(zhuǎn),需要用UIApplication來跳轉(zhuǎn)
//正常的邏輯判斷(方法一)
//蘋果在 ios9 的時(shí)候,對(duì)app安全又做了進(jìn)一步的提升,將http:// 協(xié)議,改為 https://協(xié)議,需要我們配置plist文件.ATS.你可以打開 info.plist文件,進(jìn)行添加 key 和 Value ,但是我一般都是 打開 info.plist ->右鍵 Open as ->Source Code -> 將下面代碼塊 賦值到 xml里進(jìn)行.
對(duì)應(yīng)的ATS :
注意: 在模擬測(cè)試的時(shí)候,需要同時(shí)打開 兩個(gè)應(yīng)用才能進(jìn)行測(cè)試.現(xiàn)象我們同時(shí)打開兩個(gè)應(yīng)用.在XB應(yīng)用點(diǎn)擊就能跳轉(zhuǎn)到WA了.
2 > 但是現(xiàn)在新的需求出現(xiàn)了.我們需要跳到 (分享到) 微信WA 不同的界面.例如 朋友列表session 或者說是 朋友圈 timeline
一個(gè)字改:
在 新聞XB 程序里 添加兩個(gè)按鈕,
//實(shí)現(xiàn)兩個(gè)按鈕的跳轉(zhuǎn)不同界面.但是怎么能實(shí)現(xiàn)跳轉(zhuǎn)不同界面呢? 首先要搞清楚這是誰(shuí)能 讓其跳轉(zhuǎn)到微信的不同的界面? 根據(jù)OC面向?qū)ο笏枷?誰(shuí)的事情誰(shuí)來干,當(dāng)然是微信跳轉(zhuǎn)到不同界面, 微信根據(jù)什么區(qū)分調(diào)到那個(gè)界面?需要外界(跳轉(zhuǎn)到微信的app)來傳遞參數(shù),然后根據(jù)傳遞的參數(shù)來跳轉(zhuǎn)不同的界面
//---->我們需要借助協(xié)議URL Schemes來傳遞參數(shù)
//跳到 微信 session
-(void)jumetoWeixinSessionBtnClick{
? ? ? if(![[UIApplicationsharedApplication]openURL:[NSURLURLWithString:@"weixin://session? abcdefg"]]){
? ? ?NSLog(@"不能跳轉(zhuǎn)到微信,請(qǐng)配置名稱和密碼");
? ?}
}
//跳轉(zhuǎn)到微信 timeline
-(void)jumetoWeixinTimelineBtnClick{
//這里和上面一樣的.
if(![[UIApplicationsharedApplication]openURL:[NSURLURLWithString:@"weixin://timeline?mmmmmmm"]]){
NSLog(@"請(qǐng)配置密碼等信息,不能跳轉(zhuǎn)到timeline界面");
? }
}
//在微信 WA 程序里.我們?cè)O(shè)置借助導(dǎo)航控制器,設(shè)置兩個(gè)子控制器.這里用 storyboard嵌入,這里就不贅述了.大致效果如下:上面是seeeion.下面是timeline,設(shè)置了跳轉(zhuǎn)不同的控制器的Segue 標(biāo)識(shí)為session 和 timeline 進(jìn)行跳轉(zhuǎn)時(shí)候的區(qū)分.
然后我們?cè)谖⑿诺?APPDelegate.m設(shè)置響應(yīng)的代碼來接受從 新聞XB App跳轉(zhuǎn)過來時(shí)候傳遞的參數(shù),然后我們根據(jù)參數(shù)來判斷到底跳到到那個(gè)控制器
- (BOOL)application:(UIApplication*)application handleOpenURL:(NSURL*)urlNS_DEPRECATED_IOS(2_0,9_0,"Please use application:openURL:options:")__TVOS_PROHIBITED;
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(nullableNSString *)sourceApplication annotation:(id)annotationNS_DEPRECATED_IOS(4_2,9_0,"Please use application:openURL:options:")__TVOS_PROHIBITED;
//上面兩個(gè)方法過期了所以我們用這個(gè)方法.這里接受從外界傳遞的URL Schemes.判斷跳轉(zhuǎn)到那個(gè)界面
//我現(xiàn)在就可以進(jìn)行跳轉(zhuǎn)到微信不同的界面 session 或者 是 timeline了
//但是出現(xiàn)了BUG;在新聞程序如果多次跳轉(zhuǎn) 微信.比如說跳轉(zhuǎn)了5次,那么在微信WA在返回的時(shí)候,就會(huì)連續(xù)返回5次之后,才能回到微信主界面
//解決BUG:因?yàn)?是利用導(dǎo)航控制器進(jìn)行跳轉(zhuǎn)的,所以就是一直 進(jìn)棧 push,沒有出棧pop. 所以我們的解決方法,就是在 跳轉(zhuǎn)到微信對(duì)應(yīng)的界面在跳轉(zhuǎn)到子控制器session或者timeline之前,先回到微信APP的主界面
我們修改 微信WA 的方法,增加下面的代碼
[navpopToRootViewControllerAnimated:NO];
3 > 新的需要: 我們需要在微信進(jìn)行分享后 直接跳回 對(duì)應(yīng)原來的App/例如本例中的 新聞XB程序
//思路分析:直接跳回怎么跳回?也能根據(jù) 新聞XB 跳轉(zhuǎn)到 微信 WA 一樣.我們直接在 微信WA里填寫
在 微信WA 里添加一個(gè)按鈕,在按鈕的點(diǎn)擊方法里這樣寫: (在跳轉(zhuǎn)過來的APP 設(shè)置 URL Schemes 為:xinwei)
if(![[UIApplicationsharedApplication]openURL:[NSURLURLWithString:@“xinwen”//"]]){
NSLog(@"不能回跳到原來的app,哪里出錯(cuò)了?檢查一下吧");
}
? ? ? ?//這樣是能跳回去,但是, app這么多,在微信段總不能對(duì)每一個(gè)app都寫一個(gè) scheme吧.這顯然也不顯示.那么我們?cè)撛趺崔k?既然其他應(yīng)用跳轉(zhuǎn)到 微信WA 是根據(jù) scheme 的,那么能不能規(guī)定,讓其根據(jù)一定的規(guī)范寫法,把跳轉(zhuǎn)回去的參數(shù)也寫進(jìn) scheme里傳遞過來. 那么我們?cè)趶?新聞XB app跳轉(zhuǎn)到 微信WA 的時(shí)候,就不能寫死,需要我們從 bundl額里去取.
//那么我們修改 新聞XB 里代碼
//跳轉(zhuǎn)到timeline不變
//在微信 WA APP里寫直接跳會(huì)到原來 APP,本例中指 新聞XB 程序的設(shè)置.我們這里只寫一個(gè)跳回去的方法
//我的github賬號(hào),可以下載源碼,看一看. ?