混合 Android 应用程序未连接到 MobileFirst 服务器

Posted

技术标签:

【中文标题】混合 Android 应用程序未连接到 MobileFirst 服务器【英文标题】:Hybrid Android app not connecting to MobileFirst server 【发布时间】:2015-08-24 13:59:55 【问题描述】:

在我的 QA 环境中,混合 android 应用未连接到 MFP 服务器。 在我的本地计算机上,使用 MFP CLI 工具,应用程序连接没有问题。 在我的 QA 环境中,混合 iPhone 应用程序连接到 MFP 服务器。

失败的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.init() 调用的成功处理程序调用WL.Client.connect(),它本身在窗口加载事件中被调用。

注意:基于下面的 cmets,我已更改为从 wlCommonInit() 调用 connect(),但没有任何变化......上面的堆栈跟踪来自该场景)

这是连接的代码:

(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 应用的真实性设置有关? (例如 application-descriptor.xml 中的 publicSigningKey 或 authenticationConfig.xml 中的 customTests

这是来自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>

【问题讨论】:

从init的成功处理函数调用connect?!谁让你这样做的?请添加您的实现。 @IdanAdar - 看起来我们在init() 完成和对connect() 的调用之间存在竞争条件。我们应该如何手动调用connect() 这不是我要求的实现代码。在您进行连接的位置添加代码。 我也将添加...鉴于我现在看到的是403,我认为这可能与应用程序真实性配置有关。不过,我会添加其他代码。 MFP 代码应该在调用 wlCommonInit 后运行,这是 WL.Client.connect 方法应该在的地方,而不是通过 WL.Client.init 直接使用。请,下次请一次提及所有细节,例如您使用真实性并以您的方式实施您的应用程序的事实,我们无法读懂您的想法并知道这一点...... 【参考方案1】:

IMO 这是错误的。

您不应以这种方式致电WL.Client.connect。 Worklight API 应该在 wlCommonInit() 函数内调用,该函数位于 common\main.js 文件中,而不是来自 common\initOptions.js 文件。

查看Developer Center 提供的各种示例应用程序。它们都不是以这种方式实现的......(样本适用于 7.1 而您使用的是 6.2 并不重要,因为概念是相同的)。

所有的 onSuccess 都不应该那样做;

【讨论】:

我已更改代码以实现wlCommonInit()。结果是相同的,并且调用的顺序与它们在原始实现中的顺序相同。 (顺便说一句,我们使用的是 7.0) 我已经用错误对象和堆栈跟踪更新了问题。 创建一个新应用并在 wlCommonInit 中进行连接,它是否连接? 我仍然在 Android 上获得 403。 (它适用于 ios。)我认为它必须与应用程序真实性/自定义测试有关。但是服务器上没有关于它拒绝连接尝试的输出(或者可能记录在 MFP 控制台可用位置以外的其他地方?) 如果真实性失败,您会看到一个带有通用文本的弹出窗口。你有弹出窗口吗?这也将记录在 messages.log 中。

以上是关于混合 Android 应用程序未连接到 MobileFirst 服务器的主要内容,如果未能解决你的问题,请参考以下文章

未连接到服务器时从 Android webview 中的应用程序缓存加载

Flutter 应用程序:IOS 模拟器未连接到 Android Studio

Chromecast 发件人应用程序未连接到 Android Receiver 应用程序,始终连接到 Web 接收器

使用 proguard 后,Android apk 未连接到 Azure 服务器

Crashlytics - 当应用程序在未连接到 android studio 时崩溃时无法获取崩溃报告

IBM Worklight 6.0 - Android 应用程序在 7 月安全更新后未连接到服务器