iOS 第三方登录(原生)

需求:应用需要接入第三方的登录,这里以微信为例。
前提:申请了应用的appID,就是在微信平台注册了应用,并且拥有的权限。
准备:1.应用bundle Identifier
2.appID (在微信平台注册后,会返回)
3.App Secret(也是在微信平台有返回)
步骤:
一、导入微信相关的SDK,可到官网上下载:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419319164&token=&lang=zh_CN,
1.导入微信SDK

iOS 第三方登录(原生)_第1张图片
sdk.png

2.添加相关的依赖库


iOS 第三方登录(原生)_第2张图片
依赖库.png

这里注意一下:libWechatSDK.a一定要依赖进来,否则会报错:

iOS 第三方登录(原生)_第3张图片
出错.png

上面报错原因之一就有可能是因为依赖库中没有导入libWechatSDK.a这个库。

3.添加URLScheme

iOS 第三方登录(原生)_第4张图片
添加URLType.png

ps:如果点击授权登录没反应,那可能是因为这里没有配置URLScheme

4.info文件的配置

iOS 第三方登录(原生)_第5张图片
info文件配置.png

二、代码接入:
这里创建了一个WXLoginShare类来处理第三方登录的一些操作。
1.在pch文件中

iOS 第三方登录(原生)_第6张图片
pch类.png

2.在AppDelegate.h类

iOS 第三方登录(原生)_第7张图片
AppDelegate文件.png
iOS 第三方登录(原生)_第8张图片
AppDelegate类.png

3.WXLoginShare类中.h文件

iOS 第三方登录(原生)_第9张图片
loginShare.h文件.png

WXLoginShare类中.m文件

#import "WXLoginShare.h"
@implementation WXLoginShare

+(WXLoginShare *)shareInstance{
    static WXLoginShare *loginShare = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        loginShare = [[WXLoginShare alloc]init];
    });
    return loginShare;
}

// 注册ID
-(void)wxLoginShareRegisterApp{
    [WXApi registerApp:APP_ID_SHARE];
}

// 微信登录
-(void)WXLogin{
    SendAuthReq *req = [[SendAuthReq alloc]init];
    req.scope = @"snsapi_userinfo";
    req.state = @"ViewController";
    req.openID = APP_ID_SHARE;
    [WXApi sendReq:req];
}
-(void)onReq:(BaseReq *)req{
    NSLog(@"微信的回调方法---");
}
-(void)onResp:(BaseResp *)resp{
    NSLog(@"微信的回调方法222---");
    // 微信登录
    //**resp.errCode  0 允许授权登录  -2用户取消
    if ([resp isKindOfClass:[SendAuthResp class]]) {
        if (resp.errCode == 0) {
            SendAuthResp *aresp = (SendAuthResp *)resp;
            [self getAccessTokenWithCode:aresp.code];
              NSLog(@"微信的回调方法333---%@",aresp);
            return;
        }
    }
}

// *  获取access_token
- (void)getAccessTokenWithCode:(NSString *)code
{
    NSString *urlString =[NSString stringWithFormat:@"https://api.weixin.qq.com/sns/oauth2/access_token?appid=%@&secret=%@&code=%@&grant_type=authorization_code",APP_ID_SHARE,APP_SECRET_SHARE,code];
    NSLog(@"urlString = %@",urlString);
    NSURL *url = [NSURL URLWithString:urlString];
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        
        NSString *dataStr = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
        NSData *data = [dataStr dataUsingEncoding:NSUTF8StringEncoding];
        dispatch_async(dispatch_get_main_queue(), ^{
            if (data)
            {
                NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
                NSLog(@"dict = %@",dict);
                /*
                "access_token" = "yDYlmcI4Td1s1zrqjA6v_a0ptx7wEJaKfgr65OMbBecvO4iBYyLujsfHxu82DSGxYqssbMSyiZbHI3XYC2tAJg";  //
                 "expires_in" = 7200;
                 openid = o9TVB1Co3947nBNB51XfQLB7CLSg;
                 "refresh_token" = "-icY6qNcesIqrRY8CXhtDH9kiXrFxdf59GNusPfpk221X-pSCDFDnIKDnAMPGClwqSERrtuyj_dan4vkPBxTfg";
                 scope = "snsapi_userinfo";
                 unionid = o4E2Q1fAj84mf3ziOqrVzjWbxH7I;
                 */
                if ([dict objectForKey:@"errcode"])
                {// 如果这里有值,说明授权失败
                    // 授权失败(用户取消/拒绝)
                    if ([self.delegate respondsToSelector:@selector(wxLoginShareFail:)]) {
                        [self.delegate wxLoginShareFail:dict];
                    }
                }else{
                    [self getUserInfoWithAccessToken:[dict objectForKey:@"access_token"] andOpenId:[dict objectForKey:@"openid"]];
                }
            }
        });
    });
}

