Я пытаюсь включить плагин камеры Cordova для приложения iPad, но после вызова камеры с помощью navigator.camera она отображается на экране только после того, как приложение перешло в фоновый режим (нажатие кнопки «Домой»). Однако это происходит только в том случае, если я прослушиваю событие webView: shouldStartLoadWithRequest, которое я использую в качестве моста javascript-Objective C.
Используемые версии:
- Кордова: 5.4.1
- Кордова.js для платформы iOS/платформы: 4.1.1
- Xкод: 7.2
Шаги по настройке проекта:
- Cordova создать pluginTest com.pluginTest pluginTest
- cd pluginTest
- платформа кордова добавить ios
- Плагин Cordoba добавить Cordoba-плагин-камеру
Чтобы протестировать камеру, я отредактировал файл index.js, сгенерированный Cordova, чтобы функция onDeviceReady выглядела так:
onDeviceReady: function() {
app.receivedEvent('deviceready');
alert(navigator.camera);
navigator.camera.getPicture(function(imageData) {
alert('success');
},
function(message) {
alert('fail');
});
}
Кажется, это работает нормально, и камера появляется после предупреждения.
Но в MainViewController.m, если я слушаю событие webView: shouldStartLoadWithRequest, например:
-(BOOL) webView:(UIWebView *)webView shouldStartLoadWithRequest: (NSURLRequest *)request navigationType: (UIWebViewNavigationType)navigationType {
NSString* req = [[request URL] absoluteString];
NSLog(req);
return YES;
}
Затем, как только приложение загружается, первым изменением местоположения является index.html, после чего — после выполнения navigator.camera.getPicture — существует бесконечное количество изменений местоположения, попадающих в указанный выше метод, и URL-адрес всегда имеет значение «gap:/». /готов'. Как только кнопка «Домой» нажата, поток запросов прекращается, и появляется камера. Любые идеи, почему это может происходить?
Кроме того, мне нужно было, чтобы мой MainViewController соответствовал протоколу UIWebViewDelegate, чтобы он фактически прослушивал событие shouldStartLoadWithRequest, если я использовал 4.1.1 cordova.js. В этом случае для возникновения проблемы достаточно было просто соответствовать протоколу UIWebViewDelegate. Как ни странно, если бы я использовал более старую платформу Cordova — в частности, 3.9.2 — тогда кажется, что CDVViewController уже прослушивает событие shouldStartLoadWithRequest. В любом случае камера появляется после приостановки работы приложения.
Трассировка консоли в Xcode показывает:
2016-05-04 19:02:51.015 plugTest2[3949:2271226] file:///var/mobile/Containers/Bundle/Application/FE21DCB1-7ADE-4754-80F1- 7055F8E1F450/plugTest2.app/www/index.html
2016-05-04 19:02:51.020 plugTest2[3949:2271226] Resetting plugins due to page load.
2016-05-04 19:02:51.759 plugTest2[3949:2271226] Finished load of: file:///var/mobile/Containers/Bundle/Application/FE21DCB1-7ADE-4754-80F1-7055F8E1F450/plugTest2.app/www/index.html
2016-05-04 19:02:57.149 plugTest2[3949:2271226] gap://ready
За следующими 4 секундами последовало около сотни URL-адресов «gap://ready»…
2016-05-04 19:03:01.738 plugTest2[3949:2271226] gap://ready
2016-05-04 19:03:02.112 plugTest2[3949:2271226] Snapshotting a view that has not been rendered results in an empty snapshot. Ensure your view has been rendered at least once before snapshotting or snapshot after screen updates.