ios-第三方登录和分享总结(微信篇)

对于第三方登录和分享,当我们做熟了就会发现三种登录和分享的方式都是大同小异,流程基本上也一样,只要我们掌握其中的一种,其他的只需要看看文档就会很快做完,下面我们就先介绍微信.

一 微信

1.1微信登录

具体iOS微信集成指南点击查看iOS指南

1.1.1 申请账号

向微信的开放平台申请开发账号点击打开连接申请

1.1.2下载微信SDK

SDK文件包括 libWeChatSDK.a,WXApi.h,WXApiObject.h 三个。
如选用手动集成,请前往资源下载页下载最新SDK包

sdk文件预览.png

1.1.3环境搭建

1.新建工程,将sdk全部拖进去.


工程导入

2.微信开放平台新增了微信模块用户统计功能,便于开发者统计微信功能模块的用户使用和活跃情况。开发者需要在工程中链接上:SystemConfiguration.framework, libz.dylib, libsqlite3.0.dylib, libc++.dylib, Security.framework, CoreTelephony.framework, CFNetwork.framework。
3.在你的工程文件中选择Build Setting,在"Other Linker Flags"中加入"-Objc -all_load",在Search Paths中添加 libWeChatSDK.a ,WXApi.h,WXApiObject.h


QQ20180110-143356.png

4.在Xcode中,选择你的工程设置项,选中“TARGETS”一栏,在“info”标签栏的“URL type“添加“URL scheme”为你所注册的应用程序id
QQ20180110-143650.png

5.在Xcode中,选择你的工程设置项,选中“TARGETS”一栏,在“info”标签栏的“LSApplicationQueriesSchemes“添加微信的白名单,主要是为了手机端进行登录可以直接进入微信客户端中


QQ20180110-143954.png

这块我把所有需要添加的白名单都添加了,基本上是比较全的,项目中有需要用的的可以直接复制进去
1.1.3代码实现

这里的代码可能跟微信官方下载下来的demo中的代码位置有区别,是因为我这边做了一些小的封装,但调用的方法没有变(我这边只把实现的流程展示出来,具体代码可以参考我的demo或者官方demo)
1.要使你的程序启动后微信终端能响应你的程序,必须在代码中向微信终端注册你的id,在AppDelegate的- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions中注册微信
需要导头文件

#import "WXApi.h"
#import "WXApiObject.h"
//向微信注册
-(BOOL)WXRegister{
    return [WXApi registerApp:KWXAPPID];
}

2.重写AppDelegate的handleOpenURL和openURL方法(后面写的QQ,和微博一样的处理):

- (BOOL)applicationOpenURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
    if ([KTencentSchema isEqualToString:[url scheme]]) {
        //QQ
        return [TencentOAuth HandleOpenURL:url];
        
    }else if ([KTencentURLSchema isEqualToString:[url scheme]]) {
        //QQ
        return [QQApiInterface handleOpenURL:url delegate:self.qqUtils];
        
    }else if ([KWXURLSchema isEqualToString:[url scheme]]) {
        //微信
        return [WXApi handleOpenURL:url delegate:self.wxUtils];
        
    }else if ([KWBURLSchema isEqualToString:[url scheme]]){
        //微博
        return [WeiboSDK handleOpenURL:url delegate:self.wbUtils];
    }
    return NO;
}
- (BOOL)applicationHandleOpenURL:(NSURL *)url {
    
    if ([KTencentSchema isEqualToString:[url scheme]]) {
        //QQ
        return [TencentOAuth HandleOpenURL:url];
        
    }else if ([KTencentURLSchema isEqualToString:[url scheme]]) {
        //QQ
        return [QQApiInterface handleOpenURL:url delegate:self.qqUtils];
        
    }else if ([KWXURLSchema isEqualToString:[url scheme]]) {
        //微信
        return [WXApi handleOpenURL:url delegate:self.wxUtils];
        
    }else if ([KWBURLSchema isEqualToString:[url scheme]]){
        //微博
        return [WeiboSDK handleOpenURL:url delegate:self.wbUtils];
    }
    return NO;
}

3.你的程序要实现和微信终端交互的具体请求与回应,因此需要实现WXApiDelegate协议的两个方法:

