iOS第三方登錄及分享入門指南 —— 微信(二)

導語:

完成原生QQ的SDK集成后,接下來就是微信的了座舍,這兩家的SDK我懷疑是同個人寫的,如此相像,雖不難贬养,但還是有一些坑需要注意团驱。

微信 SDK官方文檔

實現(xiàn)微信登錄

一挣输、準備工作

  1. 微信·開放平臺,注冊成為開發(fā)者疮薇。
  2. 創(chuàng)建應用,申請你的AppIDAppSecret我注。

二按咒、集成SDK

下載好完整包,如圖導入工程需要的文件但骨。

微信SDK.png

三励七、配置工程

1. 添加SDK依賴的系統(tǒng)庫文件

SystemConfiguration.framework
Security.framework
CFNetwork.framework
CoreTelephony.framework
libsqlite3.0.tbd
libstdc++.tbd
libz.tbd
libc++.tbd

2. 修改必要的工程配置屬性

在工程配置中的Build Settings一欄中找到Linking配置區(qū),給Other Linker Flags配置項添加屬性值-Objc奔缠、-all_load

配置工程.png
3. 修改Info.plist文件

在XCode中掠抬,選中TARGETS一欄,在Info標簽欄中找到URL Types,添加一條新的URL scheme校哎。(必須填寫

Identifier: wexin
URL Schemes: wx + "appid"

想要實現(xiàn)應用間跳轉两波,而不是打開一個登陸網(wǎng)頁,在Info.plist中添加LSApplicationQueriesSchemes

<key>LSApplicationQueriesSchemes</key>
<array>
<string>wechat</string>
<string>weixin</string>
</array>

四闷哆、代碼實現(xiàn)

1.AppDelegate

在AppDelegate中添加頭文件腰奋,并重寫AppDelegate的handleOpenURLopenURL方法

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    [WXApi registerApp:@"appid"];
    return YES;
}
  • iOS9之前,分別重寫handleOpenURL && openURL方法

      //handleOpenURL(ios10已棄用)
      NS_DEPRECATED_IOS(2_0, 9_0, "Please use application:openURL:options:")
      - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{
          return [WXApi handleOpenURL:url delegate:self];
    
      }
         
      //openURL(iOS10已棄用)
      NS_DEPRECATED_IOS(4_2, 9_0, "Please use application:openURL:options:")
      - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
          return [WXApi handleOpenURL:url delegate:self];
      }
    
  • iOS9之后抱怔,handleOpenURL && openURL 合成為同一個方法

      //handleOpenURL && openURL
      - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options{
          return [WXApi handleOpenURL:url delegate:self];
      }
    
2.實現(xiàn)代理方法
- (void)onReq:(BaseReq *)req{
    NSLog(@"wx onReq");
}
  
- (void)onResp:(BaseResp *)resp{
    NSLog(@"wx onResp");
    //登錄 分享 都走同一個回調
    if ([resp isKindOfClass:[SendAuthResp class]]) {
         SendAuthResp* authResp = (SendAuthResp *)resp;
        [self loginResponse:authResp];
    }
}
  
- (void)loginResponse:(SendAuthResp*)response{
     switch (response.errCode) {
         case WXSuccess:{
            [self getUserToken:response.code];
       }
            break;
         case WXErrCodeCommon:
            break;
         case WXErrCodeUserCancel:
            break;
         case WXErrCodeSentFail:
            break;
         case WXErrCodeAuthDeny:
            break;
         case WXErrCodeUnsupport:
            break;
    }
}
3.請求code劣坊,通過login點擊事件
-(void)sendAuthRequest{ 
    //構造SendAuthReq結構體 
    SendAuthReq* req =[[[SendAuthReq alloc ] init ] autorelease ];
    req.scope = @"snsapi_userinfo" ;
    req.state = @"123" ;
    //第三方向微信終端發(fā)送一個SendAuthReq消息結構
    [WXApi sendReq:req]; 
}
4.通過code獲取access_token
- (void)getUserToken:(NSString*)code{
     NSString* url = [NSString stringWithFormat:@"https://api.weixin.qq.com/sns/oauth2/access_token?appid=%@&secret=%@&code=%@&grant_type=authorization_code",WXAppID,WXSecret,code];
     //獲取第一步的code后,請求以下鏈接獲取access_token:
     
        { 
            "access_token":"ACCESS_TOKEN", 
            "expires_in":7200, 
            "refresh_token":"REFRESH_TOKEN",
            "openid":"OPENID", 
            "scope":"SCOPE",
            "unionid":"o6_bmasdasdsad6_2sgVt7hMZOPfL"
        }
     
     //將獲取到的userToken && openID 繼續(xù)網(wǎng)絡請求獲取userInfo
     [self getUserInfo:response[@"access_token"] openID:response[@"openid"]];
 }
