Contenu connexe Similaire à Phone gap 12 things you should know (20) Phone gap 12 things you should know1. 12 things you should know
Mark Dong 董龙飞
Adobe Developer Evangelist
weibo.com/donglongfei
weibo.com/javascriptdev
4. Web App
or
Hybrid App
or
Native App
5. Apps are for loyalty, Mobile web is for discovery.
from the report “implementing your mobile strategy” by dotMobi
6. 2. What is PhoneGap?
Adobe 董龙飞 weibo.com/donglongfei weibo.com/javascriptdev
7. Wrap your web app and deploy
Interface to access native features
PhoneGap plugin
Adobe 董龙飞 weibo.com/donglongfei weibo.com/javascriptdev
8. 3. What it is not?
Adobe 董龙飞 weibo.com/donglongfei weibo.com/javascriptdev
10. 4. Where it is from?
Adobe 董龙飞 weibo.com/donglongfei weibo.com/javascriptdev
11. ! 2008: iPhoneDevCamp
! “bridging the gap
between the web and the
iphone SDK”
! PhoneGap : it is like AIR
for the Iphone (2008-9-18,
Nitobi blog)
Adobe 董龙飞 weibo.com/donglongfei weibo.com/javascriptdev
15. 6 . Across platforms
Adobe 董龙飞 weibo.com/donglongfei weibo.com/javascriptdev
19. IDE + SDK + PhoneGap
Adobe 董龙飞 weibo.com/donglongfei weibo.com/javascriptdev
20. public class CirclesActivity
extends DroidGap {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.loadUrl("file:///android_asset/
www/circles.html");
}
}
Native Wrapper with PhoneGap
Adobe 董龙飞 weibo.com/donglongfei weibo.com/javascriptdev
21. PhoneGap Build
Compile in the cloud
Adobe 董龙飞 weibo.com/donglongfei weibo.com/javascriptdev
27. JS Native
Adobe 董龙飞 weibo.com/donglongfei weibo.com/javascriptdev
28. JavaScript/CSS/HTML5 Non Web Tech
Native Web Control
FFI Plugins
Adobe 董龙飞 weibo.com/donglongfei weibo.com/javascriptdev
33. public class callsPGPlugin extends Plugin { Java定制plugin
// List Actions
public static final String ACTION="list";
@Override
public PluginResult execute(String action, JSONArray data, String callbackId) {
PluginResult result=null;
if(ACTION.equals(action)){
CallLogAI callLogAI = new CallLogAI(ctx);
JSONObject callsHistory=callLogAI.fetchCallLogs(null);
Log.d("RESULT=", callsHistory.toString());
result=new PluginResult(Status.OK,callsHistory);
}else{
result=new PluginResult(Status.INVALID_ACTION);
Log.d("CallsPlugin","Invalidate action:" + action);
}
return result;
}
}
Adobe 董龙飞 weibo.com/donglongfei weibo.com/javascriptdev
34. 注册plugin
<?xml version="1.0" encoding="UTF-8"?>
<plugins>
<plugin name="App" value="com.phonegap.App"/>
<plugin name="Geolocation" value="com.phonegap.GeoBroker"/>
<plugin name="Device" value="com.phonegap.Device"/>
……
<plugin name="Temperature" value="com.phonegap.TempListener"/>
<plugin name="FileTransfer" value="com.phonegap.FileTransfer"/>
<plugin name="Capture" value="com.phonegap.Capture"/>
<plugin name="CallsHistoryPlugin"
value="com.mark.phonegap.plugin.callsPGPlugin" />
</plugins>
Adobe 董龙飞 weibo.com/donglongfei weibo.com/javascriptdev
39. window.plugins.callsListing.list(
function(r){printResult(r)},
function(e){console.log(e)}
);
CallsListing.prototype.list=function(success
Callback,failureCallback){
return PhoneGap.exec(successCallback,
failureCallback,
'CallsHistoryPlugin',
'list',['test’]);
};
public class callsPGPlugin extends Plugin {
// List Actions
<plugin name="CallsHistoryPlugin" public static final String ACTION="list";
value="com.mark.phonegap.plugin.callsPGPlu @Override
gin" /> public PluginResult execute(String
action, JSONArray data, String callbackId) {
43. From Native to JS
WebChromClient: 覆盖onJsPrompt
From JS to Native
CallbackServer:XmlHttpRequestsever
44. Javascript
CallsListing.prototype.list=function(successCallback,fai
lureCallback){
return PhoneGap.exec(successCallback,
failureCallback,
'CallsHistoryPlugin',
'list',['test’]);
};
PhoneGap.exec = function(success, fail, service, action, args) {
…
var r = prompt(JSON.stringify(args), "gap:"+JSON.stringify([service,
action, callbackId, true]));
…
Adobe 董龙飞 weibo.com/donglongfei weibo.com/javascriptdev
45. Java
Droidgap.java
public boolean onJsPrompt(WebView view, String url, String message, String
defaultValue, JsPromptResult result) {
……
String r = pluginManager.exec(service, action, callbackId, message, async);
……
}
Pluginmanager.java
public String exec(final String service, final String action, final String callbackId, final
String jsonArgs, final boolean async) {
……
cr = plugin.execute(action, args, callbackId);
ctx.sendJavascript(cr.toErrorCallbackString(callbackId));
……
}
46. Pluginmanager.java Java
ctx.sendJavascript(cr.toErrorCallbackString(callbackId));
CallbackServer.java : XHR server
PhoneGap.Channel.join(function() {
// Start listening for XHR callbacks
setTimeout(function() { Javascript
if (PhoneGap.UsePolling) {
PhoneGap.JSCallbackPolling();
}
…
48. 实例化UIWebView
webView =[[UIWebView alloc] initWithFrame:webViewBounds];
JS到Native的通讯
document.location = “gap://Class.method/args”
Native到JS的通讯
UIWebView.stringByEvaluatingJavaScriptFromString
Adobe 董龙飞 weibo.com/donglongfei weibo.com/javascriptdev
50. weinre:
a Remote Debugger
for web pages or
PhoneGap app on
mobile devices.
Adobe 董龙飞 weibo.com/donglongfei weibo.com/javascriptdev