#pragma mark- WXApiDelegate
/*! @brief 收到一个来自微信的请求,第三方应用程序处理完后调用sendResp向微信发送结果
 *
 * 收到一个来自微信的请求,异步处理完成后必须调用sendResp发送处理结果给微信。
 * 可能收到的请求有GetMessageFromWXReq、ShowMessageFromWXReq等。
 * @param req 具体请求内容,是自动释放的
 */
-(void) onReq:(BaseReq*)req{
    if ([req isKindOfClass:[GetMessageFromWXReq class]]) {
        //微信终端向第三方程序请求提供内容的消息结构体
        if (self.wxDelegate
            && [self.wxDelegate respondsToSelector:@selector(WXApiUtilsDidRecvGetMessageReq:)]) {
            GetMessageFromWXReq *getMessageReq = (GetMessageFromWXReq *)req;
            [self.wxDelegate WXApiUtilsDidRecvGetMessageReq:getMessageReq];
        }
    } else if ([req isKindOfClass:[ShowMessageFromWXReq class]]) {
        //微信通知第三方程序,要求第三方程序显示的消息结构体
        if (self.wxDelegate
            && [self.wxDelegate respondsToSelector:@selector(WXApiUtilsDidRecvShowMessageReq:)]) {
            ShowMessageFromWXReq *showMessageReq = (ShowMessageFromWXReq *)req;
            [self.wxDelegate WXApiUtilsDidRecvShowMessageReq:showMessageReq];
        }
    } else if ([req isKindOfClass:[LaunchFromWXReq class]]) {
        //微信终端打开第三方程序携带的消息结构体
        if (self.wxDelegate
            && [self.wxDelegate respondsToSelector:@selector(WXApiUtilsDidRecvLaunchFromWXReq:)]) {
            LaunchFromWXReq *launchReq = (LaunchFromWXReq *)req;
            [self.wxDelegate WXApiUtilsDidRecvLaunchFromWXReq:launchReq];
        }
    }
}
/*! @brief 发送一个sendReq后,收到微信的回应
 *
 * 收到一个来自微信的处理结果。调用一次sendReq后会收到onResp。
 * 可能收到的处理结果有SendMessageToWXResp、SendAuthResp等。
 * @param resp具体的回应内容,是自动释放的
 */
-(void) onResp:(BaseResp*)resp{
    if ([resp isKindOfClass: [PayResp class]]){
        //支付结果
        if (self.wxDelegate
            && [self.wxDelegate respondsToSelector:@selector(WXApiUtilsDidRecvPayResponse:)]) {
            PayResp *payResp = (PayResp *)resp;
            [self.wxDelegate WXApiUtilsDidRecvPayResponse:payResp];
        }
    }else if ([resp isKindOfClass:[SendMessageToWXResp class]]) {
        //第三方程序向微信终端发送SendMessageToWXReq后,微信发送回来的处理结果,该结果用SendMessageToWXResp表示。
        if (self.wxDelegate
            && [self.wxDelegate respondsToSelector:@selector(WXApiUtilsDidRecvMessageResponse:)]) {
            SendMessageToWXResp *messageResp = (SendMessageToWXResp *)resp;
            [self.wxDelegate WXApiUtilsDidRecvMessageResponse:messageResp];
        }
    } else if ([resp isKindOfClass:[SendAuthResp class]]) {
        //微信处理完第三方程序的认证和权限申请后向第三方程序回送的处理结果
        if (self.wxDelegate
            && [self.wxDelegate respondsToSelector:@selector(WXApiUtilsDidRecvAuthResponse:)]) {
            SendAuthResp *authResp = (SendAuthResp *)resp;
            [self.wxDelegate WXApiUtilsDidRecvAuthResponse:authResp];
        }
    } else if ([resp isKindOfClass:[AddCardToWXCardPackageResp class]]) {
        //微信返回第三方添加卡券结果
        if (self.wxDelegate
            && [self.wxDelegate respondsToSelector:@selector(WXApiUtilsDidRecvAddCardResponse:)]) {
            AddCardToWXCardPackageResp *addCardResp = (AddCardToWXCardPackageResp *)resp;
            [self.wxDelegate WXApiUtilsDidRecvAddCardResponse:addCardResp];
        }
    }
}