參數(shù) 說明
access_token 接口調用憑證(有效期30天)
expires_in access_token接口調用憑證超時時間屈留,單位(秒)
refresh_token 用戶刷新access_token
openid 授權用戶唯一標識
scope 用戶授權的作用域局冰,使用逗號(,)分隔
unionid 當且僅當該移動應用已獲得該用戶的userinfo授權時,才會出現(xiàn)該字段
5.刷新access_token有效期

獲取第一步的code后灌危,請求以下鏈接進行refresh_token:

https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN
6.根據(jù)獲取到的userToken && openID 繼續(xù)網(wǎng)絡請求獲取userInfo
- (void)getUserInfo:(NSString*)token openID:(NSString*)openID{
    NSString* url = [NSString stringWithFormat:@"https://api.weixin.qq.com/sns/userinfo?access_token=%@&openid=%@",token,openID];
    
    //網(wǎng)絡請求 返回response包含UserInfo
 }

實現(xiàn)微信分享

步驟同上一康二、二、三

微信 SDK官方文檔

代碼實現(xiàn)

1.AppDelegate

設置分享支持類型

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    [WXApi registerApp:@"appid"];
    
    UInt64 typeFlag = MMAPP_SUPPORT_TEXT | MMAPP_SUPPORT_PICTURE |
                      MMAPP_SUPPORT_LOCATION | MMAPP_SUPPORT_VIDEO | 
                      MMAPP_SUPPORT_AUDIO | MMAPP_SUPPORT_WEBPAGE |
                      MMAPP_SUPPORT_DOC | MMAPP_SUPPORT_DOCX | 
                      MMAPP_SUPPORT_PPT | MMAPP_SUPPORT_PPTX | 
                      MMAPP_SUPPORT_XLS | MMAPP_SUPPORT_XLSX |
                      MMAPP_SUPPORT_PDF;
    
    [WXApi registerAppSupportContentFlag:typeFlag];
    
    return YES;
}
2.實現(xiàn)代理方法
- (void)onReq:(BaseReq *)req{
    NSLog(@"wx onReq");
}
  
- (void)onResp:(BaseResp *)resp{
    NSLog(@"wx onResp");
    //登錄 分享 都走同一個回調
    if ([resp isKindOfClass:[SendMessageToWXResp class]]) {
         SendMessageToWXResp* messageResp = (SendMessageToWXResp *)resp;
        [self shareResponse:messageResp];
    }
}
  
- (void)shareResponse:(SendAuthResp*)response{
     switch (response.errCode) {
         case WXSuccess:{
            //分享成功
       }
            break;
         case WXErrCodeCommon:
            break;
         case WXErrCodeUserCancel:
            break;
         case WXErrCodeSentFail:
            break;
         case WXErrCodeAuthDeny:
            break;
         case WXErrCodeUnsupport:
            break;
    }
}
3.分享示例

