This commit is contained in:
2026-01-15 18:16:56 +08:00
parent da62d4f411
commit 32c4138ae0
29 changed files with 1523 additions and 95 deletions

View File

@@ -25,6 +25,7 @@
#import "KBUserSessionManager.h"
#import "KBLoginVC.h"
#import "KBConfig.h"
#import "KBVoiceRecordManager.h"
static NSTimeInterval const kKBSubscriptionPrefillTTL = 10 * 60.0;
@@ -61,6 +62,8 @@ static NSTimeInterval const kKBSubscriptionPrefillTTL = 10 * 60.0;
// 访
[KBNetworkManager shared].enabled = YES;
// Darwin
[KBVoiceRecordManager shared];
///
[self getNetJudge];
///
@@ -190,6 +193,19 @@ static NSTimeInterval const kKBSubscriptionPrefillTTL = 10 * 60.0;
} else if ([host isEqualToString:@"settings"]) { // kbkeyboard://settings
[self kb_openAppSettings];
return YES;
} else if ([host isEqualToString:@"voice"]) { // kbkeyboard://voice?action=start|stop
NSDictionary<NSString *, NSString *> *params = [self kb_queryParametersFromURL:url];
NSString *action = params[@"action"].lowercaseString;
NSLog(@"[KBVoiceBridge][App] openURL voice action=%@", action);
if ([action isEqualToString:@"start"]) {
[[KBVoiceRecordManager shared] startRecording];
return YES;
}
if ([action isEqualToString:@"stop"]) {
[[KBVoiceRecordManager shared] stopRecording];
return YES;
}
return YES;
}else if ([host isEqualToString:@"recharge"]) { // kbkeyboard://recharge
NSDictionary<NSString *, NSString *> *params = [self kb_queryParametersFromURL:url];
NSString *productId = params[@"productId"];

View File

@@ -6,7 +6,6 @@
//
#import "BaseTabBarController.h"
#import "HomeVC.h"
#import "HomeMainVC.h"
#import "MyVC.h"
#import "KBShopVC.h"

View File

@@ -10,10 +10,13 @@
#import "KBPanModalView.h"
#import "KBGuideVC.h" //
#import "WMDragView.h"
#import "KBMyVM.h"
#import "KBUserSessionManager.h"
@interface HomeMainVC ()
@property (nonatomic, strong) HomeHeadView *headView;
@property (nonatomic, strong) KBPanModalView *simplePanModalView;
@property (nonatomic, strong) KBMyVM *viewModel;
///
@property (nonatomic, strong) WMDragView *keyPermissButton;
@@ -65,6 +68,17 @@
// NSLog(@"[MainApp] 写入完成");
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
if (![KBUserSessionManager shared].isLoggedIn) {
return;
}
if (!self.viewModel) {
self.viewModel = [[KBMyVM alloc] init];
}
[self.viewModel fetchUserDetailWithCompletion:nil];
}
// viewDidLoad push
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];

View File

@@ -1,16 +0,0 @@
//
// HomeVC.h
// keyBoard
//
// Created by Mac on 2025/10/29.
//
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface HomeVC : UIViewController
@end
NS_ASSUME_NONNULL_END

View File

@@ -1,61 +0,0 @@
//
// HomeVC.m
// keyBoard
//
// Created by Mac on 2025/10/29.
//
#import "HomeVC.h"
#import "HomeHeadView.h"
#import "HomeSheetVC.h"
@interface HomeVC ()
@property (nonatomic, strong) HomeHeadView *headView;
@end
@implementation HomeVC
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor yellowColor];
CGFloat topV = (500);
[self.view addSubview:self.headView];
[self setupMas:topV];
// sheetVC
HomeSheetVC *vc = [[HomeSheetVC alloc] init];
// 使 true
// if (KB_DEVICE_HAS_NOTCH) {
// vc.minHeight = KB_SCREEN_HEIGHT - topV - 34;
// }else{
vc.minHeight = KB_SCREEN_HEIGHT - topV;
//
// }
vc.topInset = 100;
[self presentPanModal:vc];
}
- (void)setupMas:(CGFloat)headViewTopV{
[self.headView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.right.equalTo(self.view);
make.top.equalTo(self.view);
make.height.mas_equalTo(headViewTopV);
}];
}
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
}
#pragma mark - lazy
- (HomeHeadView *)headView{
if (!_headView) {
_headView = [[HomeHeadView alloc] init];
}
return _headView;
}
@end

