Native
App£¨ÒÔϼò³ÆNative£©ºÍMobile Web£¨ÒÔϼò³ÆWeb£©¶þÕß»ìºÏ¿ª·¢µÄ²úÎï±»³ÆÎªHybrid
App£¨ÒÔϼò³ÆHybrid£©¡£Hybrid²¢²»ÊÇʲôиÅÄ×îÔç¿ÉÒÔ×·Ëݵ½Symbianʱ´ú£¬Ö±µ½iOSºÍAndroid³öÏÖÖ®ºó²Å³ä·ÖÕ¹ÏÖ³ö¼ÛÖµ¡£
Hybrid¼òÊ·
1. ±³¾°
Hybrid¼ÈÀûÓÃÁËNative App·á¸»µÄÉ豸API£¨Device
API£©£¬ÓÖÄÜÓµÓÐMobile WebµÄ¿çƽ̨¡¢¸ßЧ¿ª·¢¡¢¿ìËÙ·¢²¼µÄÄÜÁ¦£¬¶ÔÓÚÏ൱ÅÓ´óµÄÓ¦Óó¡¾°¶øÑÔ¶¼ÊÇÊÊÓõġ£
HybridÓÅÊÆÔÚÓÚ£º
¿çƽ̨
WebÄÚÈÝ¿ÉÒÔ×öµ½¿ª·¢Ò»´Î£¬ËùÓÐÆ½Ì¨ÉúЧ£¬Öî¶à²úÆ·ÐèÒªÕâÖÖÄÜÁ¦¡£
¿ìËÙ·¢²¼
iOSƽ̨£¬Apple Storeƽ¾ùÉóºËÖÜÆÚ1¡«2Öܲ»µÈ£¬ÉõÖÁ¸ü³¤£¬²úÆ·µÄ·¢²¼ÖÜÆÚ´Ó2Öܵ½1Ô£¬Õâ¶ÔÐèÒª¿ìËÙ·¢²¼µÄ²úÆ·¶øÑÔÄÑÒÔ½ÓÊÜ¡£
Androidƽ̨£¬Ó¦ÓÃÉ̵êÖڶ࣬·¢²¼¹ý³Ì·³Ëö¡£ËäÈ»¿ÉÒÔÓ¦ÓÃÄÚÉý¼¶£¬µ«ÊÇ´øÀ´µÄÎÊÌâÊÇÐÂAppÐèҪͨ¹ýÓ¦ÓÃÉ̵꣬´ËÍâAPKÌå»ýÅÓ´ó£¬2G/3G»·¾³ÏÂÌåÑé²î¡£
¸ßЧ¿ª·¢
Web¿ª·¢¾¹ý20ÄêµÄ·¢Õ¹£¬ÒѾ½«½á¹¹£¨HTML£©¡¢±íÏÖ£¨CSS£©¡¢ÐÐΪ£¨JavaScript£©3²¿·ÖºÜºÃµØ·ÖÀ뿪£¬ÔÚ·Ö¹¤Ð×÷¡¢¿ª·¢Ð§ÂÊÉÏ»á¾ßÃ÷ÏÔÓÅÊÆ¡£
·á¸»µÄDevice API
Web£¨HTML5£©Ç¿µ÷ͨÓÃÐÔ£¬ÊÜÏÞÓÚ±ê×¼ºÍä¯ÀÀÆ÷ʵÏÖ£¬Ðí¶àÓÐÓõÄϵͳ¹¦ÄÜδÄܵõ½Ö§³Ö£¨»ò²¿·ÖÖ§³Ö£©¡£¶øNative×î´óµÄÓÅÊÆÔÚÓÚÉ豸APIµÄµ÷ÓÃÄÜÁ¦£¬Ö»ÒªÇŽÓNativeºÍWeb£¬WebÒ²¾ÍÄܹ»ÓµÓÐÕâÖÖÄÜÁ¦¡£
HybridÁÓÊÆ±íÏÖΪ£º
CPU/GPUÃܼ¯ÀàÓ¦ÓÃĿǰ¿´¸üÊʺÏNative£¬ÀýÈ缫Ʒ·É³µÕâÑùµÄÓÎÏ·¡£ÕâÖÖÁÓÊÆÊÇÔÚ²»¶ÏÈõ»¯µÄ£¬ÕýÈç
¡°CSS Transform 3D¡±ÒýÈëGPU´ó´ó»º½âÁËWeb¶¯»²»Á÷³©µÄÎÊÌâ¡£
¾²Ì¬×ÊÔ´´Ó·þÎñÆ÷¶Ë¼ÓÔØµ¼ÖµÄUIչʾÑÓ³ÙÎÊÌâ¡£Õâ¸öÎÊÌâ¿ÉÒÔͨ¹ýNativeÀ¹½ØWebViewͨÐżÓÔØÒÑ´ò°üµÄ¹«¹²¿âÀ´»º½â¡£
2. ¼òÊ·
³ûÐÎ
³ûÐν׶δóÖÂΪ£º
Symbian V3/5ʱ´úÒѾÓÐHybrid³ûÐΡ£
iOS×î³õµÄApp¶¼ÊÇÓÉObjective-C±àд¶ø³ÉµÄ£¬ÊÜÏÞÓ¦ÓÃÉ̵êµÄ·¢²¼ÖÜÆÚ£¬ÄÚÈݾ³£±ä»¯µÄ²¿·Ö¿ªÊ¼Í¨¹ýʹÓÃÄÚÖÃä¯ÀÀÆ÷¿Ø¼þ£¨WebView£©¼ÓÔØ·þÎñ¶ËÒ³ÃæÀ´ÊµÏÖ¡£
Android³öÏÖ²¢Á÷ÐÐÖ®ºó£¬¿ÉÒÔ½«¸ü¶àµÄApp¹¦ÄÜͨ¹ýHybridÀ´ÊµÏÖ£¬ÕâÑùÔÚ²»Í¬Æ½Ì¨ÉϾͿÉÒÔֻά»¤Ò»¸ö°æ±¾¡£
·¢Õ¹
¡°¿çƽ̨¡±³ÉÁËHybrid×î´óµÄÂôµã£¬ÒÔPhoneGap[1]ΪÊ×µÄHybrid¿ò¼ÜÂ½Ðø³öÏÖ£¬´øÀ´ÁËÖî¶à¸Ä±ä¡£
·ÃÎÊÉ豸¹¦ÄÜ¡£
Web£¨HTML5£©²»Ö§³ÖµÄ¹¦ÄÜ¿ÉÒÔÈÃNativeʵÏÖ£¬ÔÙͨ¹ýNativeºÍWebÖ®¼äͨÐÅ£¬Í¨¹ýÕâÖÖ·½Ê½¿ÉÒÔÈÃWeb»ñµÃºÍNativeÏàͬµÄÉ豸APIµ÷ÓÃÄÜÁ¦£¬ÕâÊÇPhoneGapÕâÀàHybrid¿ò¼ÜµÄ»ù±¾¹¤×÷ÔÀí¡£
Óë´Ëͬʱ£¬½«Web´úÂëתΪNativeµÄHybrid¿ò¼Ü£¨ÈçTianium[2]£©Ò²³öÏÖÁË¡£
PhoneGap×ÓÏîÄ¿weinreÊÇÒ»ÖÖÔ¶³Ìµ÷ÊÔ¹¤¾ß£¬¼«´óµØ»º½âÁËHybridÄÑÓÚµ÷ÊÔµÄÎÊÌ⣬½øÒ»²½´Ù½øÁËHybridµÄ·¢Õ¹¡£
Hybrid¿ò¼ÜÌṩÁËÓ¦Óôò°ü¹¦ÄÜ£¬¿ª·¢Õß¿ÉÒÔÍêȫʹÓÃHTML¡¢CSS¡¢JavaScript¿ª·¢Native
App¡£
³ÉÊì
Ëæ×ÅPhoneGapÕâÀàHybrid¿ò¼ÜÔÚÈ«ÇòµÄÁ÷ÐУ¬Ò»Ð©ÎÊÌⱩ¶Á˳öÀ´£¬Ò²ÕýÊÇÕâЩÎÊÌâµÄ½â¾ö£¬ÈÃHybrid×ßÏò³ÉÊì¡£
¿ª·¢ÌåÑéÌáÉý¡£
weinreÕâÀàµ÷ÊÔ¹¤¾ßÈÔÊôÓÚ²å¼þÐÔÖÊ£¬ÖîÈç¡°ÍøÂ硱¡¢¡°±¾µØ×ÊÔ´¡±µÈ¸ß¼¶µ÷ÊÔ¹¦ÄÜÎÞ·¨Ö§³Ö£¬WebViewµÄÔÉúµ÷ÊÔÐèÇóÔ½À´Ô½Ç¿ÁÒ¡£
iOS 6.0+ÒѾ֧³ÖÔÉúµÄÔ¶³Ìµ÷ÊÔ[3]¡£
Chrome for AndroidÔÚÔÉúÔ¶³Ìµ÷ÊÔÉÏ´¦ÓÚÁìÏȵØÎ»[4]¡£
´ÓAndroid 4.4¿ªÊ¼£¬WebViewÒ²Ö§³ÖÔÉúµÄÔ¶³Ìµ÷ÊÔ[5]¡£
ÌáÉýWebViewÐÔÄܵĺôÉùÈÕÒæÔöÇ¿¡£
ijЩ׷Çó¼«ÖÂÐÔÄܵŦÄÜתÓÉNativeʵÏÖ£¬Èçת³¡£¨Ò³Ãæ¼äÇл»£©¶¯»¡£
¾²Ì¬×ÊÔ´±¾µØ»¯ÊÇÀíÏë״̬£¬ÆäËû³¡¾°ÏÂNativeÀ¹½ØWebViewµÄÇëÇ󣬲¢Èù«¹²×ÊÔ´ÖØ¶¨Ïòµ½AppÄÚÖÃ×ÊÔ´£¬Í¬ÑùÄÜʵÏÖΪWebÌáËÙ¡£
3. ÏÖ×´
ÒÔÉϱãÊÇHybridµÄ·¢Õ¹¸ÅÊö£¬´Ó¹úÄÚ×îеÄ×ÊÁÏ¿ÉÒÔ¿´³ö£¬HybridµÄÇ÷ÊÆÒ²ÊǷdz£Ã÷ÏԵġ£´Óͼ8-1¿ÉÒÔ¿´µ½Ô½À´Ô½¶àµÄ¿ª·¢Õß¾ö¶¨Ê¹ÓÃHybrid£¨¿çƽ̨¼¼Êõ£©£¬×î½üÁ½ÄêµÄ×ÜÁ¿ÒѾÓÐ54%£»¶ø½Ó½ü60%µÄ¿ª·¢ÕßÔÚHybridµÄ¼¼Êõ·½°¸ÉÏÑ¡ÔñÁËPhoneGap¡£

