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