4.具体登录调用
在登录之前我们可以判断用户是否安装微信客户端

//是否安装微信
- (BOOL)isWXAppInstalled
{
    return [WXApi isWXAppInstalled];
}

然后再调用登录方法

//登录方法
- (void)WXOauthLogin
{
    SendAuthReq* req = [[SendAuthReq alloc] init];
    req.scope = @"snsapi_userinfo,snsapi_base";
    req.state = @"0744" ;
    [WXApi sendReq:req];
    
}

登录成功会在-(void) onResp:(BaseResp*)resp方法中回调成功结果,可以获取登录用户的信息

/**
 * 登录成功获取用户个人信息回调
 */
- (void)QQApiUtilsGetUserInfoResponse:(APIResponse*) response tencentOAuth:(TencentOAuth *)tencentOAut{
    //获取到QQ的用户信息
    NSLog(@"===%@",response.jsonResponse);
    NSInteger gender = 0;
    if ([response.jsonResponse[@"gender"] isEqualToString:@"男"]){
        gender = 1;
    }
    NSMutableDictionary * params = [NSMutableDictionary dictionary];
    [params setValue:tencentOAut.openId forKey:@"openid"];//openid【必须】
    [params setValue:[response.jsonResponse objectForKey:@"nickname"] forKey:@"nickName"];//QQ昵称【必须】
    [params setValue:[response.jsonResponse objectForKey:@"figureurl_qq_2"] forKey:@"avatar"];//头像【必须】
    [params setValue:gender == 1 ? @"男":@"女" forKey:@"sex"];//性别【必须】
    //登录成功回调
#warning 需要开发调用自己的登录接口
    [self loginSuccess:params];
}

获取到用户信息之后,我们可以根据自己公司的业务做后续处理

1.2微信分享(好友分享,朋友圈分享)

分享操作指南官方也有对应的知道文档微信分享操作指南
微信分享目前支持文字、图片、音乐、视频、网页共五种类型,这块我主要写了四种类型,基本上都一样只是中间调用的类不一样
分享的场景有两种

发送到聊天界面——WXSceneSession
发送到朋友圈——WXSceneTimeline

1.2.1分享的几种方式

1.网页

//网页类型分享
- (BOOL)sharedLinkToWeChat:(NSString *)title
                  description:(NSString *)description
                    detailUrl:(NSString *)detailUrl
                        image:(UIImage *)image
                    shareType:(WXShareSceneType)sharedType
{
    UIImage *compressedImage = [image imageWithFileSize:32*1024 scaledToSize:CGSizeMake(300, 300)];

    WXMediaMessage *message = [WXMediaMessage message];
    
    message.title = title;
    
    message.description = description;
    
    [message setThumbImage:compressedImage];
    
    WXWebpageObject *webpageObject = [WXWebpageObject object];
    
    webpageObject.webpageUrl = detailUrl;
    
    message.mediaObject = webpageObject;
    
    SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];
    
    req.bText= NO;
    
    req.message = message;
    
    req.scene = (sharedType == WXShareSceneTypeTimeline? WXSceneTimeline:WXSceneSession);
    BOOL success = [WXApi sendReq:req];
    return success;
}

2.图片

//分享图片
-(BOOL)shareImageToWeChat:(UIImage *)image
                shareType:(WXShareSceneType)sharedType{
    
    UIImage *compressedImage = [image imageWithFileSize:32*1024 scaledToSize:CGSizeMake(300, 300)];
    WXMediaMessage *message = [WXMediaMessage message];
    [message setThumbImage:compressedImage];
    
    WXImageObject *ext = [WXImageObject object];
    ext.imageData = UIImagePNGRepresentation(image);
    message.mediaObject = ext;
    
    SendMessageToWXReq* req = [[SendMessageToWXReq alloc] init];
    req.bText = NO;
    req.message = message;
    req.scene = (sharedType == WXShareSceneTypeTimeline? WXSceneTimeline:WXSceneSession);
    
    BOOL success = [WXApi sendReq:req];
    return success;
}

3.音乐类型