ͼ8-1 HybridÔÚ¹úÄڵķ¢Õ¹Çé¿ö[6]
ÔÚÊܷõÄ2309¸öMobile¿ª·¢ÕßÖУ¬µ½2013Äê8ÔÂΪֹÍêȫʹÓÃNative¿ª·¢µÄÖ»ÓÐ8%£¬¶øÊ£ÓàµÄ92%¶¼¿ÉÒÔ±»ÈÏΪʹÓõÄÊÇHybrid£¬Èçͼ8-2Ëùʾ¡£

ͼ8-2 HybridʹÓÃÇé¿ö
AppµÄ¿çÆ½Ì¨ÌØÐÔ³ÉΪһ¸öÖØÒªµÄ¿¼ÂÇ£¬Èçͼ8-3Ëùʾ¡£

ͼ8-3 ¿çÆ½Ì¨ÌØÐÔÊܹØ×¢
ͼ8-4ÏÔʾÁËHybrid¾ªÈ˵ÄÔö³¤ËÙ¶È£º2013ÄêÎÞÂÛÊÇ¿ª·¢ÖС¢ÒÑ·¢²¼µÄHybrid£¨»òHTML
App£©¾ùÏà±ÈÓÚ2012Äê³öÏÖÁ˳¬¹ý125%¡«400%µÄÔö³¤ÂÊ[8]¡£

