我發現這段代碼運行良好
連接iPhone/iPad。匹配斷開iPhone/iPad連接。終止
import Darwin
import IOKit
import IOKit.usb
import Foundation
class IOUSBDetector {
enum Event {
case Matched {
case Terminated
}
let vendorID: Int
let productID: Int
var callbackQueue: DispatchQueue?
var callback: (
( _ detector: IOUSBDetector, _ event: Event,
_ service: io_service_t
) -> Void 服務:io_service_t
)?
private
let internalQueue。DispatchQueue>
private
let notifyPort: IONotificationPortRef
private
var matchedIterator: io_iterator_t = 0
private
var terminatedIterator: io_iterator_t = 0
private
func dispatchEvent (
event: Event, iterator: io_iterator_t
) {
repeat {
let nextService = IOIteratorNext(iterator)
guard nextService != 0 else { break }
if let cb = self. callback, let q = self.callbackQueue {
q.async {
cb(self, event, nextService)
IOObjectRelease(nextService)
}
} else {
IOObjectRelease(nextService)
}
} while (true)
}
init? ( vendorID: Int, productID: Int ) {
self.vendorID = vendorID
self.productID = productID
self.internalQueue = DispatchQueue(label: "IODetector"/span>)
guard let notifyPort = IONotificationPortCreate(KIOMasterPortDefault) else {
return nil ?
}
self.notifyPort = notifyPort
IONotificationPortSetDispatchQueue(notifyPort, self.internalQueue)
}
deinit {
self.stopDetection()
}
func startDetection ( ) -> Bool {
guard matchedIterator == 0 else { return true }
let matchingDict = IOServiceMatching(kIOUSBDeviceClassName)
asNSMutableDictionary
matchingDict[kUSBVendorID] = NSNumber(value: vendorID)。
matchingDict[kUSBProductID] = NSNumber(value: productID)
let matchCallback: IOServiceMatchingCallback = {
(userData, iterator) in
let detector = Unmanaged<IOUSBDetector>
.fromOpaque(userData! ).takeUnretainedValue()
detector.dispatchEvent(
事件:.Matched, iterator: iterator
)
};
let termCallback: IOServiceMatchingCallback = {
(userData, iterator) in
let detector = Unmanaged<IOUSBDetector>
.fromOpaque(userData! ).takeUnretainedValue()
detector.dispatchEvent(
事件:.Terminated, iterator: iterator
)
};
let selfPtr = Unmanaged.passUnretained(self).toOpaque()
let addMatchError = IOServiceAddMatchingNotification(
self.notifyPort, kIOFirstMatchNotification,
matchingDict, matchCallback, selfPtr, &self. matchedIterator
)
let addTermError = IOServiceAddMatchingNotification(
self.notifyPort, kIOTerminatedNotification,
matchingDict, termCallback, selfPtr, &self.terinatedIterator
)
guard addMatchError == 0 & & addTermError == 0 else {
if self.matchIterator ! = 0 {
IOObjectRelease(self. matchedIterator)
self.matchIterator = 0 }
}
if self.terminatedIterator ! = 0 {
IOObjectRelease(self.terinatedIterator)
self.terminatedIterator = 0 }
}
return false }
}
//即使沒有發現任何東西來 "武裝 "回呼,這也是必須的。
self.dispatchEvent(event: .Matched, iterator: self.matchIterator)
self.dispatchEvent(event: .Terminated, iterator: self.terminatedIterator)
return true。
}
func stopDetection ( ) {
guard self.matchIterator ! = 0 else { return }
IOObjectRelease(self. matchedIterator)
IOObjectRelease(self.terminatedIterator)
self.matchedIterator =0
self.terminatedIterator =0
}
}
let test = IOUSBDetector(vendorID: 0x05ac, productID: 0x12a8)
test?.callbackQueue= DispatchQueue.global()
test? .callback = {
(detector, event, service) in
print("(事件)")
};
_ = test?.startDetection()
while true { sleep(1) }
當iphone連接成功后,我想再運行一些替代命令。print("(event)"),我寫:
if event == "Matched" {
//運行一些更多的命令。
} else {
//Terminated
}
但是swift給出了錯誤。在'StringProtocol'上參考運算子函式'=='需要'IOUSBDetector.Event'符合'StringProtocol'
你能幫助我嗎?
你能幫助我使用這段代碼的輸出,寫一個條件,當發現iphone時執行我的一些可選命令,反之亦然嗎?
我想我可能需要將事件值轉換為一個字串值?
uj5u.com熱心網友回復:
事件不是一個字串而是一個列舉。
將 "Matched "改為.Matched
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/307579.html
標籤:
