2015-08-24 3 views
0

В моей среде QA гибридное приложение Android не подключается к серверу MFP.
На моем локальном компьютере, используя инструменты MFP CLI, приложение подключается без проблем.
В моей среде QA гибридное приложение iPhone подключается к серверу MFP.Гибридное приложение для Android, не подключающееся к серверу MobileFirst

Обратный вызов на несостоявшегося WL.Client.connect() получает этот объект ошибки:

{ 
    "status": 403 
} 

Вот трассировки стека из обработчика ошибок:

08-25 14:31:56.016: D/CordovaLog(27971): file:///android_asset/www/default/assets/js/dependencies.js: Line 23 : trace: Error 
08-25 14:31:56.016: D/CordovaLog(27971):  at Object.connectionFailure [as onFailure] (file:///android_asset/www/default/assets/js/dependencies.js:23:190) 
08-25 14:31:56.016: D/CordovaLog(27971):  at onFailureResetSettings (file:///android_asset/www/default/worklight/worklight.js:8251:12) 
08-25 14:31:56.016: D/CordovaLog(27971):  at onInitFailure (file:///android_asset/www/default/worklight/worklight.js:8245:4) 
08-25 14:31:56.016: D/CordovaLog(27971):  at Object.onFailure (file:///android_asset/www/default/worklight/worklight.js:951:20) 
08-25 14:31:56.016: D/CordovaLog(27971):  at klass.window.WLJSX.Ajax.WLRequest.WLJSX.Class.create.onFailure (file:///android_asset/www/default/worklight/worklight.js:3650:26) 
08-25 14:31:56.016: D/CordovaLog(27971):  at klass.window.WLJSX.Ajax.WLRequest.WLJSX.Class.create.onWlFailure (file:///android_asset/www/default/worklight/worklight.js:3599:12) 
08-25 14:31:56.016: D/CordovaLog(27971):  at Object.<anonymous> (file:///android_asset/www/default/worklight/worklight.js:3437:27) 
08-25 14:31:56.016: D/CordovaLog(27971):  at Object.<anonymous> (file:///android_asset/www/default/worklight/wljq.js:1202:33) 
08-25 14:31:56.016: D/CordovaLog(27971):  at fire (file:///android_asset/www/default/worklight/wljq.js:1047:30) 
08-25 14:31:56.016: D/CordovaLog(27971):  at Object.self.fireWith [as rejectWith] (file:///android_asset/www/default/worklight/wljq.js:1158:7) 

Я не вижу ничего в серверных журналах о запрос отклоненного соединения.

Я вызываю WL.Client.connect() из обработчика успеха моего вызова WL.Client.init(), который сам вызывает событие загрузки окна.

(ПРИМЕЧАНИЕ: на основе комментариев ниже я изменил называть connect() от wlCommonInit(), но нет никаких изменений ... трассировки стека выше от этого сценария)

Вот код делает соединение:

(function() { 
    'use strict'; 

    angular 
    .module('myng-worklight', []) 
    .run(WorklightRun) 

    WorklightRun.$inject = ['$rootScope', '$q']; 

    /** 
    * Load worklight 
    */ 
    function WorklightRun($rootScope, $q) { 

    // Worklight statuss 
    var worklightDeferred = $q.defer(); 
    $rootScope.worklightPromise = worklightDeferred.promise; 
    $rootScope.worklightLoaded = false; 
    $rootScope.worklightConnected = false; 

    var worklightLoadEvent = null; 
    worklightLoadEvent = document.createEvent('CustomEvent'); 

    // Worklight connect options 
    var wlConnectOptions = { 
     timeout: 30000, 

     onFailure: connectionFailure, 

     onSuccess: function() { 
     console.log('MFP: Connected'); 
     $rootScope.worklightConnected = true; 
     worklightDeferred.resolve(); 
     } 
    }; 

    // Worklight init options 
    var wlInitOptions = { 
     timeout: 10000, 

     onConnectionFailure: connectionFailure, 

     onFailure: connectionFailure, 

     onSuccess: function() { 
     console.log('MFP: Loaded'); 
     $rootScope.worklightLoaded = true; 
     if (window.addEventListener) { 
      window.addEventListener(WL.Events.WORKLIGHT_IS_CONNECTED, wlConnectedHandler, true); 
      window.addEventListener(WL.Events.WORKLIGHT_IS_DISCONNECTED, wlDisconnectedHandler, true); 
     } else if (window.attachEvent) { 
      window.attachEvent(WL.Events.WORKLIGHT_IS_CONNECTED, wlConnectedHandler); 
      window.attachEvent(WL.Events.WORKLIGHT_IS_DISCONNECTED, wlDisconnectedHandler); 
     } 
     console.log('MFP: About to connect with: ' + JSON.stringify(wlConnectOptions, null, 2)); 
     WL.Client.connect(wlConnectOptions); 
     } 
    }; 
    // we should connect on the cb from init -- output! 

    // Listen for load/onload and start worklight init 
    if (window.addEventListener) { 
     window.addEventListener('load', loadHandler, false); 
    } else if (window.attachEvent) { 
     window.attachEvent('onload', loadHandler); 
    } 


    function connectionFailure(err) { 
     console.log('MFP: No Connection - ' + JSON.stringify(err, null, 2)); 
     worklightDeferred.reject(err); 
    } 

    function loadHandler() { 
     try { 
     console.log('MFP: Load event detected, about to init with: ' + JSON.stringify(wlInitOptions, null, 2)); 
     WL.Client.init(wlInitOptions); 
     } catch (err) { 
     console.error('MFP: "WL" not defined - ' + err); 
     connectionFailure(); 
     worklightLoadEvent.initCustomEvent('worklightLoadFailure', true, false, {}); 
     window.dispatchEvent(worklightLoadEvent); 
     } 
    } 

    function wlConnectedHandler() { 
     $rootScope.worklightConnected = true; 
     WL.App.hideSplashScreen(); 
    } 

    function wlDisconnectedHandler() { 
     $rootScope.worklightFailureAcknowledged = true; 
     $rootScope.worklightConnected = false; 
     WL.App.hideSplashScreen(); 
    } 
    } 
})(); 

Возможно, это связано с настройками подлинности Android-приложений? (Например, publicSigningKey в application-descriptor.xml или customTests в authenticationConfig.xml)

Вот соответствующий бит от application-descriptor.xml:

<android securityTest="customTests" version="1.0"> 
    <worklightSettings include="false"/> 
    <pushSender key="XYZ" senderId="123"/> 
    <security> 
     <encryptWebResources enabled="false"/> 
     <testWebResourcesChecksum enabled="false" ignoreFileExtensions="png, jpg, jpeg, gif, mp4, mp3"/> 
     <publicSigningKey>MIIBI...</publicSigningKey> 
     <packageName>com.MyPackage</packageName> 
    </security> 
</android> 

И от authenticationConfig.xml:

<customSecurityTest name="customTests"> 
    <test realm="wl_antiXSRFRealm" step="1" /> 
    <test realm="wl_authenticityRealm" step="1" /> 
    <test realm="wl_remoteDisableRealm" step="1" /> 
    <test realm="wl_directUpdateRealm" mode="perSession" step="1" /> 
    <test realm="wl_anonymousUserRealm" isInternalUserID="true" step="1" /> 
    <test realm="wl_deviceNoProvisioningRealm" isInternalDeviceID="true" step="2" /> 
</customSecurityTest> 
+0

Вызов подключения из обработчика успеха init ?! Кто сказал вам сделать это так? Добавьте свою реализацию. –

+0

@IdanAdar - похоже, у нас были условия гонки между 'init()' завершением и вызовом 'connect()'. Как мы должны выполнить ручной вызов 'connect()'? – N2O

+0

Это не код реализации, который я просил. Добавьте код, в котором вы подключаетесь. –

ответ

0

ИМО это неправильно.

Вы не должны звонить WL.Client.connect таким образом.
API-интерфейс Worklight должен вызываться внутри функции wlCommonInit(), расположенной в общем файле \ main.js, а не из общего файла \ initOptions.js.

Посмотрите на различные примеры применения, представленные в Developer Center. Ни один из них не реализован таким образом ... (неважно, что образцы для 7.1, и вы используете 6.2, так как концепция такая же).

Все действия onSuccess не должны выполняться таким образом;

+0

Я изменил код для реализации 'wlCommonInit()'. Результаты те же, и вызовы происходят в том же порядке, что и при первоначальной реализации. (кстати, мы используем 7.0) – N2O

+0

Предоставьте полное исключение ошибки и stacktrace. –

+0

Я обновил вопрос с помощью объекта ошибки и трассировки стека. – N2O

Смежные вопросы