ͼ8-4 HybridÔö³¤Ñ¸ÃÍ[9]
Hybrid¼¼Êõ
ÎÞÂÛAndroid»¹ÊÇiOS£¬ÊµÏÖÒ»¸ö×î¼òµ¥µÄHybrid AppÖ»ÐèÒª¼¸ÐдúÂ룺ʵÀý»¯WebView¡¢¼ÓÔØÒ³Ãæ£¬Ö®ºó±ãÊÇÒ³Ãæ×ÔÉíµÄ´úÂë¡£ÒªÏëʵÏÖ¸üΪ¸´Ôӵġ¢ÍêÕûµÄHybrid»¹ÐèÒª²»ÉÙ֪ʶ¡£
1.Mobile Web¿ª·¢»ù´¡£ºHTML¡¢CSS¡¢JavaScript¡£
2.Native App¿ª·¢»ù´¡£ºAndroid¡¢iOS¡£
3.NativeÓëWebË«ÏòͨÐÅ»úÖÆ¡£
Mobile Web¿ª·¢»ù´¡¿ÉÒԲο¼±¾ÊéµÚ2Õ£¬Native App¿ª·¢»ù´¡ÒѾ³¬³ö±¾ÊéµÄÌÖÂÛ·¶Î§£¬Í¬ÑùÓкܶà¿ÉÑ¡ÔñµÄÊé¼®£¬±¾½ÚÀ´½²Ê£ÓàµÄµÚ3¸öÎÊÌâ
¡°NativeÓëWebË«ÏòͨÐÅ»úÖÆ¡±¡£
1. Nativeµ÷ÓÃWeb
ÎÞÂÛAndroid»¹ÊÇiOS £¬Nativeµ÷ÓÃWeb£¨JavaScript£© ¶¼ÓкܺõÄÔÉúÖ§³Ö£¬Èç´úÂë8-1ºÍ´úÂë8-2Ëùʾ¡£AndroidÖеĵ÷Ó÷½Ê½ÈçÏ£¬ÆäÖÐwebViewÊÇWebviewµÄʵÀý¡£
´úÂë8-1 Androidµ÷ÓÃJavaScript
webView.loadUrl£¨"javascript:£¨function£¨£©{ alert£¨¡®ok¡¯£©; }£©£¨£©¡±£©; |
iOSÖеĵ÷Ó÷½Ê½ÈçÏ£¬ÆäÖÐwebViewÊÇUIWebviewµÄʵÀý¡£
´úÂë8-2 iOSµ÷ÓÃJavaScript
[webView stringByEvaluatingJavaScriptFromString: @"alert£¨'ok'£©" ]; |
2. Webµ÷ÓÃNative
¡°Nativeµ÷ÓÃWeb¡±±¾ÖÊÉÏÊÇJavaScript½Å±¾µÄ¶¯Ì¬Ö´ÐУ¬ÔÚ¡°Webµ÷ÓÃNative¡±µÄ³¡¾°ÏÂÓÉÓÚĿǰNativeÓïÑÔ£¨JavaºÍObjective-C£©²»ÈÝÒ×ÏñJavaScriptÄÇÑù±ãÓÚ¶¯Ì¬Ö´ÐУ¬ËùÒÔÐèÒªÁí±Ùõè¾¶¡£
2.1 Android
AndroidÉϳ£¼ûµÄ·½Ê½ÓÐ3ÖÖ¡£
ÖØÐ´WebViewClient.shouldOverrideUrlLoading£¨Èç´úÂë8-3Ëùʾ£©¡£
´úÂë8-3 ÖØÐ´WebViewClient.shouldOverrideUrlLoading
webView.setWebViewClient£¨new WebViewClient£¨£©{ @Override public boolean shouldOverrideUrlLoading £¨WebView view, String url£©{ // TODO½âÎöURL²¢´¥·¢Native´úÂë return true; } }£©; |
µ±Ò³ÃæÄÚµÄURL·¢Éú±ä»¯Ê±£¬Èçµã»÷Á´½Ó¡¢Ö´ÐÐJavaScript£¨Èçlocation.href=¡±http://¡±£©µÈ¾ù»á´¥·¢WebViewClient.shouldOverrideUrlLoading£¬Í¨¹ý½«Webµ÷ÓÃNativeµÄÊý¾Ý·â×°ÔÚURL£¬ÔÙÓÉNative½âÎöÊý¾Ý²¢Ö´ÐÐÏìÓ¦Native·½·¨¡£
ÖØÐ´WebChromeClient.onJsPrompt£¬»òonJsConfirm£¬»òonJsAlert£¬ÒÔWebChromeClient.onJsPromptΪÀý£¬Èç´úÂë8-4Ëùʾ¡£
´úÂë8-4 ÖØÐ´WebChromeClient.onJsPrompt
webView.setWebChromeClient£¨new WebChromeClient£¨£© { public boolean onJsPrompt£¨WebView view, String url, String message, String defaultValue, JsPromptResult result£© { // TODO½âÎömessage²¢´¥·¢Native´úÂë result.confirm£¨""£©; return true; } }£©; |
µ±Ö´ÐС°window.prompt£¨¡°{}¡±£©¡±ÕâÑùµÄJavaScript´úÂëʱ£¬½«»á´¥·¢WebChromeClient.onJsPrompt¡£
WebView.addJavascriptInterface£¬ÕâÖÖ·½Ê½ºÍǰÁ½ÖÖ¶¼²»Í¬£¬Í¨¹ý½«Java
Object£¨A£© Ó³ÉäΪJavaScript Object£¨B£©£¬´Ó¶øµ÷ÓÃB.func1ʱ½«»á×Ô¶¯´¥·¢A.func1£¬Í¨¹ýÕâÖÖÔÉúµÄ·½Ê½ÊµÏÖÁË
¡°Webµ÷ÓÃNative¡±£¬Èç´úÂë8-5Ëùʾ¡£
´úÂë8-5 WebView.addJavascriptInterface
webView.addJavascriptInterface£¨new Object£¨£© { public void func1£¨£© { }
public void func2£¨£© { } }, "webViewObj"£©;
|
ÒÔÉÏ3ÖÖ·½Ê½£¬×î³£ÓõÄÊÇ·½Ê½2£»·½Ê½2Ïà±È·½Ê½1ÓÐÄÚÖõĶÓÁÐÖ§³Ö£¬²»»á³öÏ֏߯µ·ÃÎÊÊý¾Ý¶ªÊ§µÄÇé¿ö£»·½Ê½3ÊÇAndroidÔÉú·½Ê½£¬µ«ÊDz»ÈçǰÁ½ÖÖ·½Ê½Áé»î¡£
2.2 iOS
iOSÖпÉÓõķ½Ê½ÀàËÆAndroidÖеÄWebViewClient.shouldOverrideUrlLoading£¬
ͨ¹ý¼à¿ØWebViewµÄURL±ä»¯ÊµÏÖWebµ÷ÓÃNative£¬Èç´úÂë8-6Ëùʾ¡£
´úÂë8-6 shouldStartLoadWithRequest
- £¨BOOL£©webView:£¨UIWebView *£© webView shouldStartLoadWithRequest: £¨NSURLRequest *£©request navigationType: £¨UIWebViewNavigationType£©navigationType {
}
|
3. Bridge
ÓÐÁËǰÁ½½ÚµÄ֪ʶ£¬¿ÉÒÔʵÏÖÒ»¸öͨÓÃÄ£¿é£¨Bridge£©À´Î¬»¤²»Í¬Æ½Ì¨Éϵġ°WebÓëNativeË«ÏòͨÐÅ»úÖÆ¡±¹¦ÄÜ¡£Èçͼ8-5ËùʾΪWebµ÷ÓÃNativeµÄBridgeʱÐòͼ¡£

ͼ8-5 Webµ÷ÓÃNativeµÄBridgeʱÐòͼ
Webµ÷ÓÃNativeµÄʵÏÖÔÀíÈçÏ£º
Web¶Ëµ÷ÓÃBridge.callByJS£¨{name:¡¯func1¡¯,
callback: function£¨£©{}, param:{}}£©£¬ÓÉBridge¸ù¾ÝÌØ¶¨¡°Webµ÷ÓÃNative¡±·½Ê½Í¨ÖªNativeÖ´ÐÐÏàÓ¦·½·¨£¨Í¼8-5Öеġ°func1¡±£©¡£
NativeÖ´ÐÐÍê±Ïºóͨ¹ý¡°Nativeµ÷ÓÃWeb¡±µÄ·½Ê½µ÷ÓÃBridge.
callByNative£¨{token: ¡®t1234¡¯ }£©¡£Èçͼ8-6ËùʾΪNativeµ÷ÓÃWebʱµÄBridgeʱÐòͼ¡£
ÆäÖÐJavaScript»Øµ÷º¯Êý»áÓ³ÉäΪ×Ö·û´®Ð͵Ätoken£¬Í¨¹ýÕâ¸ö·½Ê½À´±£Ö¤×îÖÕ´¥·¢JavaScriptµÄ»Øµ÷º¯Êý£¨°üÀ¨ÄäÃûº¯ÊýºÍͨ¹ý±Õ°üʵÏÖµÄ˽Óк¯Êý£©¡£

ͼ8-6 Nativeµ÷ÓÃWebʱµÄBridgeʱÐòͼ
¿ÉÒÔ¿´µ½£¬BridgeʵÏÖ¡°Nativeµ÷ÓÃWeb¡±ÊÇÀàËÆµÄ£º
Native¶Ëµ÷ÓÃBridge.callByNative£¨{token:¡¯t1234¡¯,
script: ¡®//todo¡¯}£©£¬ÓÉBridge¸ù¾ÝÌØ¶¨¡°Nativeµ÷ÓÃWeb¡±·½Ê½Í¨ÖªWebÖ´ÐÐÏàÓ¦½Å±¾¡£
WebÖ´ÐÐÍê±Ïºóͨ¹ý¡°Webµ÷ÓÃNative¡±µÄ·½Ê½µ÷ÓÃBridge.
callByJS£¨{token: ¡®t1234¡¯ }£©¡£
Èç¹ûBridge.callByNativeµÄscriptÖÐÖ´ÐÐÁËÒì²½²Ù×÷£¬ÐèÒªÔÚscriptÖ÷¶¯µ÷ÓÃBridge.callByJS£¬²¢ÇÒ²»ÐèÒª´«token²ÎÊý¡£
±ÊÕßÒѾÔÚAndroidÉÏʵÏÖÁËÍêÕûµÄBridge[10]£¬BridgeÓÉJavaScriptʵÏÖ¿ÉÒÔÔËÐÐÔÚAndroidºÍiOSµÄWebViewÖУ¬Í¬Ê±Ò²·Ç³£ÈÝÒ×À©Õ¹µ½Windows
PhoneµÈÐÂÆ½Ì¨£¬Èç´úÂë8-7Ëùʾ£º
Bridge´úÂëÔÚ²úÆ·»·¾³ÏÂʹÓÃʱÇëÉèÖÃDEBUG = false¡£
±ÜÃâÔÚiOSÏ¿ìËٱ仯URLʱÔì³ÉµÄÊý¾Ý¶ªÊ§£¬¿ÉÒÔ¿¼ÂÇʹÓöÓÁлúÖÆ»º´æÃüÁî¡£
À©Õ¹ÖÁWindows PhoneµÈƽ̨ʱJavaScript²¿·ÖÖ»ÐèÒªÀ©Õ¹invoke£¬Native´úÂë¿ÉÒԲο¼AndroidµÄʵÏÖ¡£
ĿǰBridgeµ¥´ÎͨÐźó»áɾ³ý»Øµ÷º¯Êý£¬Èç¹ûÐèÒª¶à´Îµ÷Óûº´æµÄ»Øµ÷º¯Êý£¨ÈçÁ¬Ðø¼à¿Ø´«¸ÐÆ÷Êý¾Ý£©£¬¿ÉÒÔÀ©Õ¹Bridge.callByNative¡£
´úÂë8-7 bridge.js
£¨function£¨window£© {
var DEBUG = true;
var callbacks = {};
var guid = 0;
var ua = navigator.userAgent;
// TODO¾«È·ÐÔ´ý¸Ä½ø
var ANDROID = /android/i.test£¨ua£©;
var IOS = /iphone|ipad/i.test£¨ua£©;
var WP = /windows phone/i.test£¨ua£©;
//ANDROID = 0; IOS = 1;
/**
* ·½±ãÔÚ¸÷¸öƽ̨Öп´µ½ÍêÕûµÄlog
*/
function log£¨£© {
if £¨DEBUG£© {
console.log.call£¨console, Array.prototype.join.call£¨arguments, ' '£©£©;
}
}
/**
* ƽ̨Ïà¹ØµÄWebÓëNativeµ¥ÏòͨÐÅ·½·¨
*/
function invoke£¨cmd£© {
log£¨'invoke', cmd£©;
if £¨ANDROID£© {
prompt£¨cmd£©;
}
else if £¨IOS£© {
location.href = 'bridge://' + cmd;
}
else if £¨WP£© {
// TODO ...
}
}
var Bridge = {
callByJS: function£¨opt£© {
log£¨'callByJS', JSON.stringify£¨opt£©£©;
var input = {};
input.name = opt.name;
input.token = ++guid;
input.param = opt.param || {};
callbacks[input.token] = opt.callback;
invoke£¨JSON.stringify£¨input£©£©;
},
callByNative: function£¨opt£© {
log£¨'callByNative', JSON.stringify£¨opt£©£©;
var callback = callbacks[opt.token];
var ret = opt.ret || {};
var script = opt.script || '';
// NativeÖ÷¶¯µ÷ÓÃWeb
if £¨script£© {
log£¨'callByNative script', script£©;
try {
invoke£¨JSON.stringify£¨{
token: opt.token,
ret: eval£¨script£©
}£©£©;
} catch £¨e£© {
console.error£¨e£©;
}
}
// WebÖ÷¶¯µ÷ÓÃNative£¬Native±»¶¯ÏìÓ¦
else if £¨callback£© {
callback£¨ret£©;
try {
delete callback;
log£¨callbacks£©;
} catch £¨e£© {
console.error£¨e£©;
}
}
}
};
window.Bridge = Bridge;
window.__log = log;
}£©£¨window£©; |
Hybrid¿ò¼Ü
Ŀǰһ¸öHybrid¿ò¼Üͨ³£ÌṩÒÔϹ¦ÄÜ¡£
Device API£º·â×°NativeµÄ¹¦ÄÜ£¬¿çƽ̨ÌṩһÖµÄDevice
API¡£
App´ò°ü£º½«HTML5±àдµÄ´úÂë´ò°üΪApp£¨Titanium»áת»»´úÂ룩¡£
PhoneGap¼¸ºõ³ÉÁËHybridµÄ´úÃû´Ê£¬TitaniumºÍPhoneGapµÄÉè¼ÆÀíÄî²îÒì½Ï´ó£¬Í¼8-7ÐÎÏóµØÕ¹Ê¾ÁËPhoneGapºÍTitaniumµÄ×é³É²¿·Ö¡£

ͼ8-7 Hybrid¿ò¼Ü[11]
1. PhoneGap
1.1 PhoneGapºÍCordova
PhoneGap¿ª·¢ÉÌNotibi 2010Ä꽫PhoneGap´úÂë¹±Ï׸øApacheÈí¼þ»ù½ð£¨ASF£©£¬PhoneGapºËÐÄÒýÇæ³ÉΪеĿªÔ´ÏîÄ¿Cordova£¬Í¬Ê±PhoneGap³ÉÁËCordovaµÄÒ»¸ö·¢Ðа汾[12]¡£2011Äê10Ô£¬Notibi±»AdobeÊÕ¹º[13]£¬µ«Ã»ÓÐÓ°Ïìµ½PhoneGapºÍCordovaµÄ¿ªÔ´ÐÔÖÊ¡£
1.2 ÔÀí
written once£¬run everywhere
ÈçÒýÎÄËùÊö¡°Ò»´¦±àд£¬¶à´¦ÔËÐС±£¬PhoneGapÖ÷ÒªµÄ¹¦ÄÜΪ£º
ÌṩHybrid API£¬¿ÉÓÉJavaScriptÖ±½Óµ÷ÓÃÖîÈç¼ÓËÙ¶È¡¢ÉãÏñÍ·¡¢Ö¸ÄÏÕë¡¢GPS¡¢ÁªÏµÈ˵Èϵͳ¼¶API£¬ÍêÕûµÄAPIÁбíÇë·ÃÎÊPhoneGap
API Reference¡£
ʹÓÃWeb£¨HTML¡¢CSS¡¢JavaScript£©¿ª·¢µÄÄÚÈݾ¹ýPhoneGap±àÒë´ò°üΪ¸÷¸öƽ̨µÄNative
App£¬Èçͼ8-8Ëùʾ¡£

ͼ8-8 PhoneGap±àÒë´ò°ü¹¦ÄÜ
1.3 ¾µä°¸Àý
À´×ÔPhoneGap Showcase[14]ºÍÆäËûÊý¾ÝÔ´µÄ×ÊÁÏÏÔʾ£º
Facebook Mobile SDK[15]ºÍSalesForce Mobile
SDK[16]¾ùÊÇ»ùÓÚCordovaµÄ·ÖÖ§¿ª·¢µÄ¡£
Facebook¿Í»§¶ËÖÐWeb´úÂ볬¹ý90%[17]¡£
LinkedIn iPad¿Í»§¶ËÖÐWeb´úÂëÉõÖÁ³¬¹ý95%¡£
Wikipedia¸üÊÇÖ±½ÓÓÃPhoneGap¿ª·¢ÁË×Ô¼ºµÄiOS/Android
Hybrid App[18]£¬²¢½«´úÂëÔÚGitHubÉÏ¿ªÔ´ [19]¡£
2. Titanium
TitaniumÉè¼ÆË¼Â·ºÍPhoneGapÓкܴó²»Í¬£¬TitaniumÄ¿µÄÎªÒÆ¶¯¿ª·¢ÌṩһÖÖ¿çÆ½Ì¨µÄJavaScriptÔËÐÐʱ»·¾³ºÍAPI¡£
2.1 Éè¼ÆË¼Â·
TitaniumÉè¼ÆµÄºËÐÄ˼·ÈçÏ¡£
ÓÐÒ»Ì׺ËÐĵÄÒÆ¶¯¿ª·¢API£¬ËüÃÇ¿ÉÒÔ¿çÆ½Ì¨½øÐй淶£¬ÕâЩ·½ÃæµÄÖØµãÓ¦·ÅÔÚ´úÂëÖØÓÃÉÏ¡£
ÓÐÕë¶ÔÌØ¶¨Æ½Ì¨µÄAPI¡¢Óû§½çÃæÔ¼¶¨ÒÔ¼°¹¦ÄÜÌØÐÔ£¬¿ª·¢ÕßÔÚÕë¶Ô¸ÃÌØ¶¨Æ½Ì¨´ÓÊ¿ª·¢Ê±²ÉÓã¬Ó¦¸ÃÓÐÕë¶ÔÌØ¶¨Æ½Ì¨µÄ´úÂ룬ÒÔ±ãÕâЩÓÃÀýÌṩ×î¼ÑµÄÓû§ÌåÑé¡£
Titanium´ÓÉè¼ÆÀíÄîÉϲ»×·Çó¡°written once, run
everywhere¡±£¬ÕâÊÇËüµÄȱµã£¬µ«Í¬Ê±Ëü×·Çóƽ̨²îÒìµÄ¸ü¼ÑµÄÓû§ÌåÑ飬Òò¶øÒ²Êܵ½Ò»²¿·ÖÓû§µÄ×·Åõ¡£TitaniumµÄÁíÒ»¸öȱÏÝÊDzå¼þÄÑÓÚÀ©Õ¹£¬ÒªÏëÖ§³ÖÐÂÆ½Ì¨Ôò¸ü¼ÓÀ§ÄÑ¡£
2.2 ¹¤×÷Á÷³Ì
¹¤×÷Á÷³ÌÈçÏ¡£Titanium¹¤×÷Á÷Èçͼ8-9Ëùʾ¡£
ʹÓÃTitanium SDKÔÚ×Ô´øµÄIDE£¨ALLOY£©Öпª·¢¡£
ʹÓù¤¾ß±àÒëΪƽ̨Ïà¹ØµÄApp¡£

ͼ8-9 Titanium¹¤×÷Á÷
|