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

#import "LoginController.h"
#import "LoginView.h"
#import "PrivacyViewController.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) {
            [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 = @"123";
            // 第三方向微信终端发送一个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:[[PrivacyViewController alloc] initWithTitle:@"用户服务协议" link:[NSURL URLWithString:UserServiceAgreement] isDetail:YES] animated:YES];
        }
            break;
        case 5: // 隐私保护指引
        {
            [self.navigationController pushViewController:[[PrivacyViewController alloc] initWithTitle:@"隐私政策" link:[NSURL URLWithString:PrivacyPolicy] isDetail:YES] animated:YES];
        }
            break;
        default:
            break;
    }
}

#pragma mark - ASAuthorizationControllerDelegate
#pragma mark - 授权成功地回调
- (void)authorizationController:(ASAuthorizationController *)controller didCompleteWithAuthorization:(ASAuthorization *)authorization  API_AVAILABLE(ios(13.0)) {
    NSLog(@"%s", __FUNCTION__);
    NSLog(@"%@", controller);
    NSLog(@"%@", authorization);
    NSLog(@"authorization.credential:%@", authorization.credential);
    if ([authorization.credential isKindOfClass:[ASAuthorizationAppleIDCredential class]]) {
        ASAuthorizationAppleIDCredential *credential = authorization.credential;
        NSLog(@"credential = %@", credential);
        
        NSString *state = credential.state;
        NSString *userID = credential.user;
        NSPersonNameComponents *fullName = credential.fullName;
        NSString *email = credential.email;
        NSString *authorizationCode = [[NSString alloc] initWithData:credential.authorizationCode encoding:NSUTF8StringEncoding]; // 验证 token
        NSString *identityToken = [[NSString alloc] initWithData:credential.identityToken encoding:NSUTF8StringEncoding]; // 用户 token
        ASUserDetectionStatus realUserStatus = credential.realUserStatus;
        NSArray *authorizedScopes = credential.authorizedScopes;
        
        NSLog(@"ios登陆成功 state: %@\nuserID: %@\nfullName: %@\nemail: %@\nauthorizationCode: %@\nidentityToken: %@\nrealUserStatus: %@\nauthorizedScopes: %@",
              state,
              userID,
              fullName,
              email,
              authorizationCode,
              identityToken,
              @(realUserStatus),
              authorizedScopes);
        
        //        // 用户登录使用ASAuthorizationAppleIDCredential
        //        ASAuthorizationAppleIDCredential *appleIDCredential = authorization.credential;
        //        // 用户ID: user,苹果用户唯一标识,该值在同一个开发者账号下的所有 App 下是一样的。
        //        NSString *user = appleIDCredential.user;
        //        // 使用钥匙串的方式保存用户的唯一信息
        //        NSString *bundleId = [NSBundle mainBundle].bundleIdentifier;
        //
        //        // 验证数据: identityToken , authorizationCode ,用于服务端验证授权请求的合法性。
        //        NSString *authorizationCode = [[NSString alloc] initWithData:appleIDCredential.authorizationCode encoding:NSUTF8StringEncoding];
        //        NSString *identityToken = [[NSString alloc] initWithData:appleIDCredential.identityToken encoding:NSUTF8StringEncoding];
        //
        //        NSLog(@"user:%@, bundleId:%@, authorizationCode:%@, identityToken:%@", user, bundleId, authorizationCode, identityToken);
        
        // 通过钥匙串保存用户授权信息
        // [SAMKeychain setPassword:user forService:bundleId account:ShareCurrentIdentifier];
    } else if ([authorization.credential isKindOfClass:[ASPasswordCredential class]]) {
        // 用户登录使用现有的密码凭证
        ASPasswordCredential *passwordCredential = authorization.credential;
        // 密码凭证对象的用户标识 用户的唯一标识
        NSString *user = passwordCredential.user;
        // 密码凭证对象的密码
        NSString *password = passwordCredential.password;
        
        NSLog(@"user:%@, password:%@", user, password);
    } else {
        NSLog(@"授权信息均不符");
    }
}

#pragma mark - 授权失败的回调
- (void)authorizationController:(ASAuthorizationController *)controller didCompleteWithError:(NSError *)error  API_AVAILABLE(ios(13.0)) {
    NSLog(@"%s", __FUNCTION__);
    NSLog(@"错误信息:%@", error);
    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;
    }
    NSLog(@"controller requests:%@, errorMsg:%@", controller.authorizationRequests, errorMsg);
}

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

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

@end