Камера Cordova активируется только тогда, когда приложение переходит в фоновый режим

Я пытаюсь включить плагин камеры 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.

person indGov    schedule 04.05.2016    source источник


Ответы (1)


Я знаю, что опоздал, но сегодня у меня был тяжелый день, когда я пытался понять это, и я мог бы решить эту проблему, добавив следующее в свой тег Content Security Policy:

default-src * blob: 'self' gap:

Я помещаю вас в контекст. Это метатег в index.html моего веб-приложения.

<meta http-equiv="Content-Security-Policy" content="default-src * blob: 'self' gap:; script-src 'self' 'unsafe-inline' (…)/ >

Я нашел информацию о проблеме в этой статье. Как это объясняется:

«gap://ready file://*: требуется, чтобы разрешить загрузку удаленного контента в приложении iOS 10»

Я надеюсь, что это полезно для кого-то еще.

person Nadia Castelli    schedule 05.05.2017
comment
Извините, но это не сработало для меня. Я не использовал никакой фреймворк — только приложение Cordova по умолчанию, поэтому все мои скрипты в любом случае загружались из файловой системы, и у меня был атрибут self в моем метатеге CSP. В итоге я написал плагин для обработки всего, что было в блоке shouldStartLoadWithRequest. - person indGov; 15.06.2017