IOServiceNameMatching не может последовательно найти службу dextIOS

Программируем под IOS
Ответить
Anonymous
 IOServiceNameMatching не может последовательно найти службу dext

Сообщение Anonymous »

Я использую следующий код, чтобы найти службу dext. Код выполняется при запуске. Это приложение, которое мы разрабатываем для iPad, драйвер включается в настройках iOS перед запуском приложения.
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.
Я пробовал использовать уведомления о совпадениях, но получил тот же результат, что и IOServiceGetMatchingServices.
  • Если я сначала запускаю приложение, а затем подключаю USB-устройство, вызывается MyDriver Start() и MyDriver доступен. Это позволяет мне найти драйвер и вызвать на нем IOServiceOpen. После этого все работает как положено.
  • При работающем драйвере, если я отключил и снова включил драйвер в настройках iOS, не отключая/повторно подключая устройство, MyDriver Start() не будет вызван, а соответствующая служба с IOServiceMatching("IOUserService") не сможет найти его снова.
В файле info.plist драйвера мы используем IOUSBHostDevice для IOProviderClass, поскольку наше устройство не является USB-устройством HID. Судя по тому, что я вижу, похоже, что устройство должно быть физически подключено после запуска приложения, чтобы драйвер запустился и сопоставление произошло правильно.
Мне интересно, можно ли что-нибудь сделать, чтобы заставить его работать правильно. работать для рабочих процессов, которые я упомянул в пунктах 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»