监控连接的新设备

时间:2017-08-13 04:00:38

标签: swift cocoa

我希望每当新设备连接到计算机(如移动设备或USB)时,都会不断通知我的macOS应用程序。

我有以下代码,我试图在下面工作。

问题在于将import Foundation import IOKit import IOKit.usb public protocol USBWatcherDelegate: class { /// Called on the main thread when a device is connected. func deviceAdded(_ device: io_object_t) /// Called on the main thread when a device is disconnected. func deviceRemoved(_ device: io_object_t) } /// An object which observes USB devices added and removed from the system. /// Abstracts away most of the ugliness of IOKit APIs. public class USBWatcher { private weak var delegate: USBWatcherDelegate? private let notificationPort = IONotificationPortCreate(kIOMasterPortDefault) private var addedIterator: io_iterator_t = 0 private var removedIterator: io_iterator_t = 0 public init(delegate: USBWatcherDelegate) { self.delegate = delegate func handleNotification(instance: UnsafeMutableRawPointer?, _ iterator: io_iterator_t) { let watcher = Unmanaged<USBWatcher>.fromOpaque(instance!).takeUnretainedValue() let handler: ((io_iterator_t) -> Void)? switch iterator { case watcher.addedIterator: handler = watcher.delegate?.deviceAdded case watcher.removedIterator: handler = watcher.delegate?.deviceRemoved default: assertionFailure("received unexpected IOIterator"); return } while case let device = IOIteratorNext(iterator), device != IO_OBJECT_NULL { handler?(device) IOObjectRelease(device) } } let query = IOServiceMatching(kIOUSBDeviceClassName) let opaqueSelf = Unmanaged.passUnretained(self).toOpaque() // Watch for connected devices. IOServiceAddMatchingNotification( notificationPort, kIOMatchedNotification, query, handleNotification, opaqueSelf, &addedIterator) handleNotification(instance: opaqueSelf, addedIterator) // Watch for disconnected devices. IOServiceAddMatchingNotification( notificationPort, kIOTerminatedNotification, query, handleNotification, opaqueSelf, &removedIterator) handleNotification(instance: opaqueSelf, removedIterator) // Add the notification to the main run loop to receive future updates. CFRunLoopAddSource( CFRunLoopGetMain(), IONotificationPortGetRunLoopSource(notificationPort).takeUnretainedValue(), .commonModes) } deinit { IOObjectRelease(addedIterator) IOObjectRelease(removedIterator) IONotificationPortDestroy(notificationPort) } } extension io_object_t { /// - Returns: The device's name. func name() -> String? { let buf = UnsafeMutablePointer<io_name_t>.allocate(capacity: 1) defer { buf.deallocate(capacity: 1) } return buf.withMemoryRebound(to: CChar.self, capacity: MemoryLayout<io_name_t>.size) { if IORegistryEntryGetName(self, $0) == KERN_SUCCESS { return String(cString: $0) } return nil } } } import PlaygroundSupport PlaygroundPage.current.needsIndefiniteExecution = true class Example: USBWatcherDelegate { private var usbWatcher: USBWatcher! init() { usbWatcher = USBWatcher(delegate: self) } func deviceAdded(_ device: io_object_t) { print("device added: \(device.name() ?? "<unknown>")") } func deviceRemoved(_ device: io_object_t) { print("device removed: \(device.name() ?? "<unknown>")") } } 添加到我的viewDidLoad后,它只在程序首次启动时调用一次函数。如何在程序启动后仍然检查设备?

<?php

echo "Hello I am here<br>";

set_time_limit(1);

echo "Hello I am still here<br>";

0 个答案:

没有答案