LoginController.m 7.7 KB
//
//  LoginController.m
//  DreamSleep
//
//  Created by peter on 2022/4/17.
//

#import "LoginController.h"
#import "LoginView.h"
#import <AuthenticationServices/AuthenticationServices.h>
#import "UserRequestModel.h"

@interface LoginController () <LoginViewDelegate, ASAuthorizationControllerDelegate, ASAuthorizationControllerPresentationContextProviding>
@property (strong, nonatomic) LoginView *loginView;
@end

@implementation LoginController

- (void)loadView {
    self.view = self.loginView;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(wxLoginAuth:) name:WXLoginAuthNoti object:nil];
}

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    self.navigationController.navigationBarHidden = YES;
}

#pragma mark - 设置状态栏文字颜色
- (UIStatusBarStyle)preferredStatusBarStyle {
    return [self.dk_manager.themeVersion isEqualToString:DKThemeVersionNormal] ? UIStatusBarStyleDefault : UIStatusBarStyleLightContent;
}

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self name:WXLoginAuthNoti object:nil];
}

- (void)wxLoginAuth:(NSNotification *)noti {
    NSString *code = noti.object;
    // 发送微信登录请求
    [UserRequestModel wxLoginWithCode:code completion:^(UserRequestModel * _Nonnull requestModel) {
        if (requestModel.resCode == DSResCodeSuccess) {
            [DSProgressHUD showToast:@"登录成功"];
            if (self.successBlock) {self.successBlock(); }
            [LoginUtils updateDataNotiAfterLoginSuccess];
            [self dismissViewControllerAnimated:YES completion:nil];
        } else {
            [DSProgressHUD showToast:requestModel.errorInfo];
        }
    }];
}

#pragma mark - LoginViewDelegate
- (void)sendClickAction:(NSInteger)tag {
    switch (tag) {
        case 1: // 微信登录
        {
            // 构造SendAuthReq结构体
            SendAuthReq* req = [[SendAuthReq alloc] init];
            req.scope = @"snsapi_userinfo";
            req.state = @"login";
            // 第三方向微信终端发送一个SendAuthReq消息结构
            [WXApi sendReq:req completion:^(BOOL success) {
                DSLog(@"调起微信成功...");
            }];
        }
            break;
        case 2: // Apple登录
        {
            if (@available(iOS 13.0, *)) {
                // 基于用户的Apple ID授权用户,生成用户授权请求的一种机制
                ASAuthorizationAppleIDProvider *appleIDProvider = [ASAuthorizationAppleIDProvider new];
                // 创建新的AppleID 授权请求
                ASAuthorizationAppleIDRequest *request = appleIDProvider.createRequest;
                // 在用户授权期间请求的联系信息
                request.requestedScopes = @[ASAuthorizationScopeFullName, ASAuthorizationScopeEmail];
                // 由ASAuthorizationAppleIDProvider创建的授权请求 管理授权请求的控制器
                ASAuthorizationController *controller = [[ASAuthorizationController alloc] initWithAuthorizationRequests:@[request]];
                // 设置授权控制器通知授权请求的成功与失败的代理
                controller.delegate = self;
                // 设置提供 展示上下文的代理,在这个上下文中 系统可以展示授权界面给用户
                controller.presentationContextProvider = self;
                // 在控制器初始化期间启动授权流
                [controller performRequests];
            }
        }
            break;
        case 3: // 随便看看
        {
            [self dismissViewControllerAnimated:YES completion:nil];
        }
            break;
        case 4: // 许可协议
        {
            [self.navigationController pushViewController:[[DsWebController alloc] initWithTitle:@"用户服务协议" link:UserServiceAgreement] animated:YES];
        }
            break;
        case 5: // 隐私保护指引
        {
            [self.navigationController pushViewController:[[DsWebController alloc] initWithTitle:@"隐私政策" link:PrivacyPolicy] animated:YES];
        }
            break;
        default:
            break;
    }
}

#pragma mark - ASAuthorizationControllerDelegate
#pragma mark - 授权成功地回调
- (void)authorizationController:(ASAuthorizationController *)controller didCompleteWithAuthorization:(ASAuthorization *)authorization  API_AVAILABLE(ios(13.0)) {
    if ([authorization.credential isKindOfClass:[ASAuthorizationAppleIDCredential class]]) {
        ASAuthorizationAppleIDCredential *credential = authorization.credential;
        NSString *userID = credential.user;
        NSString *authorizationCode = [[NSString alloc] initWithData:credential.authorizationCode encoding:NSUTF8StringEncoding]; // 验证 token
        NSString *identityToken = [[NSString alloc] initWithData:credential.identityToken encoding:NSUTF8StringEncoding]; // 用户 token
        DSLog(@"ios登陆成功:userID: %@\n,authorizationCode: %@\n,identityToken: %@", userID, authorizationCode, identityToken);
        
        // 发送苹果登录请求
        [UserRequestModel appleLoginWithUser:userID identityToken:identityToken authorizationCode:authorizationCode completion:^(UserRequestModel * _Nonnull requestModel) {
            if (requestModel.resCode == DSResCodeSuccess) {
                [DSProgressHUD showToast:@"登录成功"];
                if (self.successBlock) {self.successBlock(); }
                [LoginUtils updateDataNotiAfterLoginSuccess];
                [self dismissViewControllerAnimated:YES completion:nil];
            } else {
                [DSProgressHUD showToast:requestModel.errorInfo];
            }
        }];
    } else if ([authorization.credential isKindOfClass:[ASPasswordCredential class]]) {
        // 用户登录使用现有的密码凭证
        ASPasswordCredential *passwordCredential = authorization.credential;
        // 密码凭证对象的用户标识 用户的唯一标识
        NSString *user = passwordCredential.user;
        // 密码凭证对象的密码
        NSString *password = passwordCredential.password;
        DSLog(@"user:%@, password:%@", user, password);
    } else {
        DSLog(@"授权信息均不符");
    }
}

#pragma mark - 授权失败的回调
- (void)authorizationController:(ASAuthorizationController *)controller didCompleteWithError:(NSError *)error  API_AVAILABLE(ios(13.0)) {
    NSString *errorMsg = nil;
    switch (error.code) {
        case ASAuthorizationErrorCanceled:
            errorMsg = @"用户取消了授权请求";
            break;
        case ASAuthorizationErrorFailed:
            errorMsg = @"授权请求失败";
            break;
        case ASAuthorizationErrorInvalidResponse:
            errorMsg = @"授权请求响应无效";
            break;
        case ASAuthorizationErrorNotHandled:
            errorMsg = @"未能处理授权请求";
            break;
        case ASAuthorizationErrorUnknown:
            errorMsg = @"授权请求失败未知原因";
            break;
        case ASAuthorizationErrorNotInteractive:
            errorMsg = @"ASAuthorizationErrorNotInteractive";
            break;
    }
    DSLog(@"controller requests:%@, errorMsg:%@", controller.authorizationRequests, errorMsg);
}

#pragma mark - ASAuthorizationControllerPresentationContextProviding
#pragma mark - 告诉代理应该在哪个window 展示内容给用户
- (ASPresentationAnchor)presentationAnchorForAuthorizationController:(ASAuthorizationController *)controller  API_AVAILABLE(ios(13.0)){
    DSLog(@"调用展示window方法:%s", __FUNCTION__);
    // 返回window
    return self.view.window;
}

- (LoginView *)loginView {
    if (!_loginView) {
        _loginView = [[LoginView alloc] initWithDelegate:self];
    }
    return _loginView;
}

@end