Search code examples
iosibm-mobilefirstjsonstore

IBM Mobilefirst 7 unable to make native function calls


I'm running an app, created using IBM MobileFirst 7, on iOS 8.4. At first it works fine: I can write to jsonstore and make other native function calls.

Then the application starts syncing and writing to the JSONStore (a lot of data) and it stops after a while (no errors in console). It usually happens while trying to call the WL.Client.invokeProcedure function.

I also noticed a strange behavior: if I double tap the home button it makes the next WL.Client.invokeProcedure call in the loop and I receive the results from the adapter but then it stops again (everytime I double tap the home button this happens). This also happens with other native calls (e.g. I tried to make a call to other native function in the JS console by using cordova and it only gets called after I double tap the home button).

Does anyone know what may be causing this behavior?~

EDIT:

Regarding the native calls: Since I'm using cordova, I can use a plugin to access some native functionality, example:

//this is what I meant by "native function calls"
cordova.exec(successCallback, errorCallback, 'SFRPowerSave', 'enable', []);

I'm not sure about WL.Client.invokeProcedure and WL.JSONStore functions, but I think they also use native code.

Here's what I'm doing:

//I get the first 50 dirty documents
function push(){
    var numberOfDocumentsToPush = 50;
    var dirtyDocuments = currentSyncStore.dirtyDocuments.splice(0, numberOfDocumentsToPush);

    //then I call the adapter add method and return a promise
    return when(WL.Client.invokeProcedure({
        adapter : adapter.name,
        procedure : adapter.push.procedure,
        parameters : [ JSON.stringify(dirtyDocuments), 
                       JSON.stringify({add: addParams}) ],
        compressResponse : false
    }, {
        timeout: adapter.timeout,
        invocationContext: {context: this, document: dirtyDocuments}
    });
}
//after the promise is returned, I get the next 50 dirty documents and call the push function again, I usually have a lot of dirtyDocuments (lets say 10000). 
//After a while it just stops, the WL.Client.invokeProcedure doesn't reject or resolve the promise and no timeout occurs.
//I can interact with the interface of the application but if I try to call some native function, it will not work (but it gets called immediatly after entering the multitask mode - double tap home button in ipad/iphone)


//In the adapter I call the stored procedure from the DB2 database one time for each document:
function pushLogs(logs, params, addFunction){
    var parsedParams = JSON.parse(params);
    var addParsedParams = parsedParams.add;


    var addConfig = getConfig("logs", addFunction, JSON.stringify(addParsedParams));

    var parsedLogs = JSON.parse(logs);

    var globalResult = {
            isSuccessful: true,
            responses: []
    };

    for (var i = 0; i < parsedLogs.length; i++) {
        var options = {
                values : JSON.stringify(parsedLogs[i].document),
                spConfig: addConfig
        };

        var result = invokeSQLStoredProcedure(options);

        globalResult.isSuccessful = globalResult.isSuccessful && result.isSuccessful;

        globalResult.responses.push(result);
    }

    return globalResult;
}

Solution

  • A PMR was opened to handle this question. It has turned out to be a Cordova defect and is now being handled via APAR PI47657: Application hangs when trying to call JSONStore asynchronously to sync data.

    The fix will appear in a future iFix release, available at IBM Fix Central (as well as via the PMR opened).