2012-03-03 63 views
2

为了加速开发,我们的团队已经习惯于直接在Chrome中测试大部分phonegap实现(因为它几乎全部是Javascript)。但是我们想要在Phonegap提供的ondeviceready回调中运行某些代码(或者只在浏览器中的document.ready中运行)。如果我们想在两种情况下调用不同的代码,我们如何区分这两种情况?如何区分PhoneGap应用程序和本机浏览器?

回答

1

我们遵循相同的方法,并有同样的问题。以下是我们如何解决Android的问题(应使用WebKit浏览器,例如iOS)。

的理念是:

  • 创建一个Java类,它说的PhoneGap是积极的。
  • 将其添加到浏览器中的全局对象列表中。
  • 编写封装了支票的JavaScript包装器。

现在有些代码。

Java类:

public class MyPhoneGap { 

    public boolean isActive() { 
     return true; 
    } 
} 

注册这个类的一个实例与浏览器:

public class MyActivity extends DroidGap { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     super.setIntegerProperty("splashscreen", R.drawable.splash); 
     super.loadUrl("file:///android_asset/www/index.html"); 
     this.appView.getSettings().setJavaScriptEnabled(true); 
     this.appView.addJavascriptInterface(new MyPhoneGap(), "MyPhoneGap"); 
    } 
} 

JavaScript包装:

My.PhoneGap = { 
    active : null, 
    isActive : function() { 
     if (!My.Util.Type.isBoolean(My.PhoneGap.active)) { 
      if (My.Util.Type.exists(window.MyPhoneGap)) { 
       if (window.MyPhoneGap.isActive()) { 
        My.PhoneGap.active = true; 
       } else { 
        My.PhoneGap.active = false; 
       } 
      } else { 
       My.PhoneGap.active = false; 
      } 
     } 
     return My.PhoneGap.active; 
    } 
}; 

用法:

if (My.PhoneGap.isActive()) { 
    // Rely on PhoneGap APIs 
} else { 
    // Use some mock/default/dummy impl 
} 

最后一件事:在Chrome中开发/测试非常方便,但请在真实设备上测试。性能/ API可靠性的差异是巨大的不同。

+0

。出于好奇,不确定的,是否有你用来代替PhoneGap的插件addJavascriptInterface任何理由? – 2012-03-03 20:14:20

+0

@WaynnLue PhoneGap插件是异步的,这使事情变得更加复杂。 – lexicore 2012-03-04 09:43:50

1

您可以检查是否装置在JavaScript

/* are we running on device or in a browser? */                        
this.isDevice = (typeof(device) != 'undefined'); 

/* if the device is not defined we assume we in a browser */ 
if(!this.isDevice) { 
    ... browser code here ... 
} 
相关问题