//音乐类型分享
- (BOOL)sharedMusicToWeChat:(NSString *)title
               description:(NSString *)description
                   musicUrl:(NSString *)musicUrl
               musicDataUrl:(NSString *)musicDataUrl
                     image:(UIImage *)image
                 shareType:(WXShareSceneType)sharedType
{
    UIImage *compressedImage = [image imageWithFileSize:32*1024 scaledToSize:CGSizeMake(300, 300)];
    
    WXMediaMessage *message = [WXMediaMessage message];
    //标题
    message.title = title;
    //描述
    message.description = description;
    //缩略图
    [message setThumbImage:compressedImage];
    
    WXMusicObject * musicObject = [WXMusicObject object];
    //音乐的url
    musicObject.musicUrl = musicUrl;
    //低分辨率音频
    musicObject.musicLowBandUrl = musicUrl;
    //音乐数据的url
    musicObject.musicDataUrl = musicDataUrl;
    musicObject.musicLowBandDataUrl = musicDataUrl;
    message.mediaObject = musicObject;
    
    SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];
    
    req.bText= NO;
    
    req.message = message;
    
    req.scene = (sharedType == WXShareSceneTypeTimeline? WXSceneTimeline:WXSceneSession);
    BOOL success = [WXApi sendReq:req];
    return success;
}

4.视频

//视频类型分享
- (BOOL)sharedVideoToWeChat:(NSString *)title
                description:(NSString *)description
                   videoUrl:(NSString *)videoUrl
                      image:(UIImage *)image
                  shareType:(WXShareSceneType)sharedType
{
    UIImage *compressedImage = [image imageWithFileSize:32*1024 scaledToSize:CGSizeMake(300, 300)];
    
    WXMediaMessage *message = [WXMediaMessage message];
    //标题
    message.title = title;
    //描述
    message.description = description;
    //缩略图
    [message setThumbImage:compressedImage];
    
    WXVideoObject * videoObject = [WXVideoObject object];
    //视频的url
    videoObject.videoUrl = videoUrl;
    videoObject.videoLowBandUrl = videoUrl;
    message.mediaObject = videoObject;
    
    SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];
    
    req.bText= NO;
    
    req.message = message;
    
    req.scene = (sharedType == WXShareSceneTypeTimeline? WXSceneTimeline:WXSceneSession);
    BOOL success = [WXApi sendReq:req];
    return success;
}
1.2.2分享成功的回调

分享成功的回调也是在-(void) onResp:(BaseResp*)resp方法中处理

-(void) onResp:(BaseResp*)resp{
 if ([resp isKindOfClass:[SendMessageToWXResp class]]) {
        //第三方程序向微信终端发送SendMessageToWXReq后,微信发送回来的处理结果,该结果用SendMessageToWXResp表示。
        if (self.wxDelegate
            && [self.wxDelegate respondsToSelector:@selector(WXApiUtilsDidRecvMessageResponse:)]) {
            SendMessageToWXResp *messageResp = (SendMessageToWXResp *)resp;
            [self.wxDelegate WXApiUtilsDidRecvMessageResponse:messageResp];
        }
    } 
}

以上就是微信登录和分享的整个流程,具体代码demo,也请大家继续关注,后续会分享QQ的登录和分享

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

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,943评论 4 60
  • WebSocket-Swift Starscream的使用 WebSocket 是 HTML5 一种新的协议。它实...
    香橙柚子阅读 23,554评论 8 183
  • 从日记小白到日记达人,我是日记星球174号星宝静待花开,正在参加日记星球第三期21天蜕变之旅。我承诺每天坚持写一篇...
    心理师刘津伶阅读 1,598评论 2 2
  • 自从盛酒长儿孙,强向杯中觅旧春。 不觉潸然泪眼低,息国亡来入楚宫。 自闭长门经几秋,强亲文墨事儒丘。 不觉潸然泪眼...
    快乐的健身阅读 238评论 0 0
  • “赤那”蒙语的意思是“狼”,而“赤那思”的意思是“狼群”,“赤那思部落”也就是“狼群部落”。 最初,对狼的了解仅限...
    我是汤师爷阅读 1,013评论 0 2