io_service_t mService = IO_OBJECT_NULL;
kern_return_t ret = kIOReturnSuccess;
io_iterator_t iterator = IO_OBJECT_NULL;
//temporary checking for all services
//I refined it further using other keys
CFMutableDictionaryRef matchingDict = IOServiceMatching("IOUserService");
if (__builtin_available(iOS 15.0, *)) {
ret = IOServiceGetMatchingServices(kIOMainPortDefault, matchingDict, &iterator);
} else {
// Fallback on earlier versions
}
if (ret != kIOReturnSuccess)
{
printf("Unable to find service");
}
while ((mService = IOIteratorNext(iterator)) != IO_OBJECT_NULL)
{
//Only able to find "MyDriver" if launching the app first and then connecting the device
ret = IOServiceOpen(mService, mach_task_self_, 0, &mConnection);
..........
}
У нас нет проблем с сопоставлением на устройстве с использованием IOServiceMatching("IOUSBDevice") и idVendor + idProduct в качестве ключей. Неважно, подключено ли устройство до или после запуска приложения, сопоставление на устройстве всегда возвращает правильное значение.
Проблема, с которой я столкнулся, заключается в поиске соответствующего драйвера.
- Когда USB-устройство подключено перед запуском приложения (с драйвером, уже включенным в настройках iOS), я замечаю, что MyDriver Start() не вызывается, в результате чего MyDriver не отображается, когда я пытаюсь получить соответствующую службу с помощью IOServiceMatching("IOUserService"). Другие, такие как AppleBCMWLANBusInterfacePCIe, IO80211ReporterProxy, AppleBCMWLANCore, доступны, но MyDriver.
- Если я сначала запускаю приложение, а затем подключаю USB-устройство, вызывается MyDriver Start() и MyDriver доступен. Это позволяет мне найти драйвер и вызвать на нем IOServiceOpen. После этого все работает как положено.
- При работающем драйвере, если я отключил и снова включил драйвер в настройках iOS, не отключая/повторно подключая устройство, MyDriver Start() не будет вызван, а соответствующая служба с IOServiceMatching("IOUserService") не сможет найти его снова.
Мне интересно, можно ли что-нибудь сделать, чтобы заставить его работать правильно. работать для рабочих процессов, которые я упомянул в пунктах 1 и 3 выше.
Спасибо
Файл MyDriver Info.plist
IOKitPersonalities
MyDriver
CFBundleIdentifier
$(PRODUCT_BUNDLE_IDENTIFIER)
CFBundleIdentifierKernel
com.apple.kpi.iokit
CFBundleName
$(PRODUCT_NAME)
IOClass
IOUserService
IOMatchCategory
$(PRODUCT_BUNDLE_IDENTIFIER)
IOProviderClass
IOUserResources
IOResourceMatch
IOKit
IOUserClass
MyDriver
IOUserServerName
$(PRODUCT_BUNDLE_IDENTIFIER)
MyDriverUserClientProperties
IOClass
IOUserUserClient
IOUserClass
MyDriverClient
bConfigurationValue
1
bInterfaceNumber
0
idProduct
1234
idVendor
5678
MyDriver.entitlements
com.apple.developer.driverkit
com.apple.developer.driverkit.transport.usb
com.apple.security.app-sandbox
Подробнее здесь: https://stackoverflow.com/questions/789 ... xt-service
Мобильная версия