第四十一篇:微信第三方登录
来源:互联网 发布:积分返利商城源码 编辑:程序博客网 时间:2024/05/16 15:52
登录前效果图:
登录后效果图:
一、准备工作
第一步:下载友盟SDK,下载友盟SDK 根据需要选择下载,下载完成后把 UMSocial 文件添加到工程中;
第二步:添加配置,在 Build Settings --> Linking --> Other Linker Flags --> Debug 或 Release 对应的行后加入-ObjC ,
第三步:在项目的.plist 文件中添加如下配制,使允许网络加载
第四步:添加在项目中的所有 SDK 所需的 依懒库,下列是一些常见的登录或分享所需的依懒库
libsqlite3.tbd // 这两个是必须添加的CoreGraphics.framework // 微信的依懒库SystemConfiguration.frameworkCoreTelephony.frameworklibsqlite3.tbdlibc++.tbdlibz.tbd// QQ 的依懒库SystemConfiguration.frameworklibc++.tbd // 新浪微博的依懒库CoreTelephony.frameworkImageIO.frameworklibsqlite3.tbdlibz.tbd // 短信 的依懒库MessageUI.framework
第五步:配制SSO白名单
如果你的应用使用了如SSO授权登录或跳转到第三方分享功能,在iOS9/10下就需要增加一个可跳转的白名单,即LSApplicationQueriesSchemes
,否则将在SDK判断是否跳转时用到的canOpenURL时返回NO,进而只进行webview授权或授权/分享失败。 在项目中的info.plist中加入应用白名单,右键info.plist选择source code打开(plist具体设置在Build Setting -> Packaging -> Info.plist File可获取plist路径) 请根据选择的平台对以下配置进行裁剪:
<key>LSApplicationQueriesSchemes</key><array> <!-- 微信 URL Scheme 白名单--> <string>wechat</string> <string>weixin</string> <!-- 新浪微博 URL Scheme 白名单--> <string>sinaweibohd</string> <string>sinaweibo</string> <string>sinaweibosso</string> <string>weibosdk</string> <string>weibosdk2.5</string> <!-- QQ、Qzone URL Scheme 白名单--> <string>mqqapi</string> <string>mqq</string> <string>mqqOpensdkSSoLogin</string> <string>mqqconnect</string> <string>mqqopensdkdataline</string> <string>mqqopensdkgrouptribeshare</string> <string>mqqopensdkfriend</string> <string>mqqopensdkapi</string> <string>mqqopensdkapiV2</string> <string>mqqopensdkapiV3</string> <string>mqqopensdkapiV4</string> <string>mqzoneopensdk</string> <string>wtloginmqq</string> <string>wtloginmqq2</string> <string>mqqwpa</string> <string>mqzone</string> <string>mqzonev2</string> <string>mqzoneshare</string> <string>wtloginqzone</string> <string>mqzonewx</string> <string>mqzoneopensdkapiV2</string> <string>mqzoneopensdkapi19</string> <string>mqzoneopensdkapi</string> <string>mqqbrowser</string> <string>mttbrowser</string> <!-- 支付宝 URL Scheme 白名单--> <string>alipay</string> <string>alipayshare</string> <!-- 钉钉 URL Scheme 白名单--> <string>dingtalk</string> <string>dingtalk-open</string> <!--Linkedin URL Scheme 白名单--> <string>linkedin</string> <string>linkedin-sdk2</string> <string>linkedin-sdk</string> <!-- 点点虫 URL Scheme 白名单--> <string>laiwangsso</string> <!-- 易信 URL Scheme 白名单--> <string>yixin</string> <string>yixinopenapi</string> <!-- instagram URL Scheme 白名单--> <string>instagram</string> <!-- whatsapp URL Scheme 白名单--> <string>whatsapp</string> <!-- line URL Scheme 白名单--> <string>line</string> <!-- Facebook URL Scheme 白名单--> <string>fbapi</string> <string>fb-messenger-api</string> <string>fbauth2</string> <string>fbshareextension</string> <!-- Kakao URL Scheme 白名单--> <!-- 注:以下第一个参数需替换为自己的kakao appkey--> <!-- 格式为 kakao + "kakao appkey"--> <string>kakaofa63a0b2356e923f3edd6512d531f546</string> <string>kakaokompassauth</string> <string>storykompassauth</string> <string>kakaolink</string> <string>kakaotalk-4.5.0</string> <string>kakaostory-2.9.0</string> <!-- pinterest URL Scheme 白名单--> <string>pinterestsdk.v1</string> <!-- Tumblr URL Scheme 白名单--> <string>tumblr</string> <!-- 印象笔记 --> <string>evernote</string> <string>en</string> <string>enx</string> <string>evernotecid</string> <string>evernotemsg</string> <!-- 有道云笔记--> <string>youdaonote</string> <string>ynotedictfav</string> <string>com.youdao.note.todayViewNote</string> <string>ynotesharesdk</string> <!-- Google+--> <string>gplus</string> <!-- Pocket--> <string>pocket</string> <string>readitlater</string> <string>pocket-oauth-v1</string> <string>fb131450656879143</string> <string>en-readitlater-5776</string> <string>com.ideashower.ReadItLaterPro3</string> <string>com.ideashower.ReadItLaterPro</string> <string>com.ideashower.ReadItLaterProAlpha</string> <string>com.ideashower.ReadItLaterProEnterprise</string> <!-- VKontakte--> <string>vk</string> <string>vk-share</string> <string>vkauthorize</string></array>
第六步:在项目的 plist 文件中配制 URL Scheme
二、实现第三方登录功能
前言:现在已经有了一个空项目里面有一个友盟SDK,并做了相关的配制后,接下来就是要实现该功能。在实现之前需要自己去申请一个友盟AppKey。
1.创建一个公共的文件 CommentHeader.h ,用来存放 key 值
//// CommentHeader.h// QJWeixinLogin//// Created by 瞿杰 on 2017/6/15.// Copyright © 2017年 yiniu. All rights reserved.//#ifndef CommentHeader_h#define CommentHeader_h//测试微信相关参static NSString *kTestWxAppId = @"wxdc1e388c3822c80b";static NSString *kTestWxAppSecret = @"3baf1193c85774b3fd9d18447d76cab0";//友盟AppKeystatic NSString *kUMengAppKey = @"xxxxxxxxxx";#endif /* CommentHeader_h */
2.项目的 AppDelegate 文件
//// AppDelegate.h// QJWeixinLogin//// Created by 瞿杰 on 2017/6/15.// Copyright © 2017年 yiniu. All rights reserved.//#import <UIKit/UIKit.h>#import <CoreData/CoreData.h>@interface AppDelegate : UIResponder <UIApplicationDelegate>@property (strong, nonatomic) UIWindow *window;@property (readonly, strong) NSPersistentContainer *persistentContainer;- (void)saveContext;@end
//// AppDelegate.m// QJWeixinLogin//// Created by 瞿杰 on 2017/6/15.// Copyright © 2017年 yiniu. All rights reserved.//#import "AppDelegate.h"#import "ViewController.h"#import "CommentHeader.h"#import <UMSocialCore/UMSocialCore.h>#import "WXApi.h"@interface AppDelegate ()@end@implementation AppDelegate// 初始化环境-(void)initEnvironment{ //打开调试日志 [[UMSocialManager defaultManager] openLog:YES]; //设置友盟AppKey [[UMSocialManager defaultManager] setUmSocialAppkey:kUMengAppKey]; //设置微信的appKey和appSecret [[UMSocialManager defaultManager] setPlaform:UMSocialPlatformType_WechatSession appKey:kTestWxAppId appSecret:kTestWxAppSecret redirectURL:@"http://mobile.umeng.com/social"];}- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. // 初始化微信登录环境 [self initEnvironment]; self.window = [[UIWindow alloc] init]; self.window.backgroundColor = [UIColor grayColor]; self.window.rootViewController = [[ViewController alloc] init]; [self.window makeKeyAndVisible]; return YES;}#pragma mark - 回调-(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options{ return [[UMSocialManager defaultManager] handleOpenURL:url];}
3.控制器文件 ViewController
//// ViewController.h// QJWeixinLogin//// Created by 瞿杰 on 2017/6/15.// Copyright © 2017年 yiniu. All rights reserved.//#import <UIKit/UIKit.h>@interface ViewController : UIViewController@end
//// ViewController.m// QJWeixinLogin//// Created by 瞿杰 on 2017/6/15.// Copyright © 2017年 yiniu. All rights reserved.//#import "ViewController.h"#import "ThirdPartyLoginTools.h"#import "UIImageView+QJWebImage.h"@interface ViewController ()<ThirdPartyLoginToolsDelegate>@property (nonatomic , strong)UIImageView * imageView ;@property (nonatomic , strong)UILabel * nameLabel ;@property (nonatomic , strong)UILabel * sexLabel ;@property (nonatomic , strong)UIButton * weixinLogin ;@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor redColor]; [self setUpViews];}-(void)setUpViews{ self.imageView = [[UIImageView alloc] init]; self.imageView.frame = CGRectMake(100, 100, 100, 100); self.imageView.backgroundColor = [UIColor blueColor]; [self.view addSubview:self.imageView]; self.nameLabel = [[UILabel alloc] init]; self.nameLabel.backgroundColor = [UIColor whiteColor]; self.nameLabel.textColor = [UIColor blackColor]; self.nameLabel.frame = CGRectMake(100, 210, 100, 50); self.nameLabel.text = [NSString stringWithFormat:@"用户名:xxx"]; [self.view addSubview:self.nameLabel]; self.sexLabel = [[UILabel alloc] init]; self.sexLabel.backgroundColor = [UIColor whiteColor]; self.sexLabel.textColor = [UIColor blackColor]; self.sexLabel.frame = CGRectMake(100, 270, 100, 50); self.sexLabel.text = [NSString stringWithFormat:@"性别:x"]; [self.view addSubview:self.sexLabel]; UIButton * weixinLogin = [[UIButton alloc] init]; self.weixinLogin = weixinLogin ; [weixinLogin setTitle:@"微信登录" forState:UIControlStateNormal]; [weixinLogin setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; weixinLogin.backgroundColor = [UIColor whiteColor]; [weixinLogin addTarget:self action:@selector(weixinLoginBtnDidClicked) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:weixinLogin]; weixinLogin.frame = CGRectMake(100, 380, 100, 100);}-(void)weixinLoginBtnDidClicked{ NSLog(@"weixinLoginBtnDidClicked"); [ThirdPartyLoginTools weChatLogin:self delegate:self];}#pragma mark - ThirdPartyLoginToolsDelegate-(void)loginToolsWithUserMessgate:(UMSocialUserInfoResponse *)response{ [self.imageView qj_setImageWithUrlStr:response.iconurl]; self.nameLabel.text = [NSString stringWithFormat:@"用户名:%@",response.name]; self.sexLabel.text = [NSString stringWithFormat:@"性别:%@",response.gender];}@end
4.第三方登录工具文件 ThirdPartyLoginTools
//// ThirdPartyLoginTools.h// DuoBao//// Created by 瞿杰 on 17/6/15.////#import <Foundation/Foundation.h>#import <UIKit/UIKit.h>#import <UMSocialCore/UMSocialCore.h>typedef enum : NSUInteger { ThirdPartyPlatformTypeQQ = 3, ThirdPartyPlatformTypeWechat = 4, ThirdPartyPlatformTypeSina = 5,} ThirdPartyPlatformType;@protocol ThirdPartyLoginToolsDelegate <NSObject>@required-(void)loginToolsWithUserMessgate:(UMSocialUserInfoResponse *)response ;@end@interface ThirdPartyLoginTools : NSObject/** * 新浪登陆 * * @param controller */+(void)sinaLogin:(UIViewController *)controller delegate:(id<ThirdPartyLoginToolsDelegate>) delegate;/** * 微信登陆 * * @param controller */+(void)weChatLogin:(UIViewController *)controller delegate:(id<ThirdPartyLoginToolsDelegate>) delegate;/** * QQ登陆 * * @param controller */+(void)qqLogin:(UIViewController *)controller delegate:(id<ThirdPartyLoginToolsDelegate>) delegate;/** * * 登陆 * @param platformName 平台名字 * @param controller */+(void)loginWithPlatformName:(ThirdPartyPlatformType)type withController:(UIViewController *)controller delegate:(id<ThirdPartyLoginToolsDelegate>) delegate;/** * 第三方授权成功,登陆接口 * * @param loginType 登陆类型 * @param openId 第三方唯一标识 * @param avatar 头像地址 * @param sex 性别 * @param birthday 生日 * @param controller */+(void)thirdPartyLoginWithPlatformType:(NSInteger)loginType openId:(NSString *)openId name:(NSString *)name avatar:(NSString *)avatar sex:(NSString *)sex birthDay:(NSString *)birthday iconUrl:(NSString*)iconUrl controller:(UIViewController *)controller;@end
//// ThirdPartyLoginTools.m// DuoBao//// Created by 瞿杰 on 17/6/15.////#import "ThirdPartyLoginTools.h"//#import "UserInfoUtils.h"#import "WXApi.h"#import "WeiboSDK.h"#import <TencentOpenAPI/TencentOAuth.h>@implementation ThirdPartyLoginTools+(void)sinaLogin:(UIViewController *)controller delegate:(id<ThirdPartyLoginToolsDelegate>) delegate{ if ([WeiboSDK isWeiboAppInstalled]) { [self loginWithPlatformName:ThirdPartyPlatformTypeSina withController:controller delegate:delegate]; } else{ NSLog(@"请安装新浪客户端"); }}+(void)weChatLogin:(UIViewController *)controller delegate:(id<ThirdPartyLoginToolsDelegate>) delegate{ if ([WXApi isWXAppInstalled]) { [self loginWithPlatformName:ThirdPartyPlatformTypeWechat withController:controller delegate:delegate]; } else{ NSLog(@"请安装微信客户端");// [ToastUtil toast:@"请安装微信客户端"]; }}+(void)qqLogin:(UIViewController *)controller delegate:(id<ThirdPartyLoginToolsDelegate>) delegate{ if ([TencentOAuth iphoneQQInstalled]) { [self loginWithPlatformName:ThirdPartyPlatformTypeQQ withController:controller delegate:delegate]; } else{ NSLog(@"请安装QQ客户端"); }}+(void)loginWithPlatformName:(ThirdPartyPlatformType)type withController:(UIViewController *)controller delegate:(id<ThirdPartyLoginToolsDelegate>) delegate{ //此处调用授权的方法,你可以把下面的platformName 替换成 UMShareToSina,UMShareToTencent等 UMSocialPlatformType platformName ; if (ThirdPartyPlatformTypeWechat == type) { platformName = UMSocialPlatformType_WechatSession ; } else if (ThirdPartyPlatformTypeQQ == type){ platformName = UMSocialPlatformType_QQ ; } else{ platformName = UMSocialPlatformType_Sina ; } [[UMSocialManager defaultManager] getUserInfoWithPlatform:platformName currentViewController:controller completion:^(id result, NSError *error) { if (error) { } else { UMSocialUserInfoResponse *resp = result; if ([delegate respondsToSelector:@selector(loginToolsWithUserMessgate:)]) { [delegate loginToolsWithUserMessgate:resp]; } // 授权信息 NSLog(@"Wechat uid: %@", resp.uid); NSLog(@"Wechat openid: %@", resp.openid); NSLog(@"Wechat accessToken: %@", resp.accessToken); NSLog(@"Wechat refreshToken: %@", resp.refreshToken); NSLog(@"Wechat expiration: %@", resp.expiration); // 用户信息 NSLog(@"Wechat name: %@", resp.name); NSLog(@"Wechat iconurl: %@", resp.iconurl); NSLog(@"Wechat gender: %@", resp.gender); // 第三方平台SDK源数据 NSLog(@"Wechat originalResponse: %@", resp.originalResponse); [self thirdPartyLoginWithPlatformType:type openId:resp.uid name:resp.name avatar:resp.iconurl sex:[NSString stringWithFormat:@"%ld",[[resp.originalResponse objectForKey:@"sex"] integerValue]] birthDay:nil iconUrl:resp.iconurl controller:controller]; } }];}+(void)thirdPartyLoginWithPlatformType:(NSInteger)loginType openId:(NSString *)openId name:(NSString *)name avatar:(NSString *)avatar sex:(NSString *)sex birthDay:(NSString *)birthday iconUrl:(NSString*)iconUrl controller:(UIViewController *)controller{ // 自家APP登录获取数据}@end
5.对于 UIImageView+QJWebImage.h 文件是用于下载图片的,自个封装的,如有不足之处,可用SDWebImage框架代替。下载 QJWebImage,结构如下:
三、学习参考网址:友盟官方网址
- 第四十一篇:微信第三方登录
- 微信第三方登录
- 微信第三方登录
- 微信第三方登录
- 微信第三方登录
- 微信第三方登录
- 微信第三方登录
- 微信第三方登录
- 微信第三方登录
- 微信第三方登录
- 微信第三方登录
- 微信第三方登录
- 微信第三方登录
- 第三方登录之微信登录
- Android第三方登录--微信登录
- 第三方登录之微信登陆
- 微信第三方授权登录
- Android微信第三方登录接入
- “windows无法安装到这个磁盘,选中的磁盘采用GPT分区形式”的解决方案
- Bundle.setClassLoader()方法解析 BootClassLoader PathClassLoader
- 二十款免费WiFi渗透工具
- Linux: shell 中命令代换 $() 和 ``(有图有代码有真相!!!)
- NKOJ-4092 [HAOI2016] 食物链<附TopSort理解>
- 第四十一篇:微信第三方登录
- Hive分析窗口函数(一) SUM,AVG,MIN,MAX
- matlab-fullfile使用
- MySql数据库引擎区分
- 移动平台Unity3D 应用性能优化
- 利用 NavMesh.CalculatePath写出更加好的AI移动效果
- JAVAWEB开发之SpringMVC详解(一)——SpringMVC的框架原理、架构简介、与mybatis整合和注解方式的使用、
- 微信小程序tabbar的跳转问题
- Dataquest Data Scientist Path 整理笔记(2)