腾讯QQ登陆
1.把从腾讯开放平台下载下来的TencentOpenApi_IOS_Bundle.bundle(资源文件)和TencentOpenAPI.framework(API文件)文件导入到自己的项目中
2.选择Build Phases中的Link Binary With Librarier点击下面的➕添加SDK依赖的类库,分别是
”Security.framework”,
“libiconv.dylib”,
“SystemConfiguration.framework”,
“CoreGraphics.Framework”、
“libsqlite3.dylib”、
“CoreTelephony.framework”、
“libstdc++.dylib”、
“libz.dylib”
3.同样在Build Phases中的Copy Bundle Resources一栏点击➕并选择Add Other 找到TencentOpenApi_IOS_Bundle.bundle文件选择Open添加进去
4.在工程配置中的“Build Settings”一栏中找到“Linking”配置区,给“Other Linker Flags”配置项添加属性值“-fobjc-arc”
5.添加URL scheme,在“info”标签栏的“URL type”添加一条新的“URL scheme”,新的scheme = tencent + appid (魔学院urlscheme为tencent1104503488, 也即appid为1104503488)
6.重写AppDelegate中的handleOpenURL和openURL方法
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation // 过期
{
return [TencentOAuth HandleOpenURL:url];
}
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
{
return [TencentOAuth HandleOpenURL:url];
}
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url // 过期
{
return [TencentOAuth HandleOpenURL:url];
}
7.在didFinishLaunchingWithOptions方法中注册腾讯appid
首先需要导入#import “TencentOpenAPI/TencentOAuth.h”
[[TencentOAuth alloc] initWithAppId:@”1104503488” andDelegate:self]; // 这一步是注册/ 初始化 代理对象不能丢
8.配置网络可用以及白名单
在info.plist中添加上
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
表示可以连接网络了(iOS9之后才有的)
配置白名单在info.plist中添加
<array>
<string>mqqOpensdkSSoLogin</string>
<string>mqzone</string>
<string>sinaweibo</string>
<string>alipayauth</string>
<string>alipay</string>
<string>safepay</string>
<string>mqq</string>
<string>mqqapi</string>
<string>mqqopensdkapiV3</string>
<string>mqqopensdkapiV2</string>
<string>mqqapiwallet</string>
<string>mqqwpa</string>
<string>mqqbrowser</string>
<string>wtloginmqq2</string>
<string>weixin</string>
<string>wechat</string>
</array>
注: 该白名单囊括了新浪微博.微信.QQ,支付宝
9.调用登陆SDK
在需要调用的控制器中导入三个头文件以及代理
import “TencentOpenAPI/TencentOAuth.h” // 授权
import “TencentOpenAPI/TencentApiInterface.h” // 协议方法实现 需要调用 否则报错
import “TencentOpenAPI/sdkdef.h” // 登陆成功之后查看用户信息需要调用
先在viewDidLoad中初始化授权类以及需要获得的用户的那些信息
_tencentOAuth = [[TencentOAuth alloc] initWithAppId:@”1104503488” andDelegate:self]; _permissions = [NSArray arrayWithObjects:kOPEN_PERMISSION_GET_INFO, kOPEN_PERMISSION_GET_USER_INFO, kOPEN_PERMISSION_GET_SIMPLE_USER_INFO, nil];
再在登陆事件中调用[_tencentOAuth authorize:_permissions inSafari:NO];启动第三方登陆,如果此时配置了白名单且手机上安装了QQ就会直接调用手机QQ来登陆否则从网页进入登陆页面.
10. 事件代理方法
- (void)tencentDidLogin // 登陆结束
{
if (_tencentOAuth.accessToken && 0 != [_tencentOAuth.accessToken length])
{
// 记录登录用户的OpenID、Token以及过期时间
NSLog(@"登录成功%@", _tencentOAuth.accessToken);
[_tencentOAuth getUserInfo]; // 获得用户基础信息
}
else
{
NSLog(@"登录不成功 没有获取accesstoken");
}
}
- (void)getUserInfoResponse:(APIResponse *)response // 在执行了[_tencentOAuth getUserInfo];方法之后执行该方法
{
NSLog(@"\n%@\n%@\n%@\n%@\n%@\n%@\n%@\n%@\n%@\n%@\n%@\n%@\n%@\n%@\n%@\n%@\n%@", response.jsonResponse[@"city"], // 市
response.jsonResponse[@"figureurl"], // 控件图 30x30
response.jsonResponse[@"figureurl_1"], // 空间图 50x50
response.jsonResponse[@"figureurl_2"], // 控件图 100x100
response.jsonResponse[@"figureurl_qq_1"], // 头像图 40x40
response.jsonResponse[@"figureurl_qq_2"], // 头像图 100x100
response.jsonResponse[@"gender"], // 性别
response.jsonResponse[@"is_lost"],
response.jsonResponse[@"is_yellow_vip"],
response.jsonResponse[@"is_yellow_year_vip"],
response.jsonResponse[@"level"],
response.jsonResponse[@"msg"],
response.jsonResponse[@"nickname"], // 昵称
response.jsonResponse[@"province"], // 省
response.jsonResponse[@"ret"],
response.jsonResponse[@"vip"],
response.jsonResponse[@"yellow_vip_level"]);
}
- (void)tencentDidNotLogin:(BOOL)cancelled
{
NSLog(@"非网络错误导致登录失败");
if (cancelled)
{
NSLog(@"用户取消登录");
}
else
{
NSLog(@"登录失败");
}
}
- (void)tencentDidNotNetWork
{
NSLog(@"无网络连接,设置网络");
}
腾讯QQ分享
- 配置分享的过程与配置登陆的过程一样, 需要导入的依赖库文件也一样,注意配置好info.plist中的网络请求与白名单字段
导入
import “TencentOpenAPI/QQApiInterfaceObject.h” // 腾讯QQ分享内容的类型
import “TencentOpenAPI/QQApiInterface.h” // 腾讯QQ分享发送类腾讯的分享可以分享到QQ好友,QQ空间等位置,分享的内容可以是纯文字,图文,带链接的图文等方式
1)纯文字
- (void)shareText
{
QQApiTextObject *txtObj = [QQApiTextObject objectWithText:@"text"];
SendMessageToQQReq *req = [SendMessageToQQReq reqWithContent:txtObj];
QQApiSendResultCode result = [QQApiInterface sendReq:req]; // 分享文本给QQ好友
// QQApiSendResultCode result = [QQApiInterface SendReqToQZone:req]; // 分享文本给QQ空间
[self handleSendResult:result];
}
2)图文
- (void)shareImage
{
UIImage *image = [UIImage imageNamed:@"zhitongche_biaoqing"];
NSData *data = UIImagePNGRepresentation(image);
QQApiImageObject *imageObj = [QQApiImageObject objectWithData:data previewImageData:data title:@"分享图片" description:@"详细介绍"];
SendMessageToQQReq *req = [SendMessageToQQReq reqWithContent:imageObj];
QQApiSendResultCode result = [QQApiInterface sendReq:req];
[self handleSendResult:result];
}
3)带链接的图文
- (void)shareNews
{
// QQApiNewsObject *newsObj = [QQApiNewsObject objectWithURL:[NSURL URLWithString:@"www.baidu.com"] title:@"分享带链接的图文" description:@"详情介绍" previewImageURL:[NSURL URLWithString:@"http://api.moxueyuan.com/attachment/1591/2016/08/14714177518669.jpg_thumb_200.jpg"]]; // 分享的网络图片
UIImage *image = [UIImage imageNamed:@"zhitongche_biaoqing"];
NSData *data = UIImagePNGRepresentation(image);
QQApiNewsObject *newsObj = [QQApiNewsObject objectWithURL:[NSURL URLWithString:@"www.baidu.com"] title:@"分享带链接的图文" description:@"详情介绍" previewImageData:data]; // 分享本地的图片
SendMessageToQQReq *req = [SendMessageToQQReq reqWithContent:newsObj];
QQApiSendResultCode result = [QQApiInterface sendReq:req];
[self handleSendResult:result];
}
// 处理分享的结果
- (void)handleSendResult:(QQApiSendResultCode)resultCode
{
// 1. 判断结果属于哪种
switch (resultCode) {
case EQQAPIAPPNOTREGISTED: // 未注册
{
NSLog(@"未注册");
}
break;
case EQQAPIMESSAGECONTENTINVALID: // 发送参数错误
case EQQAPIMESSAGECONTENTNULL: // 发送参数错误
case EQQAPIMESSAGETYPEINVALID: // 发送参数错误
{
NSLog(@"发送参数错误");
}
break;
case EQQAPIQQNOTINSTALLED: // 未安装手机QQ
{
NSLog(@"未安装手机QQ");
}
break;
case EQQAPIQQNOTSUPPORTAPI: // API接口不支持
{
NSLog(@"API接口不支持");
}
break;
case EQQAPISENDFAILD: // 发送失败
{
NSLog(@"发送失败");
}
break;
case EQQAPISENDSUCESS: // 发送成功
{
NSLog(@"发送到qq空间成功");
}
break;
case EQQAPIAPPSHAREASYNC: // 异步
{
NSLog(@"异步");
}
break;
default:
break;
}
}
微信登陆
出于苹果上线政策 需要判断一下手机上是否安装了微信 没有安装的话就要隐藏该功能
1. 把libWeChatSDK.a, WechatAuthSDK.h, WXApi.h, WXApiObject.h四个微信的API文件导入项目
2. 添加对应依赖库
SystemConfiguration.framework,
libz.dylib,
libsqlite3.0.dylib,
libc++.dylib,
Security.framework,
CoreTelephony.framework。
3. 在info.plist文件中添加URL Scheme
4. 在didFinishLaunchingWithOptions方法中向微信注册id
[WXApi registerApp:WEIXINAPPID]; // 需要导入#import “WXApi.h”头文件以及WXApiDelegate协议
5. 在openURL方法中实现
if ([url.scheme isEqualToString:WEIXINAPPID]) // 微信
{
return [WXApi handleOpenURL:url delegate:self];
}
- 实现代理方法
- (void)onReq:(BaseReq *)req
// onReq是微信终端向第三方程序发起请求,要求第三方程序响应。第三方程序响应完后必须调用sendRsp返回。在调用sendRsp返回时,会切回到微信终端程序界面。
- (void)onResp:(BaseResp *)resp
// 如果第三方程序向微信发送了sendReq的请求,那么onResp会被回调。sendReq请求调用后,会切到微信终端程序界面。
在onResp方法中获得登录成功返回的code码,然后利用code码发送GET请求给微信服务器获得access_token以及openid, 进而可以想微信服务器发请求获得微信个人信息,
// 根据code码,appid以及appsecret获得access_token
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
// 根据access_token和openid获得用户个人信息
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID
微信分享
- 导入的文件与依赖库与微信登录的要求一样
- 微信分享有三个场景去向分别是
发送到聊天界面——WXSceneSession
发送到朋友圈——WXSceneTimeline
添加到微信收藏——WXSceneFavorite - 纯文本分享
- (void)wechatShareText
{
SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];
req.text = @"纯文本分享";
req.bText = YES;
req.scene = WXSceneSession;
[WXApi sendReq:req];
}
- 图片分享
- (void)wechatShareImage
{
WXMediaMessage *message = [WXMediaMessage message];
[message setThumbImage:[UIImage imageNamed:@"1"]];
WXImageObject *imageObject = [WXImageObject object];
imageObject.imageData = UIImagePNGRepresentation([UIImage imageNamed:@"1"]);
message.mediaObject = imageObject;
SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];
req.bText = NO;
req.message = message;
req.scene = WXSceneSession;
[WXApi sendReq:req];
}
5.链接分享
- (void)wechatShareWeb
{
WXMediaMessage *message = [WXMediaMessage message];
message.title = @"标题";
message.description = @"描述";
[message setThumbImage:[UIImage imageNamed:@"1"]];
WXWebpageObject *webpageObject = [WXWebpageObject object];
webpageObject.webpageUrl = @"www.baidu.com";
message.mediaObject = webpageObject;
SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];
req.bText = NO; // 发送消息的类型,包括文本消息和多媒体消息两种,两者只能选择其一,不能同时发送文本和多媒体消息
req.message = message;
req.scene = WXSceneSession;
[WXApi sendReq:req];
}
新浪微博登陆
—- 貌似现在获得授权之后再次第三方登陆不会跳转到等待用户确定登陆页面而是直接授权成功
1. libWeiboSDK文件夹及其内容导入自己的项目
2. 导入依赖库
QuartzCore.framework
ImageIO.framework
SystemConfiguration.framework
Security.framework
CoreTelephony.framework
CoreText.framework
UIKit.framework
Foundation.framework
CoreGraphics.framework
libz.dylib
libsqlite3.dylib
3. 添加urlScheme, 新浪微博的scheme组成为wb+appkey
4. 记得把Bundle id与新浪开放平台上的bundleid保持一致,否则会报sso package or sign error这个错误
5. 在build settings中选择linking下的other linker flags项并添加上-ObjC字段
6. 在appDelegate中导入#import “WeiboSDK.h” // 微博API 并导入协议文件名WeiboSDKDelegate
7. 在didFinishLaunchingWithOptions方法中向微博进行注册
[WeiboSDK enableDebugMode:YES];
[WeiboSDK registerApp:WEIBOAPPKEY];
- 在openURL方法中设置回调
if ([url.scheme isEqualToString:[NSString stringWithFormat:@"wb%@",WEIBOAPPKEY]]) // 微博
{
return [WeiboSDK handleOpenURL:url delegate:self];
}
- 在需要微博登陆的方法中执行微博登陆方法, 并在该文件导入#import “WeiboSDK.h” // 微博授权认证
- (void)weiboLogin
{
WBAuthorizeRequest *request = [WBAuthorizeRequest request];
request.redirectURI = WEIBOREDIRECTURI; // 回调页地址
[WeiboSDK sendRequest:request];
}
- 在appdelegate中实现微博的代理方法didReceiveWeiboResponse:
- (void)didReceiveWeiboResponse:(WBBaseResponse *)response
{
if ([response isKindOfClass:[WBAuthorizeResponse class]]) // 登陆授权
{
if (response.statusCode == WeiboSDKResponseStatusCodeSuccess) // 登陆成功
{
WBAuthorizeResponse *authorizeResponse = (WBAuthorizeResponse *)response;
// 得到accessToken, userid, 用户信息
NSString *accessToken = authorizeResponse.accessToken;
NSString *userid = authorizeResponse.userID;
NSString *userid = authorizeResponse.userInfo;
if (userid)
{
[[NSNotificationCenter defaultCenter] postNotificationName:WEIBOLOGINSUCCESSNOTIFICATION object:nil userInfo:authorizeResponse.userInfo];
}
}else if (response.statusCode == WeiboSDKResponseStatusCodeAuthDeny)
{
// 授权失败
}
}
}
新浪微博分享
- 导入SDK和依赖库以及配置-ObjC和白名单, urlScheme的步骤与微博登陆的步骤一样
- 在appDelegate中向微博注册
[WeiboSDK enableDebugMode:YES];
[WeiboSDK registerApp:WEIBOAPPKEY];
并导入#import “WeiboSDK.h” // 微博API 以及协议WeiboSDKDelegate
3. 在openURL方法中实现
if ([url.scheme isEqualToString:[NSString stringWithFormat:@"wb%@",WEIBOAPPKEY]]) // 微博
{
return [WeiboSDK handleOpenURL:url delegate:self];
}
- 实现微博代理方法didReceiveWeiboResponse:
- (void)didReceiveWeiboResponse:(WBBaseResponse *)response
{
if ([response isKindOfClass:[WBAuthorizeResponse class]]) // 登陆授权
{
if (response.statusCode == WeiboSDKResponseStatusCodeSuccess) // 登陆成功
{
WBAuthorizeResponse *authorizeResponse = (WBAuthorizeResponse *)response;
// 得到accessToken
NSString *accessToken = authorizeResponse.accessToken;
NSString *userid = authorizeResponse.userID;
if (userid)
{
[[NSNotificationCenter defaultCenter] postNotificationName:WEIBOLOGINSUCCESSNOTIFICATION object:nil userInfo:authorizeResponse.userInfo];
}
}else if (response.statusCode == WeiboSDKResponseStatusCodeAuthDeny)
{
// 授权失败
}
}
else if ([response isKindOfClass:[WBSendMessageToWeiboResponse class]])
{
if (response.statusCode == WeiboSDKResponseStatusCodeSuccess)
{
WBSendMessageToWeiboResponse *sendMessageToWeiboResponse = (WBSendMessageToWeiboResponse *)response;
// 用户没有登陆时直接分享就会先授权然后再分享,所以也要拿到token
NSString *accessToken = [sendMessageToWeiboResponse.authResponse accessToken];
if (accessToken)
{
self.wbtoken = accessToken;
}
// 得到用户id
NSString *userID = [sendMessageToWeiboResponse.authResponse userID];
if (userID)
{
self.wbuserid = userID;
}
// 发送分享成功网络请求到服务器
// [self shareSuccess];
// 创建alertview显示分享成功
}
else
{
// 创建alertview显示分享失败
}
}
}
- 在需要实现分享功能的位置进行微博分享
- (void)weiboShare
{
_sharedURL = @"http://www.baidu.com";
_sharedIntro = @"分享的简介";
_sharedTitle = @"分享的标题";
_sharedImageURLString = @"分享的预览图片";
AppDelegate *myDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
WBAuthorizeRequest *authRequest = [WBAuthorizeRequest request];
authRequest.redirectURI = WEIBOREDIRECTURI; // 回调地址
authRequest.scope = @"all";
WBMessageObject *messageObject = [WBMessageObject message];
if (_sharedIntro.length > 45) {
_sharedIntro = [[_sharedIntro substringToIndex:45] stringByAppendingString:@"..."];
}
messageObject.text = [NSString stringWithFormat:@"%@%@%@",_sharedTitle,_sharedIntro,_sharedURL];
WBImageObject *imageObj = [WBImageObject object];
NSString *bigImageURL = _sharedImageURLString;
NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:bigImageURL]];
UIImage *image = [UIImage imageWithData:imageData];
if (!imageData || !image) { // 链接图片不可用就要用默认
image = [UIImage imageNamed:@"1"];
imageData = UIImageJPEGRepresentation(image,1);
}
imageObj.imageData = imageData;
messageObject.imageObject = imageObj;
WBSendMessageToWeiboRequest *sendMessageRequest = [WBSendMessageToWeiboRequest requestWithMessage:messageObject authInfo:authRequest access_token:myDelegate.wbtoken];
// 发送分享请求
[WeiboSDK sendRequest:sendMessageRequest];
}