4

I'm using Cordova 3.5.0 on iOS.

My application loads, the 'deviceReady' event is fired, but no plugin actions are executed until I put my app in the background (by going to the homescreen).

When I go back into my app, the 'resume' handler gets fired, logs show up in LLDB and the PushNotification plugin starts listening to events and tries to register push notifications.

Why does this only happen once I have put my app to sleep?

These are the installed plugins (cordova plugins ls):

com.patrickheneise.cordova.statusbar 0.0.2 "Status Bar"
com.phonegap.plugins.PushPlugin 2.2.1 "PushPlugin"
com.phonegap.plugins.actionsheet 1.0.0 "ActionSheet"
org.apache.cordova.console 0.2.10-dev "Console"
org.apache.cordova.dialogs 0.2.9-dev "Notification"
org.apache.cordova.vibration 0.3.10-dev "Vibration"

Thanks in advance.

tschoffelen
  • 518
  • 7
  • 21

2 Answers2

6

I had the same problem in my own app with cordova 6.3.0. After dozens of tests I found the problem.

I had a Content-Security-Policy meta-tag defined like this:

<meta http-equiv="Content-Security-Policy" content="default-src *;
      style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 
     'unsafe-eval'; media-src *">

It turns out default-src * is not enough.

With the following policy it works:

 <meta http-equiv="Content-Security-Policy" content="default-src *
       'self' data: gap:  https://ssl.gstatic.com; style-src 'self' 'unsafe-inline';
       script-src 'self' 'unsafe-inline' 'unsafe-eval'; media-src *">

The key part here ist the gap:

It seems to be required, to properly execute cordova plugin code on iOS. But I still find it strange that the policy is influenced by resuming to the app.

Additional note: the problem seems to affect all plugins that are displayed outside the webview. I had it with cordova-plugin-camera, phonegap-plugin-barcodescanner, cordova-plugin-dialogs. Other plugins like cordova-plugin-file-transfer worked just fine.

HannesH
  • 1,024
  • 1
  • 11
  • 16
  • working on a small phone project that used the statusbar, it just wouldn't show on first run of the app, but on resume it would. this CSP fixed it. – Terry Kernan Dec 06 '19 at 00:12
0

Tom, although not really an answer as I'm not sure what fixed it, I can confirm that my app no longer does this. This is what I did:

Changed cordova to use 3.3.0 instead of 3.4.0 and at the same time, specified version numbers for my plugins:

<gap:plugin name="org.apache.cordova.console" version="0.2.7" />
<gap:plugin name="org.apache.cordova.contacts" version="0.2.11" />
<gap:plugin name="org.apache.cordova.device" version="0.2.8" />
<gap:plugin name="org.apache.cordova.device-orientation" version="0.3.5" />
<gap:plugin name="org.apache.cordova.dialogs" version="0.2.6" />
<gap:plugin name="org.apache.cordova.file" version="1.0.1" />
<gap:plugin name="org.apache.cordova.file-transfer" version="0.4.2" />
<gap:plugin name="org.apache.cordova.network-information" version="0.2.7" />
<gap:plugin name="org.apache.cordova.vibration" version="0.3.7" />

Then I re-built my app and it worked properly on iOS. So I then upgraded Cordova back to 3.4.0, kept the plugins the same, and it still worked.

So I don't know if it was because of an old plugin version or because I simply downgraded and then upgraded Cordova, but it has now fixed it.

Oh and FYI, I'm using Phonegap Build, so that's why it's easier to down/upgrade Phonegap/Cordova versions.

SammyBlackBaron
  • 847
  • 3
  • 13
  • 31