3
This commit is contained in:
@@ -18,6 +18,8 @@
|
||||
|
||||
// 兼容旧命名(如有使用 API_APPLE_LOGIN 的位置,映射到统一命名)
|
||||
#define API_APPLE_LOGIN @"/user/appleLogin" // Apple 登录
|
||||
#define API_LOGOUT @"/user/logout" // 退出登录
|
||||
|
||||
|
||||
// 应用配置
|
||||
#ifndef KB_API_APP_CONFIG
|
||||
|
||||
@@ -14,6 +14,10 @@
|
||||
#import <Foundation/Foundation.h>
|
||||
#import "KBAPI.h" // 引入 SUCCESS_CODE/ERROR_CODE 等基础定义
|
||||
|
||||
#define KBMessage @"message"
|
||||
#define KBCode @"code"
|
||||
#define KBData @"data"
|
||||
|
||||
/// 服务端业务状态码(按项目实际调整)
|
||||
typedef NS_ENUM(NSInteger, KBBizCode) {
|
||||
/// 业务成功:SUCCESS(0, "ok")
|
||||
@@ -93,7 +97,7 @@ static inline NSInteger KBBizCodeFromJSONObject(id obj) {
|
||||
static inline NSString *KBBizMessageFromJSONObject(id obj) {
|
||||
if (![obj isKindOfClass:NSDictionary.class]) return nil;
|
||||
NSDictionary *d = (NSDictionary *)obj;
|
||||
NSString *msg = d[@"message"] ?: d[@"msg"] ?: d[@"error"];
|
||||
NSString *msg = d[KBMessage] ?: d[@"msg"] ?: d[@"error"];
|
||||
if (![msg isKindOfClass:NSString.class]) return nil;
|
||||
return msg;
|
||||
}
|
||||
|
||||
@@ -98,6 +98,7 @@
|
||||
04890A042EC0BBBB00FABA60 /* KBCategoryTitleImageCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 04890A012EC0BBBB00FABA60 /* KBCategoryTitleImageCell.m */; };
|
||||
04890A052EC0BBBB00FABA60 /* KBCategoryTitleImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 04890A032EC0BBBB00FABA60 /* KBCategoryTitleImageView.m */; };
|
||||
04890B122EC2F00000FABA60 /* KBMyHeaderView.m in Sources */ = {isa = PBXBuildFile; fileRef = 04890B112EC2F00000FABA60 /* KBMyHeaderView.m */; };
|
||||
0498BD622EDFFC12006CC1D5 /* KBMyVM.m in Sources */ = {isa = PBXBuildFile; fileRef = 0498BD612EDFFC12006CC1D5 /* KBMyVM.m */; };
|
||||
049FB20B2EC1C13800FAB05D /* KBSkinBottomActionView.m in Sources */ = {isa = PBXBuildFile; fileRef = 049FB20A2EC1C13800FAB05D /* KBSkinBottomActionView.m */; };
|
||||
049FB20E2EC1CD2800FAB05D /* KBAlert.m in Sources */ = {isa = PBXBuildFile; fileRef = 049FB20D2EC1CD2800FAB05D /* KBAlert.m */; };
|
||||
049FB2112EC1F72F00FAB05D /* KBMyListCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 049FB2102EC1F72F00FAB05D /* KBMyListCell.m */; };
|
||||
@@ -364,6 +365,8 @@
|
||||
04890B102EC2F00000FABA60 /* KBMyHeaderView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KBMyHeaderView.h; sourceTree = "<group>"; };
|
||||
04890B112EC2F00000FABA60 /* KBMyHeaderView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KBMyHeaderView.m; sourceTree = "<group>"; };
|
||||
0498BD5E2EDF2157006CC1D5 /* KBBizCode.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KBBizCode.h; sourceTree = "<group>"; };
|
||||
0498BD602EDFFC12006CC1D5 /* KBMyVM.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KBMyVM.h; sourceTree = "<group>"; };
|
||||
0498BD612EDFFC12006CC1D5 /* KBMyVM.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KBMyVM.m; sourceTree = "<group>"; };
|
||||
049FB2092EC1C13800FAB05D /* KBSkinBottomActionView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KBSkinBottomActionView.h; sourceTree = "<group>"; };
|
||||
049FB20A2EC1C13800FAB05D /* KBSkinBottomActionView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KBSkinBottomActionView.m; sourceTree = "<group>"; };
|
||||
049FB20C2EC1CD2800FAB05D /* KBAlert.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KBAlert.h; sourceTree = "<group>"; };
|
||||
@@ -854,6 +857,15 @@
|
||||
path = UICollectionViewLeftAlignedLayout;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
0498BD5F2EDFFBFC006CC1D5 /* VM */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
0498BD602EDFFC12006CC1D5 /* KBMyVM.h */,
|
||||
0498BD612EDFFC12006CC1D5 /* KBMyVM.m */,
|
||||
);
|
||||
path = VM;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
049FB2162EC20A6600FAB05D /* BMLongPressDragCellCollectionView */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
@@ -1135,6 +1147,7 @@
|
||||
04FC95BE2EB1E3B1007BD342 /* Me */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
0498BD5F2EDFFBFC006CC1D5 /* VM */,
|
||||
04FC95BB2EB1E3B1007BD342 /* M */,
|
||||
04FC95BC2EB1E3B1007BD342 /* V */,
|
||||
04FC95BD2EB1E3B1007BD342 /* VC */,
|
||||
@@ -1742,6 +1755,7 @@
|
||||
0477BE042EBC83130055D639 /* HomeMainVC.m in Sources */,
|
||||
0477BDFD2EBC6A170055D639 /* HomeHotVC.m in Sources */,
|
||||
04122FAA2EC73C0100EF7AB3 /* KBVipPayHeaderView.m in Sources */,
|
||||
0498BD622EDFFC12006CC1D5 /* KBMyVM.m in Sources */,
|
||||
049FB2432EC4BBB700FAB05D /* KBLoginPopView.m in Sources */,
|
||||
048908CC2EBE373500FABA60 /* KBSearchBarView.m in Sources */,
|
||||
04122F872EC6198C00EF7AB3 /* WMDragView.m in Sources */,
|
||||
|
||||
@@ -10,6 +10,6 @@
|
||||
@interface AppDelegate : UIResponder <UIApplicationDelegate>
|
||||
|
||||
@property (nonatomic, strong) UIWindow *window;
|
||||
|
||||
- (void)setupRootVC;
|
||||
@end
|
||||
|
||||
|
||||
@@ -92,20 +92,25 @@
|
||||
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
|
||||
self.window.backgroundColor = [UIColor whiteColor];
|
||||
[self.window makeKeyAndVisible];
|
||||
BaseTabBarController *vc = [[BaseTabBarController alloc] init];
|
||||
self.window.rootViewController = vc;
|
||||
|
||||
// 根据当前是否已登录决定入口:有 token 进主 TabBar,否则先进入登录页
|
||||
BOOL loggedIn = [[KBUserSessionManager shared] isLoggedIn];
|
||||
UIViewController *rootVC = nil;
|
||||
if (loggedIn) {
|
||||
rootVC = [[BaseTabBarController alloc] init];
|
||||
} else {
|
||||
rootVC = [[KBLoginVC alloc] init];
|
||||
}
|
||||
self.window.rootViewController = rootVC;
|
||||
}
|
||||
|
||||
/// 首次安装时,展示性别选择页作为根控制器
|
||||
- (void)setupSexSelectRootVC {
|
||||
KBLoginVC *vc = [[KBLoginVC alloc] init];
|
||||
KBSexSelVC *vc = [[KBSexSelVC alloc] init];
|
||||
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
|
||||
self.window.backgroundColor = [UIColor whiteColor];
|
||||
[self.window makeKeyAndVisible];
|
||||
self.window.rootViewController = vc;
|
||||
|
||||
return;
|
||||
|
||||
KBSexSelVC *sexVC = [KBSexSelVC new];
|
||||
__weak typeof(self) weakSelf = self;
|
||||
sexVC.didFinishSelectBlock = ^{
|
||||
|
||||
@@ -70,7 +70,7 @@ typedef NS_ENUM(NSInteger, KBSexOption) {
|
||||
|
||||
|
||||
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
|
||||
[[KBNetworkManager shared] GET:KB_API_APP_CONFIG parameters:nil headers:nil completion:^(id _Nullable jsonOrData, NSURLResponse * _Nullable response, NSError * _Nullable error) {
|
||||
[[KBNetworkManager shared] GET:@"https://www.apple.com.cn/" parameters:nil headers:nil completion:^(id _Nullable jsonOrData, NSURLResponse * _Nullable response, NSError * _Nullable error) {
|
||||
NSLog(@"====");
|
||||
}];
|
||||
});
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
#import "KBLoginVC.h"
|
||||
#import <AuthenticationServices/AuthenticationServices.h>
|
||||
#import "KBLoginVM.h"
|
||||
#import "AppDelegate.h"
|
||||
|
||||
@interface KBLoginVC () <UITextViewDelegate>
|
||||
|
||||
@@ -155,11 +156,18 @@
|
||||
#pragma mark - Actions
|
||||
|
||||
- (void)onTapAppleLogin {
|
||||
// 后续可接入 Apple Sign-In 逻辑,这里先占位
|
||||
KBLOG(@"onTapAppleLogin");
|
||||
[[KBLoginVM shared] signInWithAppleFromViewController:KB_CURRENT_NAV completion:^(BOOL success, NSError * _Nullable error) {
|
||||
if (success) {
|
||||
[KBHUD showInfo:KBLocalized(@"Signed in successfully")];
|
||||
// 登录成功后切换到主 TabBar
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
id<UIApplicationDelegate> appDelegate = UIApplication.sharedApplication.delegate;
|
||||
if ([appDelegate respondsToSelector:@selector(setupRootVC)]) {
|
||||
AppDelegate *delegate = (AppDelegate *)appDelegate;
|
||||
[delegate setupRootVC];
|
||||
}
|
||||
});
|
||||
} else {
|
||||
NSString *msg = error.localizedDescription ?: KBLocalized(@"Sign-in failed");
|
||||
[KBHUD showInfo:msg];
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
#import "LSTPopView.h"
|
||||
#import "KBChangeNicknamePopView.h"
|
||||
#import "KBGenderPickerPopView.h"
|
||||
|
||||
#import "KBMyVM.h"
|
||||
@interface KBPersonInfoVC () <UITableViewDelegate, UITableViewDataSource, PHPickerViewControllerDelegate, UINavigationControllerDelegate, UIImagePickerControllerDelegate>
|
||||
|
||||
// 列表
|
||||
@@ -37,6 +37,8 @@
|
||||
// 压缩后的头像 JPEG 数据(可用于上传)
|
||||
@property (nonatomic, strong) NSData *avatarJPEGData;
|
||||
|
||||
@property (nonatomic, strong) KBMyVM *myVM;
|
||||
|
||||
@end
|
||||
|
||||
@implementation KBPersonInfoVC
|
||||
@@ -185,7 +187,7 @@
|
||||
- (void)onTapAvatarEdit { [self presentImagePicker]; }
|
||||
|
||||
- (void)onTapLogout {
|
||||
[[KBUserSessionManager shared] logout];
|
||||
[self.myVM logout];
|
||||
}
|
||||
|
||||
#pragma mark - Lazy UI(懒加载)
|
||||
@@ -366,4 +368,11 @@
|
||||
return result;
|
||||
}
|
||||
|
||||
- (KBMyVM *)myVM{
|
||||
if (!_myVM) {
|
||||
_myVM = [[KBMyVM alloc] init];
|
||||
}
|
||||
return _myVM;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
16
keyBoard/Class/Me/VM/KBMyVM.h
Normal file
16
keyBoard/Class/Me/VM/KBMyVM.h
Normal file
@@ -0,0 +1,16 @@
|
||||
//
|
||||
// KBMyVM.h
|
||||
// keyBoard
|
||||
//
|
||||
// Created by Mac on 2025/12/3.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface KBMyVM : NSObject
|
||||
- (void)logout;
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
33
keyBoard/Class/Me/VM/KBMyVM.m
Normal file
33
keyBoard/Class/Me/VM/KBMyVM.m
Normal file
@@ -0,0 +1,33 @@
|
||||
//
|
||||
// KBMyVM.m
|
||||
// keyBoard
|
||||
//
|
||||
// Created by Mac on 2025/12/3.
|
||||
//
|
||||
|
||||
#import "KBMyVM.h"
|
||||
#import "AppDelegate.h"
|
||||
|
||||
@implementation KBMyVM
|
||||
- (void)logout{
|
||||
[KBHUD show];
|
||||
[[KBNetworkManager shared] GET:API_LOGOUT parameters:nil headers:nil completion:^(NSDictionary * jsonOrData, NSURLResponse * _Nullable response, NSError * _Nullable error) {
|
||||
if (error != nil) {
|
||||
return;
|
||||
}
|
||||
NSString *message = jsonOrData[KBMessage];
|
||||
// if (code == KBBizCodeSuccess) {
|
||||
[KBHUD showSuccess:message];
|
||||
[[KBUserSessionManager shared] logout];
|
||||
// 登录成功后切换到主 TabBar
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
id<UIApplicationDelegate> appDelegate = UIApplication.sharedApplication.delegate;
|
||||
if ([appDelegate respondsToSelector:@selector(setupRootVC)]) {
|
||||
AppDelegate *delegate = (AppDelegate *)appDelegate;
|
||||
[delegate setupRootVC];
|
||||
}
|
||||
});
|
||||
// }
|
||||
}];
|
||||
}
|
||||
@end
|
||||
@@ -32,6 +32,7 @@
|
||||
|
||||
|
||||
/// 项目
|
||||
#import "KBBizCode.h"
|
||||
#import "KBNetworkManager.h"
|
||||
#import "UIView+KBShadow.h"
|
||||
#import "UIImage+KBColor.h"
|
||||
|
||||
Reference in New Issue
Block a user