iPhone连接MaOS时检测USB

如何解决iPhone连接MaOS时检测USB

这段 Swift 代码效果很好,结果是:

连接 iPhone:Event Matched 断开 iPhone:Event Terminated

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
    )?


    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")

        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)
            as NSMutableDictionary
        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(
                    event: .Matched,iterator: iterator
                )
        };
        let termCallback: IOServiceMatchingCallback = {
            (userData,iterator) in
                let detector = Unmanaged<IoUSBDetector>
                    .fromOpaque(userData!).takeUnretainedValue()
                detector.dispatchEvent(
                    event: .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,termCallback,&self.terminatedIterator
        )

        guard addMatchError == 0 && addTermError == 0 else {
            if self.matchedIterator != 0 {
                IOObjectRelease(self.matchedIterator)
                self.matchedIterator = 0
            }
            if self.terminatedIterator != 0 {
                IOObjectRelease(self.terminatedIterator)
                self.terminatedIterator = 0
            }
            return false
        }

        // This is required even if nothing was found to "arm" the callback
        self.dispatchEvent(event: .Matched,iterator: self.matchedIterator)
        self.dispatchEvent(event: .Terminated,iterator: self.terminatedIterator)

        return true
    }


    func stopDetection ( ) {
        guard self.matchedIterator != 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,service) in
        print("Event \(event)")
};
_ = test?.startDetection()
while true { sleep(1) }

这段 Swift 代码效果很好,结果是:

连接 iPhone:Event Matched 断开 iPhone:Event Terminated

如何:如果 iPhone 已连接,则执行一些命令 你能帮我写下命令放在哪里吗?

从 iPhone 获取信息的命令我已经有了,但不知道把它放在哪里

我尝试用

替换print("Event (event)")
if event == Matched { 
} else { 
} 

但不工作

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?