View File

@@ -47,6 +47,13 @@ NSString * const KBUserCharacterDeletedNotification = @"KBUserCharacterDeletedNo
}
KBUser *user = [KBUser mj_objectWithKeyValues:(NSDictionary *)dataObj];
NSUserDefaults *sharedDefaults = [[NSUserDefaults alloc] initWithSuiteName:AppGroup];
if (user.avatarUrl.length > 0) {
[sharedDefaults setObject:user.avatarUrl forKey:AppGroup_UserAvatarURL];
} else {
[sharedDefaults removeObjectForKey:AppGroup_UserAvatarURL];
}
[sharedDefaults synchronize];
if (completion) completion(user, nil);
}];
}

View File

@@ -100,6 +100,14 @@ typedef void(^KBNetworkDataCompletion)(NSData *_Nullable data,
headers:(nullable NSDictionary<NSString *, NSString *> *)headers
completion:(KBNetworkCompletion)completion;
/// 上传本地文件multipart/form-data
- (nullable NSURLSessionDataTask *)uploadFile:(NSString *)path
fileURL:(NSURL *)fileURL
name:(NSString *)name
mimeType:(NSString *)mimeType
parameters:(nullable NSDictionary *)parameters
headers:(nullable NSDictionary<NSString *, NSString *> *)headers
completion:(KBNetworkCompletion)completion;
@end

View File

@@ -323,6 +323,42 @@ autoShowBusinessError:YES
completion:completion];
}
- (NSURLSessionDataTask *)uploadFile:(NSString *)path
fileURL:(NSURL *)fileURL
name:(NSString *)name
mimeType:(NSString *)mimeType
parameters:(NSDictionary *)parameters
headers:(NSDictionary<NSString *, NSString *> *)headers
completion:(KBNetworkCompletion)completion {
if (!fileURL || !fileURL.isFileURL) {
if (completion) {
NSError *e = [NSError errorWithDomain:KBNetworkErrorDomain
code:KBNetworkErrorInvalidResponse
userInfo:@{NSLocalizedDescriptionKey: KBLocalized(@"Invalid file")}];
completion(nil, nil, e);
}
return nil;
}
NSError *readError = nil;
NSData *data = [NSData dataWithContentsOfURL:fileURL options:0 error:&readError];
if (readError || data.length == 0) {
if (completion) {
NSError *e = readError ?: [NSError errorWithDomain:KBNetworkErrorDomain
code:KBNetworkErrorInvalidResponse
userInfo:@{NSLocalizedDescriptionKey: KBLocalized(@"Empty file data")}];
completion(nil, nil, e);
}
return nil;
}
NSString *fileName = fileURL.lastPathComponent ?: @"upload.bin";
return [self uploadFile:path
fileData:data
fileName:fileName
mimeType:mimeType
headers:headers
completion:completion];
}
#pragma mark - Core

View File

@@ -15,16 +15,18 @@
</array>
</dict>
</array>
<key>UIBackgroundModes</key>
<array>
<string>audio</string>
</array>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
<!-- 相册权限:更换头像需要访问相册 -->
<key>NSPhotoLibraryUsageDescription</key>
<string>更换头像需要访问您的相册</string>
<!-- 若未来需要保存图片到相册,可保留此项(当前仅选择不需要) -->
<key>NSPhotoLibraryAddUsageDescription</key>
<string>保存图片需要写入您的相册</string>
<key>UIBackgroundModes</key>
<array>
<string>audio</string>
</array>
</dict>
</plist>