//*  获取用户信息
- (void)getUserInfoWithAccessToken:(NSString *)accessToken andOpenId:(NSString *)openId
{
    // 存入本地
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:accessToken forKey:WX_REFRESH_TOKEN];
    [defaults setObject:openId forKey:OPENID];
    [defaults synchronize];
    
    NSString *urlString =[NSString stringWithFormat:@"https://api.weixin.qq.com/sns/userinfo?access_token=%@&openid=%@",accessToken,openId];
    NSLog(@"urlString = %@",urlString);
    NSURL *url = [NSURL URLWithString:urlString];
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        
        NSString *dataStr = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
        NSData *data = [dataStr dataUsingEncoding:NSUTF8StringEncoding];
        dispatch_async(dispatch_get_main_queue(), ^{
            if (data)
            {
                NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
                NSLog(@"dict = %@",dict);
                /**
                 *city = Foshan;
                 country = CN;
                 headimgurl = "http://wx.qlogo.cn/mmopen/vi_32/oXUy91CibcGpekG7sOB7O0icpxq7B3kv4oZyia3AA1mPPjH9qAbA8tG1Xx6WNE03vNwhyibhA7LKSBia0t5qc9dSeow/0";
                 language = "zh_CN";
                 nickname = "\U5929\U9053\U916c\U52e4";
                 openid = o9TVB1Co3947nBNB51XfQLB7CLSg;
                 privilege =     (
                 );
                 province = Guangdong;
                 sex = 1;                 unionid = o4E2Q1fAj84mf3ziOqrVzjWbxH7I;
                 *
                 */
                if ([dict objectForKey:@"errcode"])
                {
                    //AccessToken失效
                    [self getAccessTokenWithRefreshToken:[[NSUserDefaults standardUserDefaults]objectForKey:WX_REFRESH_TOKEN]];
                }else{
                    if ([_delegate respondsToSelector:@selector(wxLoginShareSuccess:)]) {
                        [_delegate wxLoginShareSuccess:dict];
                    }
                }
            }
        });
    });
}

// *  刷新access_token
- (void)getAccessTokenWithRefreshToken:(NSString *)refreshToken
{
    NSString *urlString =[NSString stringWithFormat:@"https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=%@&grant_type=refresh_token&refresh_token=%@",@"wx29c1153063de230b",refreshToken];
    NSLog(@"urlString = %@",urlString);
    NSURL *url = [NSURL URLWithString:urlString];
    
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        
        
        NSString *dataStr = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
        NSData *data = [dataStr dataUsingEncoding:NSUTF8StringEncoding];
        
        dispatch_async(dispatch_get_main_queue(), ^{
            
            if (data)
            {
                NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
                
                if ([dict objectForKey:@"errcode"])
                {
                    //授权过期
                }else{
                    //重新使用AccessToken获取信息
               
                    NSString *token = [[NSUserDefaults standardUserDefaults]objectForKey:WX_REFRESH_TOKEN];
                    NSString *openID = [[NSUserDefaults standardUserDefaults]objectForKey:OPENID];

                    if([dict objectForKey:@"access_token"] && [dict objectForKey:@"access_token"]!=nil){
                        token = [dict objectForKey:@"access_token"];
                    }
                    if([dict objectForKey:@"openid"] && [dict objectForKey:@"openid"]!=nil){
                        openID = [dict objectForKey:@"openid"];
                    }
                    [self getUserInfoWithAccessToken:token andOpenId:openID];
                }
            }
        });
    });
    
}
@end

三、在点击登录的地方

iOS 第三方登录(原生)_第10张图片
点击登录的文件.png
iOS 第三方登录(原生)_第11张图片
点击登录的类.png

你可能感兴趣的:(iOS 第三方登录(原生))