From: liangzhenying <867174124@qq.com>
Date: Wed, 25 Jun 2025 04:29:03 +0000 (+0800)
Subject: 修复键盘hid偶尔无法连上问题
X-Git-Url: http://git.snicker.com.cn/Users/apple/Desktop/static/gitweb.css?a=commitdiff_plain;h=refs%2Fheads%2Fdev;p=mirrors%2FMouseSdk-MacOS.git
修复键盘hid偶尔无法连上问题
---
diff --git a/.gitignore b/.gitignore
index d3c3d5b..bd5fb6b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,4 +5,65 @@ MouseSdk_Demo
MouseSdk/AiSdk/ffmpeg
Demo/MouseSdk/libAiMouseManager
-Demo
\ No newline at end of file
+Demo
+
+# Xcode
+#
+# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
+
+## Build generated
+build/
+DerivedData/
+
+## Various settings
+*.pbxuser
+!default.pbxuser
+*.mode1v3
+!default.mode1v3
+*.mode2v3
+!default.mode2v3
+*.perspectivev3
+!default.perspectivev3
+xcuserdata/
+
+## Other
+*.moved-aside
+*.xccheckout
+*.xcscmblueprint
+
+## Obj-C/Swift specific
+*.hmap
+*.ipa
+*.dSYM.zip
+*.dSYM
+
+# CocoaPods
+#
+# We recommend against adding the Pods directory to your .gitignore. However
+# you should judge for yourself, the pros and cons are mentioned at:
+# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
+#
+## èªå®ä¹ä¸è¦ä¸ä¼ çæä»¶
+#Pods/
+.DS_Store
+
+# Carthage
+#
+# Add this line if you want to avoid checking in source code from Carthage dependencies.
+# Carthage/Checkouts
+
+Carthage/Build
+
+# fastlane
+#
+# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
+# screenshots whenever they are needed.
+# For more information about the recommended setup visit:
+# https://docs.fastlane.tools/best-practices/source-control/#source-control
+
+MixSdk_iOS/
+
+# Code Injection
+#
+# After new code Injection tools there's a generated folder /iOSInjectionProject
+# https://github.com/johnno1962/injectionforxcode
\ No newline at end of file
diff --git a/MouseSdk/AiMouseSdk/Manager/DeviceManger.m b/MouseSdk/AiMouseSdk/Manager/DeviceManger.m
index 55b4669..d8c1f71 100644
--- a/MouseSdk/AiMouseSdk/Manager/DeviceManger.m
+++ b/MouseSdk/AiMouseSdk/Manager/DeviceManger.m
@@ -161,8 +161,8 @@
};
self.hid.receiveInfoDataCallBack = ^(NSData *data) {
if (ws.isConneted == false) {
- [ws.hid closeHid];
- [ws.hid openHid];
+// [ws.hid closeHid];
+// [ws.hid openHid];
return;
}
if (ws.productType == AiMouseProductType_n) {
@@ -866,6 +866,9 @@
self.aiMouseConnectStateDidChangeCallBack(self.kbSdk.connectType == AiMouseConnectType_bluetooth ? 0:1,connected);
}
if(self.authCallBack && connected)self.authCallBack(connected);
+ if (connected == false) {
+ [self.hid closeHid];
+ }
}
@@ -879,7 +882,7 @@
[self.hid writeToDevice:data];
}
}
-
+
/// é¼ æ æé®æä»¤åè°
- (void)keyboardSendCmdData:(NSData *)data{
uint8 cmd;
diff --git a/MouseSdk/AiMouseSdk/Manager/HidManager.m b/MouseSdk/AiMouseSdk/Manager/HidManager.m
index 3935125..edf8d74 100644
--- a/MouseSdk/AiMouseSdk/Manager/HidManager.m
+++ b/MouseSdk/AiMouseSdk/Manager/HidManager.m
@@ -47,7 +47,7 @@
/// å¹é
å°è®¾å¤åè°
static void hidAppearDevice(void *inContext,IOReturn inResult,void *inSender,IOHIDDeviceRef deviceRef) {
if ([DeviceManger shared].isConneted) {
- // [[HidManager shared] showLog:(@"å½åå¤äºè¿æ¥ç¶æï¼å¯¹çå¬å°æUSB æå
¥ çäºä»¶ä¸åå¤ç")];
+ //[[HidManager shared] showLog:(@"å½åå¤äºè¿æ¥ç¶æï¼å¯¹çå¬å°æUSB æå
¥ çäºä»¶ä¸åå¤ç")];
return;
}
@@ -262,6 +262,7 @@ static void hidAppearDevice(void *inContext,IOReturn inResult,void *inSender,IOH
IOReturn ret = IOHIDDeviceClose(deviceRef, kIOHIDOptionsTypeNone);
if (ret != kIOReturnSuccess) {
[self showLog:(@"å
³édevice失败!")];
+ return;
}
// æ¸
é¤å¼ç¨
@@ -343,14 +344,20 @@ static void hidReceiveData(void* context, IOReturn result, void* sender, IOHIDRe
//æ£æ¥æ¯å¦å·²è¿æ¥
- (void)checkedConected{
if (![DeviceManger shared].isConneted) {
- [HidManager shared].connectStateCallBack(true);
+ if ([HidManager shared].productType == AiMouseProductType_keyboard) {
+ [[HidManager shared] closeHid];
+ [[HidManager shared] openHid];
+ return;
+ }
+ else{
+ [HidManager shared].connectStateCallBack(true);
+ }
}
}
#pragma mark - public
- (void)openHid{
- // [self close];
if (self.hidManager == nil) {
self.deviceInfoCha = nil;
self.hidManager = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone);
@@ -358,6 +365,7 @@ static void hidReceiveData(void* context, IOReturn result, void* sender, IOHIDRe
IOReturn ret = IOHIDManagerOpen(self.hidManager, 0L);
if (ret != kIOReturnSuccess) {
[self showLog:(@"æå¼hid失败!")];
+ return;
}else{
[self showLog:(@"æå¼hidæå!")];
}
@@ -370,20 +378,102 @@ static void hidReceiveData(void* context, IOReturn result, void* sender, IOHIDRe
IOHIDManagerRegisterDeviceRemovalCallback(self.hidManager, &hidDisAppearDevice, NULL);
}
}
-
- (BOOL)closeHid{
[self showLog:@"å
³éhid"];
- // å
³éææå·²è¿æ¥ç设å¤
- if (self.deviceInfoCha) {
- [self closeDevice:self.deviceInfoCha];
+
+ // æ è®°æ£å¨å
³éï¼é²æ¢éå¤è°ç¨
+ static BOOL isClosing = NO;
+ if (isClosing) {
+ [self showLog:@"å·²ç»å¨å
³éè¿ç¨ä¸ï¼å¿½ç¥éå¤è¯·æ±"];
+ return NO;
+ }
+ isClosing = YES;
+
+ // ç¦ç¨åè°å¤ç
+ static BOOL callbacksDisabled = NO;
+ if (!callbacksDisabled) {
+ callbacksDisabled = YES;
+
+ // å建ä¸ä¸ªä¸´æ¶é忥å¤çåç»æä½
+ dispatch_queue_t tempQueue = dispatch_queue_create("com.hidmanager.cleanup", DISPATCH_QUEUE_SERIAL);
+ dispatch_async(tempQueue, ^{
+
+ // ç¬¬ä¸æ¥ï¼åæ¶ææè®¾å¤çè°åº¦å¹¶å
³é
+ [self performSelector:@selector(closeAllDevices) withObject:nil afterDelay:0.1];
+
+ // ç¬¬äºæ¥ï¼å»¶è¿åå
³éHID管çå¨
+ dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
+ [self performSelector:@selector(closeHIDManager) withObject:nil afterDelay:0.1];
+
+ // ç¬¬ä¸æ¥ï¼éç½®ç¶æ
+ dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
+ isClosing = NO;
+ callbacksDisabled = NO;
+ });
+ });
+ });
+
+ return YES;
}
+ return NO;
+}
+
+- (void)closeAllDevices {
+ [self showLog:@"å¼å§å
³éææè®¾å¤"];
+
+ // å
³évoiceRef设å¤
if (self.voiceRef) {
- [self closeDevice:self.voiceRef];
+ [self showLog:@"å
³évoiceRef设å¤"];
+ IOHIDDeviceUnscheduleFromRunLoop(self.voiceRef, CFRunLoopGetMain(), kCFRunLoopDefaultMode);
+ IOHIDDeviceRegisterInputReportCallback(self.voiceRef, NULL, 0, NULL, NULL);
+
+ // å
³é设å¤ååé空æ¥åï¼ç¡®ä¿æ²¡ææèµ·çæä½
+ IOHIDDeviceSetReport(self.voiceRef, kIOHIDReportTypeOutput, 0, NULL, 0);
+
+ IOReturn ret = IOHIDDeviceClose(self.voiceRef, kIOHIDOptionsTypeNone);
+ if (ret == kIOReturnSuccess) {
+ [self showLog:@"voiceRef设å¤å
³éæå"];
+ self.voiceRef = nil;
+ } else {
+ [self showLog:[NSString stringWithFormat:@"voiceRef设å¤å
³é失败ï¼é误ç :%d", ret]];
+ }
}
+ // å
³émoveRef设å¤
if (self.moveRef) {
- [self closeDevice:self.moveRef];
+ [self showLog:@"å
³émoveRef设å¤"];
+ IOHIDDeviceUnscheduleFromRunLoop(self.moveRef, CFRunLoopGetMain(), kCFRunLoopDefaultMode);
+ IOHIDDeviceRegisterInputReportCallback(self.moveRef, NULL, 0, NULL, NULL);
+
+ // å
³é设å¤ååé空æ¥åï¼ç¡®ä¿æ²¡ææèµ·çæä½
+ IOHIDDeviceSetReport(self.moveRef, kIOHIDReportTypeOutput, 0, NULL, 0);
+
+ IOReturn ret = IOHIDDeviceClose(self.moveRef, kIOHIDOptionsTypeNone);
+ if (ret == kIOReturnSuccess) {
+ [self showLog:@"moveRef设å¤å
³éæå"];
+ self.moveRef = nil;
+ } else {
+ [self showLog:[NSString stringWithFormat:@"moveRef设å¤å
³é失败ï¼é误ç :%d", ret]];
+ }
+ }
+
+ // å
³édeviceInfoCha设å¤ï¼æåå
³éï¼å ä¸ºå®æ¯ä¸»è®¾å¤ï¼
+ if (self.deviceInfoCha) {
+ [self showLog:@"å
³édeviceInfoCha设å¤"];
+ IOHIDDeviceUnscheduleFromRunLoop(self.deviceInfoCha, CFRunLoopGetMain(), kCFRunLoopDefaultMode);
+ IOHIDDeviceRegisterInputReportCallback(self.deviceInfoCha, NULL, 0, NULL, NULL);
+
+ // å
³é设å¤ååé空æ¥åï¼ç¡®ä¿æ²¡ææèµ·çæä½
+ IOHIDDeviceSetReport(self.deviceInfoCha, kIOHIDReportTypeOutput, 0, NULL, 0);
+
+ IOReturn ret = IOHIDDeviceClose(self.deviceInfoCha, kIOHIDOptionsTypeNone);
+ if (ret == kIOReturnSuccess) {
+ [self showLog:@"deviceInfoCha设å¤å
³éæå"];
+ self.deviceInfoCha = nil;
+ } else {
+ [self showLog:[NSString stringWithFormat:@"deviceInfoCha设å¤å
³é失败ï¼é误ç :%d", ret]];
+ }
}
// æ¸
空ç¼å²åºåå
¸
@@ -393,24 +483,42 @@ static void hidReceiveData(void* context, IOReturn result, void* sender, IOHIDRe
}
[self.deviceBuffers removeAllObjects];
- // å
³éHID管çå¨
+ [self showLog:@"ææè®¾å¤å
³éæä½å·²å®æ"];
+}
+
+- (void)closeHIDManager {
+ [self showLog:@"å¼å§å
³éHID管çå¨"];
+
if (self.hidManager != nil) {
- // åæ¶æ³¨ååè°
+ // ç¡®ä¿ææåè°é½è¢«æ³¨é
IOHIDManagerRegisterDeviceMatchingCallback(self.hidManager, NULL, NULL);
IOHIDManagerRegisterDeviceRemovalCallback(self.hidManager, NULL, NULL);
- IOReturn ret = IOHIDManagerClose(self.hidManager, 0);
- if (ret != kIOReturnSuccess) {
- [self showLog:[NSString stringWithFormat:@"å
³éhid失败! é误ç :%d", ret]];
- }
+ // 忢HID管çå¨å¨RunLoopä¸çè¿è¡
+ IOHIDManagerUnscheduleFromRunLoop(self.hidManager, CFRunLoopGetMain(), kCFRunLoopDefaultMode);
- [self showLog:@"IOHIDManagerå·²å
³é"];
- self.hidManager = nil;
+ // è¿è¡RunLoopä¸å°æ®µæ¶é´ï¼è®©ç³»ç»å¤çå¯è½çæèµ·æä½
+ CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.5, false);
+
+ // å°è¯å
³éHID管çå¨
+ IOReturn ret = IOHIDManagerClose(self.hidManager, kIOHIDOptionsTypeNone);
+
+ if (ret == kIOReturnSuccess) {
+ [self showLog:@"IOHIDManagerå
³éæå"];
+ self.hidManager = nil;
+ } else {
+ [self showLog:[NSString stringWithFormat:@"IOHIDManagerå
³é失败ï¼é误ç :%d", ret]];
+
+ // å°è¯å¼ºå¶éæ¾
+ [self showLog:@"å°è¯å¼ºå¶éæ¾HID管çå¨èµæº"];
+ CFRelease(self.hidManager);
+ self.hidManager = nil;
+ }
}
- return true;
+ [self showLog:@"HID管çå¨å
³éæä½å·²å®æ"];
+ [self openHid];
}
-
/// åéæ°æ®ç»è®¾å¤
-(void)writeToDevice:(NSData *)data{
if(self.deviceInfoCha == nil){
diff --git a/MouseSdk/MouseSdk.xcworkspace/xcuserdata/yaozuopan.xcuserdatad/UserInterfaceState.xcuserstate b/MouseSdk/MouseSdk.xcworkspace/xcuserdata/yaozuopan.xcuserdatad/UserInterfaceState.xcuserstate
index 1e7b9b1..c559e17 100644
Binary files a/MouseSdk/MouseSdk.xcworkspace/xcuserdata/yaozuopan.xcuserdatad/UserInterfaceState.xcuserstate and b/MouseSdk/MouseSdk.xcworkspace/xcuserdata/yaozuopan.xcuserdatad/UserInterfaceState.xcuserstate differ
diff --git a/MouseSdk/MouseSdk.xcworkspace/xcuserdata/yaozuopan.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/MouseSdk/MouseSdk.xcworkspace/xcuserdata/yaozuopan.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
index 45774dd..4195c21 100644
--- a/MouseSdk/MouseSdk.xcworkspace/xcuserdata/yaozuopan.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
+++ b/MouseSdk/MouseSdk.xcworkspace/xcuserdata/yaozuopan.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
@@ -3,4 +3,95 @@
uuid = "D56CBD13-B1CD-4964-946C-9C0A140796C8"
type = "0"
version = "2.0">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/MouseSdk/Pods/Pods.xcodeproj/xcuserdata/yaozuopan.xcuserdatad/xcschemes/xcschememanagement.plist b/MouseSdk/Pods/Pods.xcodeproj/xcuserdata/yaozuopan.xcuserdatad/xcschemes/xcschememanagement.plist
index d2ea65a..e170469 100644
--- a/MouseSdk/Pods/Pods.xcodeproj/xcuserdata/yaozuopan.xcuserdatad/xcschemes/xcschememanagement.plist
+++ b/MouseSdk/Pods/Pods.xcodeproj/xcuserdata/yaozuopan.xcuserdatad/xcschemes/xcschememanagement.plist
@@ -7,12 +7,12 @@
Masonry.xcscheme_^#shared#^_
orderHint
- 4
+ 2
Pods-MouseSdk.xcscheme_^#shared#^_
orderHint
- 2
+ 4