Commit 2bf37f4f103fdb282897760b941225512fbf9477
1 parent
cb0afa65
no message
Showing
7 changed files
with
255 additions
and
181 deletions
CNLiveLoginModule.podspec
CNLiveLoginModule/Classes/Controller/CNLiveCompleteInfoController.m
CNLiveLoginModule/Classes/Model/CNLiveLoginRequestModel.h
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveLoginRequestModel.h | |
| 3 | +// CNLiveLoginModule | |
| 4 | +// | |
| 5 | +// Created by 153993236@qq.com on 11/12/2019. | |
| 6 | +// Copyright (c) 2019 153993236@qq.com. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +#import <Foundation/Foundation.h> | |
| 10 | + | |
| 11 | +NS_ASSUME_NONNULL_BEGIN | |
| 12 | + | |
| 13 | +@interface CNLiveLoginRequestModel : NSObject | |
| 14 | ++ (void)getTIMLoginToken:(NSString *)identifier successBlock:(void (^)(NSString *))successBlock failedBlock:(void (^)(int, NSString *))errorBlock; | |
| 15 | + | |
| 16 | +@end | |
| 17 | + | |
| 18 | +NS_ASSUME_NONNULL_END | ... | ... |
CNLiveLoginModule/Classes/Model/CNLiveLoginRequestModel.m
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveLoginRequestModel.m | |
| 3 | +// CNLiveLoginModule | |
| 4 | +// | |
| 5 | +// Created by 153993236@qq.com on 11/12/2019. | |
| 6 | +// Copyright (c) 2019 153993236@qq.com. All rights reserved. | |
| 7 | +// | |
| 8 | + | |
| 9 | +#import "CNLiveLoginRequestModel.h" | |
| 10 | +#import "CNUserInfoManager.h" | |
| 11 | +#import "CNLiveEnvironment.h" | |
| 12 | +#import <CNLiveRequestBastKit/CNLiveNetworking.h> | |
| 13 | + | |
| 14 | +@implementation CNLiveLoginRequestModel | |
| 15 | + | |
| 16 | +//获取token | |
| 17 | ++ (void)getTIMLoginToken:(NSString *)identifier successBlock:(void (^)(NSString *))successBlock failedBlock:(void (^)(int, NSString *))errorBlock { | |
| 18 | + | |
| 19 | + NSDictionary *params = @{@"appId":AppId, | |
| 20 | + @"plat":@"i", | |
| 21 | + @"sdkAppId":SdkAppId, | |
| 22 | + @"identifier":identifier}; | |
| 23 | + | |
| 24 | + [CNLiveNetworking setupShowDataResult:NO]; | |
| 25 | + [CNLiveNetworking setAllowRequestDefaultArgument:YES]; | |
| 26 | + [CNLiveNetworking requestNetworkWithMethod:CNLiveRequestMethodPOST URLString:TIM_GetTokenUrl Param:params CacheType:CNLiveNetworkCacheTypeNetworkOnly CompletionBlock:^(NSURLSessionTask *requestTask, id responseObject, NSError *error) { | |
| 27 | + if (!error) { | |
| 28 | + if (responseObject && ![responseObject isKindOfClass:[NSNull class]] && [responseObject isKindOfClass:[NSDictionary class]] && [[responseObject allKeys] containsObject:@"data"] && [[responseObject objectForKey:@"data"] isKindOfClass:[NSDictionary class]]) { | |
| 29 | + NSNumber *code = responseObject[@"errorCode"]; | |
| 30 | + if (code && code.intValue == 0) { | |
| 31 | +// self.userSig = responseObject[@"data"][@"token"]; | |
| 32 | + if (successBlock) { | |
| 33 | + successBlock(responseObject[@"data"][@"token"]); | |
| 34 | + } | |
| 35 | + } else { | |
| 36 | + if (errorBlock) { | |
| 37 | + errorBlock(31012, @"获取token失败"); | |
| 38 | + } | |
| 39 | + } | |
| 40 | + | |
| 41 | + } | |
| 42 | + | |
| 43 | + }else{ | |
| 44 | + if (errorBlock) errorBlock(31012,@"Token acquisition failure"); | |
| 45 | + } | |
| 46 | + }]; | |
| 47 | + | |
| 48 | +} | |
| 49 | +@end | ... | ... |
CNLiveLoginModule/Classes/View/CNLiveCompleteInfoView.m
| ... | ... | @@ -11,13 +11,22 @@ |
| 11 | 11 | #import "YYKit.h" |
| 12 | 12 | #import "QMUIKit.h" |
| 13 | 13 | |
| 14 | +#import <CNLiveUserSystemSDK/CNLiveUserSystemCenter.h> | |
| 15 | +#import <CNLiveUserSystemSDK/CNLiveUserSystemTypeDef.h> | |
| 14 | 16 | #import "CNUserInfoManager.h" |
| 15 | - | |
| 17 | +#import "CNLiveEnvironment.h" | |
| 18 | +#import "CNLiveManager.h" | |
| 16 | 19 | #import <AVFoundation/AVCaptureDevice.h> |
| 17 | 20 | #import <AVFoundation/AVMediaFormat.h> |
| 18 | 21 | #import "XFCameraController.h" |
| 19 | 22 | #import "TZImagePickerController.h" |
| 20 | 23 | |
| 24 | +#import "TIMAdapter.h" | |
| 25 | +#import "CommonLibrary.h" | |
| 26 | +#import "NBSAppAgent.h" | |
| 27 | +#import "CNLiveBusinessTools.h" | |
| 28 | +#import "CNLiveLoginRequestModel.h" | |
| 29 | + | |
| 21 | 30 | @interface CNLiveCompleteInfoView()<UITextFieldDelegate,UIImagePickerControllerDelegate,UINavigationControllerDelegate,TZImagePickerControllerDelegate,QMUIAlertControllerDelegate>{ |
| 22 | 31 | UIImage *_image; |
| 23 | 32 | } |
| ... | ... | @@ -25,6 +34,7 @@ |
| 25 | 34 | @property (nonatomic, weak) UIButton *head; |
| 26 | 35 | @property (nonatomic, weak) CNLiveLoginTextField *nickname; |
| 27 | 36 | @property (nonatomic, weak) UIButton *next; |
| 37 | +@property (nonatomic, strong) IMALoginParam *loginParam; | |
| 28 | 38 | |
| 29 | 39 | @end |
| 30 | 40 | @implementation CNLiveCompleteInfoView |
| ... | ... | @@ -37,11 +47,13 @@ static const NSInteger timeValue = 1.5; |
| 37 | 47 | if (self) { |
| 38 | 48 | self.userInteractionEnabled = YES; |
| 39 | 49 | [self createSubviews:frame]; |
| 50 | + _loginParam = [[IMALoginParam alloc] init]; | |
| 40 | 51 | _image = nil; |
| 41 | 52 | } |
| 42 | 53 | return self; |
| 43 | 54 | |
| 44 | 55 | } |
| 56 | + | |
| 45 | 57 | - (void)createSubviews:(CGRect)frame{ |
| 46 | 58 | UIButton *head = [UIButton buttonWithType:UIButtonTypeCustom]; |
| 47 | 59 | head.frame = CGRectMake((frame.size.width-80)/2.0, 0, 80, 80); |
| ... | ... | @@ -85,30 +97,28 @@ static const NSInteger timeValue = 1.5; |
| 85 | 97 | self.next = next; |
| 86 | 98 | |
| 87 | 99 | } |
| 100 | + | |
| 88 | 101 | - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { |
| 89 | 102 | [self endEditing:YES]; |
| 90 | 103 | |
| 91 | 104 | } |
| 105 | + | |
| 92 | 106 | #pragma mark - UITextFieldDelegate |
| 93 | 107 | - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{ |
| 94 | 108 | if ([textField isEqual:_nickname]) { |
| 95 | 109 | return YES; |
| 96 | - | |
| 97 | 110 | } |
| 98 | 111 | else { |
| 99 | 112 | return YES; |
| 100 | - | |
| 101 | 113 | } |
| 102 | 114 | } |
| 103 | 115 | |
| 104 | 116 | - (void)textFieldDidChange:(UITextField *)textField { |
| 105 | 117 | if (![_nickname.text isEqualToString:@""]) { |
| 106 | 118 | _next.enabled = YES; |
| 107 | - | |
| 108 | 119 | } |
| 109 | 120 | else { |
| 110 | 121 | _next.enabled = NO; |
| 111 | - | |
| 112 | 122 | } |
| 113 | 123 | |
| 114 | 124 | } |
| ... | ... | @@ -148,7 +158,7 @@ static const NSInteger timeValue = 1.5; |
| 148 | 158 | __strong typeof(weakSelf) strongSelf = weakSelf; |
| 149 | 159 | if(!strongSelf) return ; |
| 150 | 160 | __strong typeof(strongSelf) weakSelf = strongSelf; |
| 151 | - [strongSelf getAVAuthorizationStatus:^{ | |
| 161 | + [CNLiveAuthorizationManager getAVAuthorizationStatus:^{ | |
| 152 | 162 | __strong typeof(weakSelf) strongSelf = weakSelf; |
| 153 | 163 | if(!strongSelf) return ; |
| 154 | 164 | XFCameraController *cameraController = [[XFCameraController alloc] init]; |
| ... | ... | @@ -160,7 +170,8 @@ static const NSInteger timeValue = 1.5; |
| 160 | 170 | __strong typeof(weakSelf) strongSelf = weakSelf; |
| 161 | 171 | if(!strongSelf) return ; |
| 162 | 172 | strongSelf->_image = image; |
| 163 | - [strongSelf.head setImage:image forState:UIControlStateNormal]; | |
| 173 | + [strongSelf modifyIcon]; | |
| 174 | +// [strongSelf.head setImage:image forState:UIControlStateNormal]; | |
| 164 | 175 | |
| 165 | 176 | dispatch_async(dispatch_get_main_queue(), ^{ |
| 166 | 177 | [weakCameraController dismissViewControllerAnimated:YES completion:nil]; |
| ... | ... | @@ -175,7 +186,7 @@ static const NSInteger timeValue = 1.5; |
| 175 | 186 | __strong typeof(weakSelf) strongSelf = weakSelf; |
| 176 | 187 | if(!strongSelf) return ; |
| 177 | 188 | __strong typeof(strongSelf) weakSelf = strongSelf; |
| 178 | - [strongSelf getPHAuthorizationStatus:^{ | |
| 189 | + [CNLiveAuthorizationManager getPHAuthorizationStatus:^{ | |
| 179 | 190 | __strong typeof(weakSelf) strongSelf = weakSelf; |
| 180 | 191 | if(!strongSelf) return ; |
| 181 | 192 | TZImagePickerController *picker = [[TZImagePickerController alloc] initWithMaxImagesCount:1 delegate:strongSelf]; |
| ... | ... | @@ -187,7 +198,8 @@ static const NSInteger timeValue = 1.5; |
| 187 | 198 | __strong typeof(weakSelf) strongSelf = weakSelf; |
| 188 | 199 | if(!strongSelf) return ; |
| 189 | 200 | strongSelf->_image = [photos firstObject]; |
| 190 | - [strongSelf.head setImage:[photos firstObject] forState:UIControlStateNormal]; | |
| 201 | + [strongSelf modifyIcon]; | |
| 202 | +// [strongSelf.head setImage:[photos firstObject] forState:UIControlStateNormal]; | |
| 191 | 203 | }]; |
| 192 | 204 | [(UIViewController *)strongSelf.delegate presentViewController:picker animated:YES completion:nil]; |
| 193 | 205 | }]; |
| ... | ... | @@ -219,38 +231,111 @@ static const NSInteger timeValue = 1.5; |
| 219 | 231 | [alertController showWithAnimated:YES]; |
| 220 | 232 | |
| 221 | 233 | } |
| 234 | + | |
| 222 | 235 | - (void)didHideAlertController:(QMUIAlertController *)alertController{ |
| 223 | 236 | self.head.userInteractionEnabled = YES; |
| 224 | - | |
| 225 | 237 | } |
| 238 | + | |
| 239 | +#pragma mark - 响应方法 | |
| 226 | 240 | - (void)nextDidClicked:(UIButton *)btn{ |
| 227 | 241 | [_nickname resignFirstResponder]; |
| 228 | 242 | if ([_nickname.text isEqualToString:@""]) { |
| 229 | 243 | [QMUITips showError:@"请输入昵称" inView:self.superview hideAfterDelay:timeValue]; |
| 230 | 244 | return; |
| 231 | 245 | } |
| 232 | - btn.userInteractionEnabled = NO; | |
| 246 | + self.next.userInteractionEnabled = NO; | |
| 233 | 247 | [self.superview endEditing:YES]; |
| 234 | - /** | |
| 235 | - * 修改昵称和头像 | |
| 236 | - **/ | |
| 248 | + [self modifyNickName]; | |
| 249 | +} | |
| 250 | + | |
| 251 | +// 修改头像 | |
| 252 | +- (void)modifyIcon { | |
| 253 | + [QMUITips showLoading:@"修改中" inView:self.superview]; | |
| 254 | + [CNLiveUserSystemCenter uploadIconWithUid:CNUserShareModel.uid icon:_image success:^(id result) { | |
| 255 | + [QMUITips hideAllToastInView:self.superview animated:YES]; | |
| 256 | + NSLog(@"result:%@",result); | |
| 257 | + NSString *deFaceUrl = result[@"data"][@"faceUrl"]; | |
| 258 | + NSString *faceUrl = @""; | |
| 259 | + if ([deFaceUrl containsString:@"/mobile/images/mobilehead/default/"]) { | |
| 260 | + faceUrl = CNLiveNetAddDefaultHead; | |
| 261 | + }else{ | |
| 262 | + faceUrl = deFaceUrl; | |
| 263 | + } | |
| 264 | + CNUserShareModel.faceUrl = faceUrl; | |
| 265 | + [self.head setImage:self->_image forState:UIControlStateNormal]; | |
| 266 | + | |
| 267 | + } failure:^(NSDictionary *errorDic) { | |
| 268 | + [QMUITips hideAllToastInView:self.superview animated:YES]; | |
| 269 | + [QMUITips showError:errorDic[@"errorMessage"] inView:self.superview hideAfterDelay:timeValue]; | |
| 270 | + }]; | |
| 271 | + | |
| 272 | +} | |
| 273 | + | |
| 274 | +// 修改名字 | |
| 275 | +- (void)modifyNickName { | |
| 276 | + [QMUITips showLoading:@"修改中" inView:self.superview]; | |
| 237 | 277 | __weak typeof(self) weakSelf = self; |
| 238 | -// [XWUserRequest updateUserInfoWithUid:User_ID name:_nickname.text head:_image success:^(id _Nonnull result) { | |
| 239 | -// btn.userInteractionEnabled = YES; | |
| 240 | -// __strong typeof(weakSelf) strongSelf = weakSelf; | |
| 241 | -// if(!strongSelf) return; | |
| 242 | -// if (strongSelf.delegate && [strongSelf.delegate respondsToSelector:@selector(loginSuccess:result:)]) { | |
| 243 | -// [strongSelf.delegate loginSuccess:strongSelf result:result]; | |
| 244 | -// | |
| 245 | -// } | |
| 246 | -// | |
| 247 | -// } failure:^(NSDictionary * _Nonnull errorDic) { | |
| 248 | -// btn.userInteractionEnabled = YES; | |
| 249 | -// __strong typeof(weakSelf) strongSelf = weakSelf; | |
| 250 | -// if(!strongSelf) return; | |
| 251 | -// [XWAlertView alertErrorViewWithTextMessage:@"登录失败"]; | |
| 252 | -// }]; | |
| 278 | + [CNLiveUserSystemCenter modifyUserInfoType:UserInfoTypeNickName uid:CNUserShareModel.uid modifyInfo:_nickname.text success:^(id result) { | |
| 279 | + __strong typeof(weakSelf) strongSelf = weakSelf; | |
| 280 | + if(!strongSelf) return; | |
| 281 | + strongSelf.next.userInteractionEnabled = YES; | |
| 282 | + CNUserShareModel.nickname = strongSelf.nickname.text; | |
| 283 | + [QMUITips hideAllToastInView:strongSelf.superview animated:YES]; | |
| 284 | + if (strongSelf.delegate && [strongSelf.delegate respondsToSelector:@selector(loginSuccess:result:)]) { | |
| 285 | + [strongSelf.delegate loginSuccess:strongSelf result:result]; | |
| 286 | + } | |
| 287 | + | |
| 288 | + [QMUITips showLoading:@"正在连接服务器..." inView:strongSelf.superview]; | |
| 289 | + [strongSelf syncIM]; | |
| 290 | + | |
| 291 | + } failure:^(NSDictionary *errorDic) { | |
| 292 | + __strong typeof(weakSelf) strongSelf = weakSelf; | |
| 293 | + if(!strongSelf) return; | |
| 294 | + strongSelf.next.userInteractionEnabled = YES; | |
| 295 | + [QMUITips hideAllToastInView:strongSelf.superview animated:YES]; | |
| 296 | + [QMUITips showError:[errorDic objectForKey:@"errorMessage"] inView:strongSelf.superview hideAfterDelay:timeValue]; | |
| 297 | + }]; | |
| 298 | + | |
| 299 | +} | |
| 300 | + | |
| 301 | +// 连接IM | |
| 302 | +- (void)syncIM { | |
| 303 | + [CNLiveLoginRequestModel getTIMLoginToken:CNUserShareModel.uid successBlock:^(NSString *token) { | |
| 304 | + self.loginParam.identifier = CNUserShareModel.uid; | |
| 305 | + self.loginParam.userSig = token; | |
| 306 | + self.loginParam.tokenTime = [[NSDate date] timeIntervalSince1970]; | |
| 307 | + | |
| 308 | + [[IMAPlatform sharedInstance] login:self.loginParam succ:^{ | |
| 309 | + [QMUITips hideAllToastInView:self.superview animated:YES]; | |
| 310 | + [NBSAppAgent setUserIdentifier:[CNLiveBusinessTools getSidIdfv]]; | |
| 311 | + [self.loginParam saveToLocal]; | |
| 312 | +// [[AppDelegate sharedAppDelegate] registNotification]; | |
| 313 | + [[IMAPlatform sharedInstance] configHost:self.loginParam]; | |
| 314 | + | |
| 315 | +// [[AppDelegate sharedAppDelegate] enterMainUI]; | |
| 253 | 316 | |
| 317 | + //游客浏览后登陆 | |
| 318 | +// [self showTouristsLoginTipsView]; | |
| 319 | + | |
| 320 | + [[IMAPlatform sharedInstance].host asyncSetAllowType:TIM_FRIEND_NEED_CONFIRM succ:^{ | |
| 321 | + NSLog(@"asyncSetAllowType Suc"); | |
| 322 | + [self.loginParam saveToLocal]; | |
| 323 | + } fail:^(int code, NSString *msg) { | |
| 324 | + NSLog(@"asyncSetAllowType failed : %@", msg); | |
| 325 | + }]; | |
| 326 | + | |
| 327 | + } fail:^(int code, NSString *msg) { | |
| 328 | + NSLog(@"login failed : %@", msg); | |
| 329 | + [QMUITips hideAllToastInView:self.superview animated:YES]; | |
| 330 | + [QMUITips showError:msg inView:self.superview hideAfterDelay:timeValue]; | |
| 331 | + }]; | |
| 332 | + | |
| 333 | + } failedBlock:^(int code, NSString *errorMsg) { | |
| 334 | + NSLog(@"token code:%d error:%@", code, errorMsg); | |
| 335 | + [QMUITips hideAllToastInView:self.superview animated:YES]; | |
| 336 | + [QMUITips showError:errorMsg inView:self.superview hideAfterDelay:timeValue]; | |
| 337 | + }]; | |
| 338 | + | |
| 254 | 339 | } |
| 255 | 340 | |
| 256 | 341 | /* |
| ... | ... | @@ -277,92 +362,4 @@ static const NSInteger timeValue = 1.5; |
| 277 | 362 | return image?image:[UIImage imageNamed:imageName inBundle:[NSBundle mainBundle] compatibleWithTraitCollection:nil]; |
| 278 | 363 | } |
| 279 | 364 | |
| 280 | -- (void)getAVAuthorizationStatus:(void (^)(void))block{ | |
| 281 | - AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; | |
| 282 | - if (device) { | |
| 283 | - AVAuthorizationStatus status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo]; | |
| 284 | - switch (status) { | |
| 285 | - case AVAuthorizationStatusNotDetermined: { | |
| 286 | - [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) { | |
| 287 | - if (granted) { | |
| 288 | - dispatch_sync(dispatch_get_main_queue(), ^{ | |
| 289 | - block(); | |
| 290 | - }); | |
| 291 | - NSLog(@"用户第一次同意了访问相机权限 - - %@", [NSThread currentThread]); | |
| 292 | - } else { | |
| 293 | - NSLog(@"用户第一次拒绝了访问相机权限 - - %@", [NSThread currentThread]); | |
| 294 | - } | |
| 295 | - }]; | |
| 296 | - break; | |
| 297 | - } | |
| 298 | - case AVAuthorizationStatusAuthorized: { | |
| 299 | - block(); | |
| 300 | - break; | |
| 301 | - } | |
| 302 | - case AVAuthorizationStatusDenied: { | |
| 303 | - NSDictionary *infoDict = [[NSBundle mainBundle] infoDictionary]; | |
| 304 | - NSString *app_Name = [infoDict objectForKey:@"CFBundleDisplayName"]; | |
| 305 | - if (app_Name == nil) { | |
| 306 | - app_Name = [infoDict objectForKey:@"CFBundleName"]; | |
| 307 | - } | |
| 308 | - NSString *messageString = [NSString stringWithFormat:@"请在iPhone的\"设置 - 隐私 - 相机\"选项中,允许%@访问你的相机", app_Name]; | |
| 309 | - UIAlertController *alertC = [UIAlertController alertControllerWithTitle:nil message:messageString preferredStyle:(UIAlertControllerStyleAlert)]; | |
| 310 | - UIAlertAction *alertA = [UIAlertAction actionWithTitle:@"好" style:(UIAlertActionStyleDefault) handler:^(UIAlertAction * _Nonnull action) { | |
| 311 | - | |
| 312 | - }]; | |
| 313 | - | |
| 314 | - [alertC addAction:alertA]; | |
| 315 | - [(UIViewController *)self.delegate presentViewController:alertC animated:YES completion:nil]; | |
| 316 | - break; | |
| 317 | - } | |
| 318 | - case AVAuthorizationStatusRestricted: { | |
| 319 | - NSLog(@"因为系统原因, 无法访问相册"); | |
| 320 | - break; | |
| 321 | - } | |
| 322 | - | |
| 323 | - default: | |
| 324 | - break; | |
| 325 | - } | |
| 326 | - return; | |
| 327 | - } | |
| 328 | - [QMUITips showError:@"未检测到您的摄像头" inView:self.superview hideAfterDelay:timeValue]; | |
| 329 | -} | |
| 330 | - | |
| 331 | -- (void)getPHAuthorizationStatus:(void (^)(void))block{ | |
| 332 | - // 1.获取当前App的相册授权状态 | |
| 333 | - PHAuthorizationStatus authorizationStatus = [PHPhotoLibrary authorizationStatus]; | |
| 334 | - | |
| 335 | - // 2.判断授权状态 | |
| 336 | - if (authorizationStatus == PHAuthorizationStatusAuthorized) { | |
| 337 | - // 2.1 如果已经授权, 保存图片(调用步骤2的方法) | |
| 338 | - block(); | |
| 339 | - | |
| 340 | - } else if (authorizationStatus == PHAuthorizationStatusNotDetermined) { // 如果没决定, 弹出指示框, 让用户选择 | |
| 341 | - [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) { | |
| 342 | - // 如果用户选择授权, 则保存图片 | |
| 343 | - if (status == PHAuthorizationStatusAuthorized) { | |
| 344 | - dispatch_async(dispatch_get_main_queue(), ^{ | |
| 345 | - block(); | |
| 346 | - }); | |
| 347 | - } | |
| 348 | - }]; | |
| 349 | - | |
| 350 | - } else { | |
| 351 | - NSDictionary *infoDict = [[NSBundle mainBundle] infoDictionary]; | |
| 352 | - NSString *app_Name = [infoDict objectForKey:@"CFBundleDisplayName"]; | |
| 353 | - if (app_Name == nil) { | |
| 354 | - app_Name = [infoDict objectForKey:@"CFBundleName"]; | |
| 355 | - } | |
| 356 | - NSString *messageString = [NSString stringWithFormat:@"请在iPhone的\"设置 - 隐私 - 相机\"选项中,允许%@访问你的相册", app_Name]; | |
| 357 | - UIAlertController *alertC = [UIAlertController alertControllerWithTitle:nil message:messageString preferredStyle:(UIAlertControllerStyleAlert)]; | |
| 358 | - UIAlertAction *alertA = [UIAlertAction actionWithTitle:@"好" style:(UIAlertActionStyleDefault) handler:^(UIAlertAction * _Nonnull action) { | |
| 359 | - | |
| 360 | - }]; | |
| 361 | - | |
| 362 | - [alertC addAction:alertA]; | |
| 363 | - [(UIViewController *)self.delegate presentViewController:alertC animated:YES completion:nil]; | |
| 364 | - } | |
| 365 | -} | |
| 366 | - | |
| 367 | - | |
| 368 | 365 | @end | ... | ... |
Example/CNLiveLoginModule.xcodeproj/project.pbxproj
| ... | ... | @@ -207,8 +207,8 @@ |
| 207 | 207 | 6003F586195388D20070C39A /* Sources */, |
| 208 | 208 | 6003F587195388D20070C39A /* Frameworks */, |
| 209 | 209 | 6003F588195388D20070C39A /* Resources */, |
| 210 | - CA7AE7B7AD9C2BF31675019E /* [CP] Embed Pods Frameworks */, | |
| 211 | - 52D60AE0F4D44D07B879A8CD /* [CP] Copy Pods Resources */, | |
| 210 | + 9E665687E99D8511B3D85BB7 /* [CP] Embed Pods Frameworks */, | |
| 211 | + ED94DF5FADC63D17850E55EE /* [CP] Copy Pods Resources */, | |
| 212 | 212 | ); |
| 213 | 213 | buildRules = ( |
| 214 | 214 | ); |
| ... | ... | @@ -321,47 +321,7 @@ |
| 321 | 321 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; |
| 322 | 322 | showEnvVarsInLog = 0; |
| 323 | 323 | }; |
| 324 | - 52D60AE0F4D44D07B879A8CD /* [CP] Copy Pods Resources */ = { | |
| 325 | - isa = PBXShellScriptBuildPhase; | |
| 326 | - buildActionMask = 2147483647; | |
| 327 | - files = ( | |
| 328 | - ); | |
| 329 | - inputPaths = ( | |
| 330 | - "${PODS_ROOT}/Target Support Files/Pods-CNLiveLoginModule_Example/Pods-CNLiveLoginModule_Example-resources.sh", | |
| 331 | - "${PODS_CONFIGURATION_BUILD_DIR}/CNLiveLoginModule/CNLiveLoginModule.bundle", | |
| 332 | - ); | |
| 333 | - name = "[CP] Copy Pods Resources"; | |
| 334 | - outputPaths = ( | |
| 335 | - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/CNLiveLoginModule.bundle", | |
| 336 | - ); | |
| 337 | - runOnlyForDeploymentPostprocessing = 0; | |
| 338 | - shellPath = /bin/sh; | |
| 339 | - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-CNLiveLoginModule_Example/Pods-CNLiveLoginModule_Example-resources.sh\"\n"; | |
| 340 | - showEnvVarsInLog = 0; | |
| 341 | - }; | |
| 342 | - C744CFA8914B761288845DE6 /* [CP] Check Pods Manifest.lock */ = { | |
| 343 | - isa = PBXShellScriptBuildPhase; | |
| 344 | - buildActionMask = 2147483647; | |
| 345 | - files = ( | |
| 346 | - ); | |
| 347 | - inputFileListPaths = ( | |
| 348 | - ); | |
| 349 | - inputPaths = ( | |
| 350 | - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", | |
| 351 | - "${PODS_ROOT}/Manifest.lock", | |
| 352 | - ); | |
| 353 | - name = "[CP] Check Pods Manifest.lock"; | |
| 354 | - outputFileListPaths = ( | |
| 355 | - ); | |
| 356 | - outputPaths = ( | |
| 357 | - "$(DERIVED_FILE_DIR)/Pods-CNLiveLoginModule_Example-checkManifestLockResult.txt", | |
| 358 | - ); | |
| 359 | - runOnlyForDeploymentPostprocessing = 0; | |
| 360 | - shellPath = /bin/sh; | |
| 361 | - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; | |
| 362 | - showEnvVarsInLog = 0; | |
| 363 | - }; | |
| 364 | - CA7AE7B7AD9C2BF31675019E /* [CP] Embed Pods Frameworks */ = { | |
| 324 | + 9E665687E99D8511B3D85BB7 /* [CP] Embed Pods Frameworks */ = { | |
| 365 | 325 | isa = PBXShellScriptBuildPhase; |
| 366 | 326 | buildActionMask = 2147483647; |
| 367 | 327 | files = ( |
| ... | ... | @@ -374,6 +334,7 @@ |
| 374 | 334 | "${BUILT_PRODUCTS_DIR}/CNLiveBaseTools/CNLiveBaseTools.framework", |
| 375 | 335 | "${BUILT_PRODUCTS_DIR}/CNLiveBeeHive/CNLiveBeeHive.framework", |
| 376 | 336 | "${BUILT_PRODUCTS_DIR}/CNLiveBusinessTools/CNLiveBusinessTools.framework", |
| 337 | + "${BUILT_PRODUCTS_DIR}/CNLiveCacheManagerKit/CNLiveCacheManagerKit.framework", | |
| 377 | 338 | "${BUILT_PRODUCTS_DIR}/CNLiveChooseCountry/CNLiveChooseCountry.framework", |
| 378 | 339 | "${BUILT_PRODUCTS_DIR}/CNLiveCommonCategory/CNLiveCommonCategory.framework", |
| 379 | 340 | "${BUILT_PRODUCTS_DIR}/CNLiveEnvironment/CNLiveEnvironment.framework", |
| ... | ... | @@ -384,6 +345,7 @@ |
| 384 | 345 | "${BUILT_PRODUCTS_DIR}/CNLiveUploadManager/CNLiveUploadManager.framework", |
| 385 | 346 | "${BUILT_PRODUCTS_DIR}/CNLiveUserAgreementManager/CNLiveUserAgreementManager.framework", |
| 386 | 347 | "${BUILT_PRODUCTS_DIR}/CNLiveUserManagement/CNLiveUserManagement.framework", |
| 348 | + "${BUILT_PRODUCTS_DIR}/FMDB/FMDB.framework", | |
| 387 | 349 | "${BUILT_PRODUCTS_DIR}/HappyDNS/HappyDNS.framework", |
| 388 | 350 | "${BUILT_PRODUCTS_DIR}/MJExtension/MJExtension.framework", |
| 389 | 351 | "${BUILT_PRODUCTS_DIR}/Masonry/Masonry.framework", |
| ... | ... | @@ -391,6 +353,7 @@ |
| 391 | 353 | "${BUILT_PRODUCTS_DIR}/Qiniu/Qiniu.framework", |
| 392 | 354 | "${BUILT_PRODUCTS_DIR}/SDAutoLayout/SDAutoLayout.framework", |
| 393 | 355 | "${BUILT_PRODUCTS_DIR}/SDWebImage/SDWebImage.framework", |
| 356 | + "${PODS_ROOT}/TXIMSDK_iOS/ImSDK.framework", | |
| 394 | 357 | "${BUILT_PRODUCTS_DIR}/YYKit/YYKit.framework", |
| 395 | 358 | ); |
| 396 | 359 | name = "[CP] Embed Pods Frameworks"; |
| ... | ... | @@ -401,6 +364,7 @@ |
| 401 | 364 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CNLiveBaseTools.framework", |
| 402 | 365 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CNLiveBeeHive.framework", |
| 403 | 366 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CNLiveBusinessTools.framework", |
| 367 | + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CNLiveCacheManagerKit.framework", | |
| 404 | 368 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CNLiveChooseCountry.framework", |
| 405 | 369 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CNLiveCommonCategory.framework", |
| 406 | 370 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CNLiveEnvironment.framework", |
| ... | ... | @@ -411,6 +375,7 @@ |
| 411 | 375 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CNLiveUploadManager.framework", |
| 412 | 376 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CNLiveUserAgreementManager.framework", |
| 413 | 377 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CNLiveUserManagement.framework", |
| 378 | + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FMDB.framework", | |
| 414 | 379 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/HappyDNS.framework", |
| 415 | 380 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MJExtension.framework", |
| 416 | 381 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Masonry.framework", |
| ... | ... | @@ -418,6 +383,7 @@ |
| 418 | 383 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Qiniu.framework", |
| 419 | 384 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SDAutoLayout.framework", |
| 420 | 385 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SDWebImage.framework", |
| 386 | + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ImSDK.framework", | |
| 421 | 387 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/YYKit.framework", |
| 422 | 388 | ); |
| 423 | 389 | runOnlyForDeploymentPostprocessing = 0; |
| ... | ... | @@ -425,6 +391,46 @@ |
| 425 | 391 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-CNLiveLoginModule_Example/Pods-CNLiveLoginModule_Example-frameworks.sh\"\n"; |
| 426 | 392 | showEnvVarsInLog = 0; |
| 427 | 393 | }; |
| 394 | + C744CFA8914B761288845DE6 /* [CP] Check Pods Manifest.lock */ = { | |
| 395 | + isa = PBXShellScriptBuildPhase; | |
| 396 | + buildActionMask = 2147483647; | |
| 397 | + files = ( | |
| 398 | + ); | |
| 399 | + inputFileListPaths = ( | |
| 400 | + ); | |
| 401 | + inputPaths = ( | |
| 402 | + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", | |
| 403 | + "${PODS_ROOT}/Manifest.lock", | |
| 404 | + ); | |
| 405 | + name = "[CP] Check Pods Manifest.lock"; | |
| 406 | + outputFileListPaths = ( | |
| 407 | + ); | |
| 408 | + outputPaths = ( | |
| 409 | + "$(DERIVED_FILE_DIR)/Pods-CNLiveLoginModule_Example-checkManifestLockResult.txt", | |
| 410 | + ); | |
| 411 | + runOnlyForDeploymentPostprocessing = 0; | |
| 412 | + shellPath = /bin/sh; | |
| 413 | + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; | |
| 414 | + showEnvVarsInLog = 0; | |
| 415 | + }; | |
| 416 | + ED94DF5FADC63D17850E55EE /* [CP] Copy Pods Resources */ = { | |
| 417 | + isa = PBXShellScriptBuildPhase; | |
| 418 | + buildActionMask = 2147483647; | |
| 419 | + files = ( | |
| 420 | + ); | |
| 421 | + inputPaths = ( | |
| 422 | + "${PODS_ROOT}/Target Support Files/Pods-CNLiveLoginModule_Example/Pods-CNLiveLoginModule_Example-resources.sh", | |
| 423 | + "${PODS_CONFIGURATION_BUILD_DIR}/CNLiveLoginModule/CNLiveLoginModule.bundle", | |
| 424 | + ); | |
| 425 | + name = "[CP] Copy Pods Resources"; | |
| 426 | + outputPaths = ( | |
| 427 | + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/CNLiveLoginModule.bundle", | |
| 428 | + ); | |
| 429 | + runOnlyForDeploymentPostprocessing = 0; | |
| 430 | + shellPath = /bin/sh; | |
| 431 | + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-CNLiveLoginModule_Example/Pods-CNLiveLoginModule_Example-resources.sh\"\n"; | |
| 432 | + showEnvVarsInLog = 0; | |
| 433 | + }; | |
| 428 | 434 | /* End PBXShellScriptBuildPhase section */ |
| 429 | 435 | |
| 430 | 436 | /* Begin PBXSourcesBuildPhase section */ | ... | ... |
Example/CNLiveLoginModule/CNLIVEAppDelegate.m
| ... | ... | @@ -28,26 +28,26 @@ |
| 28 | 28 | } |
| 29 | 29 | [self networkParamAction]; |
| 30 | 30 | |
| 31 | -// [CNUserInfoManager saveUserinfoDic:@{ | |
| 32 | -// @"bigFaceUrl":@"http://yweb0.cnliveimg.com/images/headImg/2019/1030/1572439148697.jpg", | |
| 33 | -// @"countryCode":@"86", | |
| 34 | -// @"email":@"", | |
| 35 | -// @"extInfo":@"", | |
| 36 | -// @"faceUrl":@"http://yweb0.cnliveimg.com/images/headImg/2019/1030/1572439148697_small.jpg", | |
| 37 | -// @"gender":@"m", | |
| 38 | -// @"hUid":@"", | |
| 39 | -// @"isNewUser":@"0", | |
| 40 | -// @"location":@"北京市海淀区", | |
| 41 | -// @"mobile":@"17600922519", | |
| 42 | -// @"nickName":@"金帝", | |
| 43 | -// @"platformId":@"769_jetj7bq525", | |
| 44 | -// @"qqUid":@"", | |
| 45 | -// @"renrenUid":@"", | |
| 46 | -// @"sinaUid":@"", | |
| 47 | -// @"token":@"RkFYeLkl/u5S7tW8UcOkT3rfLTP/Ua8NIkdEsKlcolvl/yxTMNbAYXmmJyhKGpkj", | |
| 48 | -// @"uid":@"10514405", | |
| 49 | -// @"wxUid":@"" | |
| 50 | -// }]; | |
| 31 | + [CNUserInfoManager saveUserinfoDic:@{ | |
| 32 | + @"bigFaceUrl":@"http://yweb0.cnliveimg.com/images/headImg/2019/1030/1572439148697.jpg", | |
| 33 | + @"countryCode":@"86", | |
| 34 | + @"email":@"", | |
| 35 | + @"extInfo":@"", | |
| 36 | + @"faceUrl":@"http://yweb0.cnliveimg.com/images/headImg/2019/1030/1572439148697_small.jpg", | |
| 37 | + @"gender":@"m", | |
| 38 | + @"hUid":@"", | |
| 39 | + @"isNewUser":@"0", | |
| 40 | + @"location":@"北京市海淀区", | |
| 41 | + @"mobile":@"17600922519", | |
| 42 | + @"nickName":@"金帝", | |
| 43 | + @"platformId":@"769_jetj7bq525", | |
| 44 | + @"qqUid":@"", | |
| 45 | + @"renrenUid":@"", | |
| 46 | + @"sinaUid":@"", | |
| 47 | + @"token":@"RkFYeLkl/u5S7tW8UcOkT3rfLTP/Ua8NIkdEsKlcolvl/yxTMNbAYXmmJyhKGpkj", | |
| 48 | + @"uid":@"10514405", | |
| 49 | + @"wxUid":@"" | |
| 50 | + }]; | |
| 51 | 51 | |
| 52 | 52 | CNLiveLoginController *vc = [[CNLiveLoginController alloc] init]; |
| 53 | 53 | UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:vc]; | ... | ... |