需要一个能够检测iPhone插入时间的API

Joh*_*ohn 3 iphone macos objective-c ios

我正在为Mac制作应用程序,我需要一个能够检测到iPhone插入的API.谢谢.

编辑:为了澄清,具体来说,我需要一个API来检测iPhone何时插入Mac上的USB端口.

Tom*_*mmy 6

我没有一个完整的答案,但实现你想要的程序是USB Prober,随Xcode提供并位于/Developer/Applications/Utilities/USB Prober.app.该程序是开源的,浏览器可查看的存储库位于此处,整个项目包含在此下载中.我居然发现一个旧版本更有帮助,因为可以在这里,特别是BusProbeClass.

它们都依赖于IOKit,Apple的文档似乎在数量和质量上都非常缺乏.

这是一个沉重的阅读,但如果你退房,+ USBProbe那么你会看到它获得当前USB设备的列表,IOUSBDeviceInterface在变量中为每个设备获取s deviceIntf,然后将它们推送到对程序的其余部分有用的地方.如果你+ outputDevice: locationID:deviceNumber:在相同的源文件中检查下方,你会发现GetDescriptor看起来似乎可以用于IOUSBDeviceDescriptor获取包括供应商和产品ID在内的属性,USB实施者论坛保证其组合是唯一的.

使用供应商和产品ID,您可以搜索任何特定的USB设备.从我的Mac系统信息我可以告诉你,iPhone 4的产品ID为0x1297,Apple的供应商ID为0x05ac.

额外的:从解剖代码,如果你删除一大堆检查事情成功并将其压缩到演示的东西,那么以下至少是一个测试iPhone 4是否插入现在(你需要)链接到Foundation和IOKit框架):

#include <stdio.h>
#import <Foundation/Foundation.h>
#import <IOKit/usb/IOUSBLib.h>
#import <IOKit/IOCFPlugIn.h>
#import <mach/mach_port.h>

int main (int argc, const char * argv[])
{
    // get the port through which to talk to the kernel
    mach_port_t masterDevicePort;
    IOMasterPort(MACH_PORT_NULL, &masterDevicePort);

    // create a dictionary that describes a search
    // for services provided by USB
    CFDictionaryRef matchingDictionary = IOServiceMatching(kIOUSBDeviceClassName);

    // get an iterator for all devices that match
    // the dictionary
    io_iterator_t deviceIterator;
    IOServiceGetMatchingServices(
            masterDevicePort,
            matchingDictionary,
            &deviceIterator);

    // iterate through the iterator...
    io_service_t ioDevice;
    while((ioDevice = IOIteratorNext(deviceIterator)))
    {
        IOUSBDeviceInterface **deviceInterface = NULL;
        IOCFPlugInInterface **ioPlugin = NULL;
        SInt32 score;

        // get a pointer to the device, stored to ioPlugin
        IOCreatePlugInInterfaceForService(
            ioDevice,
            kIOUSBDeviceUserClientTypeID,
            kIOCFPlugInInterfaceID,
            &ioPlugin,
            &score);

        // ask the device for its interface
        (*ioPlugin)->QueryInterface(
            ioPlugin, 
            CFUUIDGetUUIDBytes(kIOUSBDeviceInterfaceID),
            (void *)&deviceInterface);

        // make and issue a request to get the device descriptor
        IOUSBDeviceDescriptor deviceDescriptor;
        IOUSBDevRequest request;

        request.bmRequestType = USBmakebmRequestType(kUSBIn, kUSBStandard, kUSBDevice);
        request.bRequest = kUSBRqGetDescriptor;
        request.wValue = kUSBDeviceDesc << 8;
        request.wIndex = 0;
        request.wLength = sizeof(deviceDescriptor);
        request.pData = &deviceDescriptor;

        (*deviceInterface)->DeviceRequest(deviceInterface, &request);

        // now we have the device descriptor, do a little cleaning up -
        // release the interface and the device
        (*deviceInterface)->Release(deviceInterface);
        IOObjectRelease(ioDevice);

        // ensure that the values returned are in the appropriate
        // byte order for this platform
        CFSwapInt16LittleToHost(deviceDescriptor.idVendor);
        CFSwapInt16LittleToHost(deviceDescriptor.idProduct);

        // check whether we have an iPhone 4 attached
        if(deviceDescriptor.idVendor == 0x05ac && deviceDescriptor.idProduct == 0x1297)
            printf("iPhone 4 is connected!");
    }

    // clean up by releasing the device iterator
    // and returning the communications port
    IOObjectRelease(deviceIterator);
    mach_port_deallocate(mach_task_self(), masterDevicePort);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我还没有弄清楚如何观察插入式设备的变化.