/// <summary> /// 开始监听链接 /// 需要使用线程方式调用 /// </summary> public void StartListen() { if (!iSStartListen) { iSStartListen = true; try { deviceNotificationCallback = NotificationCallback; deviceDFUConnectedNotificationCallback = DfuConnectCallback; deviceRecoveryConnectedNotificationCallback = RecoveryConnectCallback; deviceDFUDisConnectedNotificationCallback = DfuDisconnectCallback; deviceRecoveryDisConnectedNotificationCallback = RecoveryDisconnectCallback; IntPtr zero = IntPtr.Zero; kAMDError error = (kAMDError)MobileDevice.AMDeviceNotificationSubscribe(deviceNotificationCallback, 0, 1, 0, ref zero); if (error != kAMDError.kAMDSuccess) { //Check "Apple Mobile Device Service" status ListenErrorEvent?.Invoke(this, new ListenErrorEventHandlerEventArgs("AMDeviceNotificationSubscribe failed with error : " + error, ListenErrorEventType.StartListen)); } IntPtr userInfo = IntPtr.Zero; error = (kAMDError)MobileDevice.AMRestoreRegisterForDeviceNotifications(deviceDFUConnectedNotificationCallback, deviceRecoveryConnectedNotificationCallback, deviceDFUDisConnectedNotificationCallback, deviceRecoveryDisConnectedNotificationCallback, 0, ref userInfo); if (error != kAMDError.kAMDSuccess) { ListenErrorEvent?.Invoke(this, new ListenErrorEventHandlerEventArgs("AMRestoreRegisterForDeviceNotifications failed with error : " + error, ListenErrorEventType.StartListen)); } //LoopRun CoreFoundation.CFRunLoopRun(); } catch (Exception ex) { if (ListenErrorEvent != null) { ListenErrorEvent(this, new ListenErrorEventHandlerEventArgs(ex.Message, ListenErrorEventType.StartListen)); } } } }
/// <summary> /// 正常链接回调 /// </summary> /// <param name="callback">The callback.</param> private void NotificationCallback(ref AMDeviceNotificationCallbackInfo callback) { try { switch (callback.Msg) { case ConnectNotificationMessage.Connected: var device = FindConnectedDevice(callback.DevicePtr); if (device == null) { device = new iOSDevice(callback.DevicePtr); currentConnectedDevice.Add(device); } CommonConnectEvent?.Invoke(this, new DeviceCommonConnectEventArgs(device, ConnectNotificationMessage.Connected)); break; case ConnectNotificationMessage.Disconnected: var disConnectDevice = FindConnectedDevice(callback.DevicePtr); if (disConnectDevice != null) { currentConnectedDevice.Remove(disConnectDevice); } CommonConnectEvent?.Invoke(this, new DeviceCommonConnectEventArgs(disConnectDevice, ConnectNotificationMessage.Disconnected)); break; case ConnectNotificationMessage.Unknown: break; } } catch (Exception ex) { ListenErrorEvent?.Invoke(this, new ListenErrorEventHandlerEventArgs(ex.Message, ListenErrorEventType.Connect)); } }