移动开发的灵便迭代之道 黄凯
一切的开始 1、频繁的版本发布 2、个性化的通知无法随时定制
解决方案: HTML
1.1 JavaScript 呼叫 Android方法 … myWebView = (WebView) findViewById(R.id.myWebView); myWebView.addJavascriptInterface(new ScriptHandler(this), “callclass"); JavaScript … <script type="text/javascript"> function share(message) { javascript:callclass.share(message); } </script>
1.2 JavaScript 呼叫 iOS 方法 iOS: - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { NSURL *url = request.URL; if ([url.scheme isEqualToString:@"hujiang"] && [url.host isEqualToString:@"com.hujiang.class"]) { NSString *path = url.path; if (path isEqualToString:@"showToast") { NSString *message = xxx; //取请求参数 (参数可通过 url.query 获取到) [HJToast showToast:message]; return NO; } return YES; HTML … window.href=hujiang://com.hujiang.class/showToast?text=hujiang
2、 Cordova (JavaScript 呼叫 Android方法) <script src="js/cordova_android.js" type="text/javascript"></script> <script src="js/cordova_plugins.js" type=“text/javascript"></script> … <script type="text/javascript"> varshare = function(){ var cb=function(data){} var cberr=function(err){ } window.echo=cordova.exec(cb, cberr, ‘MVPlugin', 'Share' , [{title:”我是标题”,imageUrl:"http://hujiang.com/hujiang.png",link:"http://hujiang.com",description:"分享数据"}]); </script> Java (MVPlugin.java extends CordovaPlugin) … execute(String action, JSONArray params, CallbackContext callback)…{ if ("Share".equals(action)) { … }
3 JSBridge
3.1 JSBridge 调用 Android Java (HJAppJSEvent.java) … @JavascriptInterface public void navigator_setTitle(String titleJson, String callback) { callJSMethod(callback, jsonString); } Java … JSSDK.getInstance().registerJSEvent(HJAppJSEvent.getInstance(this)); JavaScript … HJAPP.navigator_setTitle(‘hujiang’, ‘callback_method’)
3.2 JSCore 调用 iOS iOS ( HJMJSNavigatorModule.h) … @protocol HJMJSNavigatorModuleExport <JSExport> JSExportAs(navigator_setTitle, - (void)setNavigatorTitle:(NSString *)title callback:(NSString *)callback ); @end iOS (HJMJSNavigatorModule.m) (void)setNavigatorTitle:(NSString *)title callback:(NSString *)callback { … [callback callWithArguments:@[returnValue]]; } JavaScript … HJAPP.navigator_setTitle(‘hujiang’, ‘callback_method’)
遇到的问题 性能 (弱网、无网络) 方案:打包页面、本地加载
遇到的问题 缓存 方案1:修改页面访问路径 方案2:页面访问的资源路径加上版本号
遇到的问题 应用外网页打开应用 方案: Scheme
1、什么是Scheme? 2、Scheme如何实现呼叫原生? hujiang://com.hujiang.class/showToast?text=hujiang 2、Scheme如何实现呼叫原生? iOS … - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { return YES; }… Android … <activity android:name=".activity.SchemeActivity" > <data android:host=“com.hujiang.class” android:scheme="hujiang" /> </activity> HTML … <a href=’ hujiang://com.hujiang.class/showToast’ />…
遇到的问题 用户信息的传递 方案1:Http Header 方案2:cookie
遇到的问题 重定向页面点击后退按钮 方案:document.referrer
Apk的动态加载 不安装也能执行
DL : Apk动态加载框架
不支持Service、BroadcastReceiver 遇到的问题 不支持Service、BroadcastReceiver 方案: Remote Service 挂载到现有的Receiver
(Scripting Layer for Android) 脚本语言的应用 SL4A (Scripting Layer for Android) http://code.google.com/p/android-scripting/ Python For Android https://github.com/kivy/python-for-android
Demo: Python … >>> import android >>> droid = android.Android() >>> result = droid.makeToast(‘Hello, world!’) >>> |
Q&A