Uploaded image for project: 'Apache Cordova'
  1. Apache Cordova
  2. CB-12815

WKWebView plugin will not execute Javascript while app is backgrounded

    XMLWordPrintableJSON

    Details

      Description

      iOS 10 now has power saving requirements and will not allow background tasks to function to save battery. For example, a VoIP app can no longer use a polling strategy to stay awake. The new recommended way, according to Apple (https://developer.apple.com/library/content/documentation/Performance/Conceptual/EnergyGuide-iOS/OptimizeVoIP.html), is to use VoIP silent push notifications to wake up the app and do the work.

      I have verified that all VoIP silent push notifications arrive correctly when using the UIWebView with a vanilla Cordova install. However, when adding the cordova-plugin-wkwebview-engine, the Javascript callbacks do not fire correctly when receiving the VoIP silent push notification while the app is in the background. What happens is the first notification is queued, then the next notification forces the first notification result to the callback. Effectively, making each push notification 1 behind. When the app is put back into the foreground, the last push notification callback is fired.

      When the app is in the foreground, all works fine.

      The issue is with the call to "setTimeout" in the iOSExec.nativeCallback function. It makes sense that if Apple is trying to minimize background execution to save battery, then they would limit the use of the setTimeout feature.

      This issue is fixed by changing the iOSExec.nativeCallback function to call the cordova.callbackFromNative function directly without a setTimeout wrapper. I understand that removing setTimeout is not an elegant solution and may cause deadlocks. Maybe a new argument isBackground or something to that effect.

      src/www/ios/ios-wkwebview-exec.js

          iOSExec.nativeCallback = function(callbackId, status, message, keepCallback, debug) {
              var success = status === 0 || status === 1;
              var args = convertMessageToArgsNativeToJs(message);
          
           // setTimeout(function(){
          	    cordova.callbackFromNative(callbackId, success, status, args, keepCallback);
           // }, 0);
          };
      

        Attachments

          Issue Links

            Activity

              People

              • Assignee:
                shazron Shazron Abdullah
                Reporter:
                rich4storm Rich Storm
              • Votes:
                0 Vote for this issue
                Watchers:
                4 Start watching this issue

                Dates

                • Created:
                  Updated:
                  Resolved: