LoginController.m
7.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
//
// 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