WXSceneSession 發(fā)送到聊天界面
WXSceneTimeline 發(fā)送到朋友圈
WXSceneFavorite 添加到微信收藏

  • 文字

      // 第三方程序發(fā)送消息至微信終端程序的消息結構體
      SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];
      req.text = @"分享的內(nèi)容";
      // 發(fā)送消息的類型乍狐,包括文本消息和多媒體消息兩種赠摇,兩者只能選擇其一,不能同時發(fā)送文本和多媒體消息
      req.bText = YES;
      req.scene = WXSceneTimeline;
      [WXApi sendReq:req];
    
  • 圖片

      WXMediaMessage *message = [WXMediaMessage message];
      [message setThumbImage:[UIImage imageNamed:@"圖片.png"]];
    
      WXImageObject *imageObject = [WXImageObject object];
      NSString *filePath = [[NSBundle mainBundle] pathForResource:@"res1" ofType:@"jpg"];
      // 圖片真實數(shù)據(jù)內(nèi)容
      imageObject.imageData = [NSData dataWithContentsOfFile:filePath];
      message.mediaObject = imageObject;
      
      SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];
      req.bText = NO;
      req.message = message;
      req.scene = WXSceneTimeline;// 分享到朋友圈
      [WXApi sendReq:req];
    
  • 音樂

      WXMediaMessage *message = [WXMediaMessage message];
      message.title = @"音樂標題";
      message.description = @"音樂描述";
      [message setThumbImage:[UIImage imageNamed:@"縮略圖.jpg"]];
      
      WXMusicObject *musicObject = [WXMusicObject object];
      musicObject.musicUrl = @"音樂url";
      musicObject.musicLowBandDataUrl = @"音樂lowband數(shù)據(jù)url地址";
      musicObject.musicDataUrl = @"音樂數(shù)據(jù)url";
      musicObject.musicLowBandDataUrl = @"音樂lowband數(shù)據(jù)url地址";
      message.mediaObject = musicObject;
      
      SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];
      req.bText = NO;
      req.message = message;
      req.scene = WXSceneTimeline;
      [WXApi sendReq:req];
    
  • 網(wǎng)頁

      WXMediaMessage *message = [WXMediaMessage message];
      message.title = @"標題";
      message.description = @"描述";
      [message setThumbImage:[UIImage imageNamed:@"res2.png"]];
      
      WXWebpageObject *webpageObject = [WXWebpageObject object];
      webpageObject.webpageUrl = @"https://opne.weixin.qq.com";
      message.mediaObject = webpageObject;
      
      SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];
      req.bText = NO;
      req.message = message;
      req.scene = WXSceneTimeline;
      [WXApi sendReq:req];
    

結束語

  • 如果同時集成QQ SDK和微信 SDK浅蚪,需要注意兩者的回調方法會沖突藕帜。解決辦法可以分別創(chuàng)建對應的管理類來管理代理方法。

     -(void)onReq:(BaseReq *)req;
     -(void)onResp:(BaseResp *)resp;
    
  • 微信登錄和分享的回調方法為同一個

  • 純文字分享可以跳轉惜傲,其他類型無法跳轉時洽故,請注意縮略圖(thumbImage)大小是否超過32kb (重要

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市盗誊,隨后出現(xiàn)的幾起案子时甚,更是在濱河造成了極大的恐慌隘弊,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件荒适,死亡現(xiàn)場離奇詭異梨熙,居然都是意外死亡,警方通過查閱死者的電腦和手機刀诬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門咽扇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人陕壹,你說我怎么就攤上這事质欲。” “怎么了糠馆?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵嘶伟,是天一觀的道長。 經(jīng)常有香客問我又碌,道長九昧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任赠橙,我火速辦了婚禮耽装,結果婚禮上,老公的妹妹穿的比我還像新娘期揪。我一直安慰自己掉奄,他們只是感情好,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布凤薛。 她就那樣靜靜地躺著姓建,像睡著了一般。 火紅的嫁衣襯著肌膚如雪缤苫。 梳的紋絲不亂的頭發(fā)上速兔,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機與錄音活玲,去河邊找鬼涣狗。 笑死,一個胖子當著我的面吹牛舒憾,可吹牛的內(nèi)容都是我干的镀钓。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼镀迂,長吁一口氣:“原來是場噩夢啊……” “哼丁溅!你這毒婦竟也來了?” 一聲冷哼從身側響起探遵,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤窟赏,失蹤者是張志新(化名)和其女友劉穎妓柜,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涯穷,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡棍掐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了求豫。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片塌衰。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蝠嘉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情杯巨,我是刑警寧澤蚤告,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站服爷,受9級特大地震影響杜恰,放射性物質發(fā)生泄漏。R本人自食惡果不足惜仍源,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一心褐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧笼踩,春花似錦逗爹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至于购,卻和暖如春袍睡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背肋僧。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工斑胜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人嫌吠。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓止潘,卻偏偏與公主長得像,于是被迫代替她去往敵國和親居兆。 傳聞我的和親對象是個殘疾皇子覆山,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

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