3
This commit is contained in:
@@ -18,6 +18,8 @@
|
|||||||
|
|
||||||
// 兼容旧命名(如有使用 API_APPLE_LOGIN 的位置,映射到统一命名)
|
// 兼容旧命名(如有使用 API_APPLE_LOGIN 的位置,映射到统一命名)
|
||||||
#define API_APPLE_LOGIN @"/user/appleLogin" // Apple 登录
|
#define API_APPLE_LOGIN @"/user/appleLogin" // Apple 登录
|
||||||
|
#define API_LOGOUT @"/user/logout" // 退出登录
|
||||||
|
|
||||||
|
|
||||||
// 应用配置
|
// 应用配置
|
||||||
#ifndef KB_API_APP_CONFIG
|
#ifndef KB_API_APP_CONFIG
|
||||||
|
|||||||
@@ -14,6 +14,10 @@
|
|||||||
#import <Foundation/Foundation.h>
|
#import <Foundation/Foundation.h>
|
||||||
#import "KBAPI.h" // 引入 SUCCESS_CODE/ERROR_CODE 等基础定义
|
#import "KBAPI.h" // 引入 SUCCESS_CODE/ERROR_CODE 等基础定义
|
||||||
|
|
||||||
|
#define KBMessage @"message"
|
||||||
|
#define KBCode @"code"
|
||||||
|
#define KBData @"data"
|
||||||
|
|
||||||
/// 服务端业务状态码(按项目实际调整)
|
/// 服务端业务状态码(按项目实际调整)
|
||||||
typedef NS_ENUM(NSInteger, KBBizCode) {
|
typedef NS_ENUM(NSInteger, KBBizCode) {
|
||||||
/// 业务成功:SUCCESS(0, "ok")
|
/// 业务成功:SUCCESS(0, "ok")
|
||||||
@@ -93,7 +97,7 @@ static inline NSInteger KBBizCodeFromJSONObject(id obj) {
|
|||||||
static inline NSString *KBBizMessageFromJSONObject(id obj) {
|
static inline NSString *KBBizMessageFromJSONObject(id obj) {
|
||||||
if (![obj isKindOfClass:NSDictionary.class]) return nil;
|
if (![obj isKindOfClass:NSDictionary.class]) return nil;
|
||||||
NSDictionary *d = (NSDictionary *)obj;
|
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;
|
if (![msg isKindOfClass:NSString.class]) return nil;
|
||||||
return msg;
|
return msg;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -98,6 +98,7 @@
|
|||||||
04890A042EC0BBBB00FABA60 /* KBCategoryTitleImageCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 04890A012EC0BBBB00FABA60 /* KBCategoryTitleImageCell.m */; };
|
04890A042EC0BBBB00FABA60 /* KBCategoryTitleImageCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 04890A012EC0BBBB00FABA60 /* KBCategoryTitleImageCell.m */; };
|
||||||
04890A052EC0BBBB00FABA60 /* KBCategoryTitleImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 04890A032EC0BBBB00FABA60 /* KBCategoryTitleImageView.m */; };
|
04890A052EC0BBBB00FABA60 /* KBCategoryTitleImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 04890A032EC0BBBB00FABA60 /* KBCategoryTitleImageView.m */; };
|
||||||
04890B122EC2F00000FABA60 /* KBMyHeaderView.m in Sources */ = {isa = PBXBuildFile; fileRef = 04890B112EC2F00000FABA60 /* KBMyHeaderView.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 */; };
|
049FB20B2EC1C13800FAB05D /* KBSkinBottomActionView.m in Sources */ = {isa = PBXBuildFile; fileRef = 049FB20A2EC1C13800FAB05D /* KBSkinBottomActionView.m */; };
|
||||||
049FB20E2EC1CD2800FAB05D /* KBAlert.m in Sources */ = {isa = PBXBuildFile; fileRef = 049FB20D2EC1CD2800FAB05D /* KBAlert.m */; };
|
049FB20E2EC1CD2800FAB05D /* KBAlert.m in Sources */ = {isa = PBXBuildFile; fileRef = 049FB20D2EC1CD2800FAB05D /* KBAlert.m */; };
|
||||||
049FB2112EC1F72F00FAB05D /* KBMyListCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 049FB2102EC1F72F00FAB05D /* KBMyListCell.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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
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>"; };
|
049FB20C2EC1CD2800FAB05D /* KBAlert.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KBAlert.h; sourceTree = "<group>"; };
|
||||||
@@ -854,6 +857,15 @@
|
|||||||
path = UICollectionViewLeftAlignedLayout;
|
path = UICollectionViewLeftAlignedLayout;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
0498BD5F2EDFFBFC006CC1D5 /* VM */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
0498BD602EDFFC12006CC1D5 /* KBMyVM.h */,
|
||||||
|
0498BD612EDFFC12006CC1D5 /* KBMyVM.m */,
|
||||||
|
);
|
||||||
|
path = VM;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
049FB2162EC20A6600FAB05D /* BMLongPressDragCellCollectionView */ = {
|
049FB2162EC20A6600FAB05D /* BMLongPressDragCellCollectionView */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
@@ -1135,6 +1147,7 @@
|
|||||||
04FC95BE2EB1E3B1007BD342 /* Me */ = {
|
04FC95BE2EB1E3B1007BD342 /* Me */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
0498BD5F2EDFFBFC006CC1D5 /* VM */,
|
||||||
04FC95BB2EB1E3B1007BD342 /* M */,
|
04FC95BB2EB1E3B1007BD342 /* M */,
|
||||||
04FC95BC2EB1E3B1007BD342 /* V */,
|
04FC95BC2EB1E3B1007BD342 /* V */,
|
||||||
04FC95BD2EB1E3B1007BD342 /* VC */,
|
04FC95BD2EB1E3B1007BD342 /* VC */,
|
||||||
@@ -1742,6 +1755,7 @@
|
|||||||
0477BE042EBC83130055D639 /* HomeMainVC.m in Sources */,
|
0477BE042EBC83130055D639 /* HomeMainVC.m in Sources */,
|
||||||
0477BDFD2EBC6A170055D639 /* HomeHotVC.m in Sources */,
|
0477BDFD2EBC6A170055D639 /* HomeHotVC.m in Sources */,
|
||||||
04122FAA2EC73C0100EF7AB3 /* KBVipPayHeaderView.m in Sources */,
|
04122FAA2EC73C0100EF7AB3 /* KBVipPayHeaderView.m in Sources */,
|
||||||
|
0498BD622EDFFC12006CC1D5 /* KBMyVM.m in Sources */,
|
||||||
049FB2432EC4BBB700FAB05D /* KBLoginPopView.m in Sources */,
|
049FB2432EC4BBB700FAB05D /* KBLoginPopView.m in Sources */,
|
||||||
048908CC2EBE373500FABA60 /* KBSearchBarView.m in Sources */,
|
048908CC2EBE373500FABA60 /* KBSearchBarView.m in Sources */,
|
||||||
04122F872EC6198C00EF7AB3 /* WMDragView.m in Sources */,
|
04122F872EC6198C00EF7AB3 /* WMDragView.m in Sources */,
|
||||||
|
|||||||
@@ -10,6 +10,6 @@
|
|||||||
@interface AppDelegate : UIResponder <UIApplicationDelegate>
|
@interface AppDelegate : UIResponder <UIApplicationDelegate>
|
||||||
|
|
||||||
@property (nonatomic, strong) UIWindow *window;
|
@property (nonatomic, strong) UIWindow *window;
|
||||||
|
- (void)setupRootVC;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
|||||||
@@ -92,20 +92,25 @@
|
|||||||
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
|
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
|
||||||
self.window.backgroundColor = [UIColor whiteColor];
|
self.window.backgroundColor = [UIColor whiteColor];
|
||||||
[self.window makeKeyAndVisible];
|
[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 {
|
- (void)setupSexSelectRootVC {
|
||||||
KBLoginVC *vc = [[KBLoginVC alloc] init];
|
KBSexSelVC *vc = [[KBSexSelVC alloc] init];
|
||||||
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
|
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
|
||||||
self.window.backgroundColor = [UIColor whiteColor];
|
self.window.backgroundColor = [UIColor whiteColor];
|
||||||
[self.window makeKeyAndVisible];
|
[self.window makeKeyAndVisible];
|
||||||
self.window.rootViewController = vc;
|
self.window.rootViewController = vc;
|
||||||
|
|
||||||
return;
|
|
||||||
|
|
||||||
KBSexSelVC *sexVC = [KBSexSelVC new];
|
KBSexSelVC *sexVC = [KBSexSelVC new];
|
||||||
__weak typeof(self) weakSelf = self;
|
__weak typeof(self) weakSelf = self;
|
||||||
sexVC.didFinishSelectBlock = ^{
|
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(), ^{
|
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(@"====");
|
NSLog(@"====");
|
||||||
}];
|
}];
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
#import "KBLoginVC.h"
|
#import "KBLoginVC.h"
|
||||||
#import <AuthenticationServices/AuthenticationServices.h>
|
#import <AuthenticationServices/AuthenticationServices.h>
|
||||||
#import "KBLoginVM.h"
|
#import "KBLoginVM.h"
|
||||||
|
#import "AppDelegate.h"
|
||||||
|
|
||||||
@interface KBLoginVC () <UITextViewDelegate>
|
@interface KBLoginVC () <UITextViewDelegate>
|
||||||
|
|
||||||
@@ -155,11 +156,18 @@
|
|||||||
#pragma mark - Actions
|
#pragma mark - Actions
|
||||||
|
|
||||||
- (void)onTapAppleLogin {
|
- (void)onTapAppleLogin {
|
||||||
// 后续可接入 Apple Sign-In 逻辑,这里先占位
|
|
||||||
KBLOG(@"onTapAppleLogin");
|
KBLOG(@"onTapAppleLogin");
|
||||||
[[KBLoginVM shared] signInWithAppleFromViewController:KB_CURRENT_NAV completion:^(BOOL success, NSError * _Nullable error) {
|
[[KBLoginVM shared] signInWithAppleFromViewController:KB_CURRENT_NAV completion:^(BOOL success, NSError * _Nullable error) {
|
||||||
if (success) {
|
if (success) {
|
||||||
[KBHUD showInfo:KBLocalized(@"Signed in successfully")];
|
[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 {
|
} else {
|
||||||
NSString *msg = error.localizedDescription ?: KBLocalized(@"Sign-in failed");
|
NSString *msg = error.localizedDescription ?: KBLocalized(@"Sign-in failed");
|
||||||
[KBHUD showInfo:msg];
|
[KBHUD showInfo:msg];
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
#import "LSTPopView.h"
|
#import "LSTPopView.h"
|
||||||
#import "KBChangeNicknamePopView.h"
|
#import "KBChangeNicknamePopView.h"
|
||||||
#import "KBGenderPickerPopView.h"
|
#import "KBGenderPickerPopView.h"
|
||||||
|
#import "KBMyVM.h"
|
||||||
@interface KBPersonInfoVC () <UITableViewDelegate, UITableViewDataSource, PHPickerViewControllerDelegate, UINavigationControllerDelegate, UIImagePickerControllerDelegate>
|
@interface KBPersonInfoVC () <UITableViewDelegate, UITableViewDataSource, PHPickerViewControllerDelegate, UINavigationControllerDelegate, UIImagePickerControllerDelegate>
|
||||||
|
|
||||||
// 列表
|
// 列表
|
||||||
@@ -37,6 +37,8 @@
|
|||||||
// 压缩后的头像 JPEG 数据(可用于上传)
|
// 压缩后的头像 JPEG 数据(可用于上传)
|
||||||
@property (nonatomic, strong) NSData *avatarJPEGData;
|
@property (nonatomic, strong) NSData *avatarJPEGData;
|
||||||
|
|
||||||
|
@property (nonatomic, strong) KBMyVM *myVM;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@implementation KBPersonInfoVC
|
@implementation KBPersonInfoVC
|
||||||
@@ -185,7 +187,7 @@
|
|||||||
- (void)onTapAvatarEdit { [self presentImagePicker]; }
|
- (void)onTapAvatarEdit { [self presentImagePicker]; }
|
||||||
|
|
||||||
- (void)onTapLogout {
|
- (void)onTapLogout {
|
||||||
[[KBUserSessionManager shared] logout];
|
[self.myVM logout];
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma mark - Lazy UI(懒加载)
|
#pragma mark - Lazy UI(懒加载)
|
||||||
@@ -366,4 +368,11 @@
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (KBMyVM *)myVM{
|
||||||
|
if (!_myVM) {
|
||||||
|
_myVM = [[KBMyVM alloc] init];
|
||||||
|
}
|
||||||
|
return _myVM;
|
||||||
|
}
|
||||||
|
|
||||||
@end
|
@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 "KBNetworkManager.h"
|
||||||
#import "UIView+KBShadow.h"
|
#import "UIView+KBShadow.h"
|
||||||
#import "UIImage+KBColor.h"
|
#import "UIImage+KBColor.h"
|
||||||
|
|||||||
Reference in New Issue
Block a user