Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
¿çÖÕ¶ËWebÖ®Hybrid App
 
×÷ÕߣºÐì¿­ À´Ô´£ºInfoQQ ·¢²¼ÓÚ£º 2015-6-9
  2544  次浏览      27
 

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¹¤×÷Á÷

   
2544 ´Îä¯ÀÀ       27
 
Ïà¹ØÎÄÕÂ

ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖÓë̽ÌÖ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
 
Ïà¹ØÎĵµ

Android_UI¹Ù·½Éè¼Æ½Ì³Ì
ÊÖ»ú¿ª·¢Æ½Ì¨½éÉÜ
androidÅÄÕÕ¼°ÉÏ´«¹¦ÄÜ
Android½²ÒåÖÇÄÜÊÖ»ú¿ª·¢
Ïà¹Ø¿Î³Ì

Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
Androidϵͳ¿ª·¢
AndroidÓ¦Óÿª·¢
ÊÖ»úÈí¼þ²âÊÔ
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

androidÈË»ú½çÃæÖ¸ÄÏ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
AndroidÊÖ»ú¿ª·¢£¨¶þ£©
AndroidÊÖ»ú¿ª·¢£¨Èý£©
AndroidÊÖ»ú¿ª·¢£¨ËÄ£©
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖ̽ÌÖ
ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
ÊÖ»úÈí¼þ×Ô¶¯»¯²âÊÔÑо¿±¨¸æ

Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
AndroidÓ¦Óÿª·¢
Androidϵͳ¿ª·¢
ÊÖ»úÈí¼þ²âÊÔ
ǶÈëʽÈí¼þ²âÊÔ
AndroidÈí¡¢Ó²¡¢ÔÆÕûºÏ

ÁìÏÈIT¹«Ë¾ android¿ª·¢Æ½Ì¨×î¼Ñʵ¼ù
±±¾© Android¿ª·¢¼¼Êõ½ø½×
ijÐÂÄÜÔ´ÁìÓòÆóÒµ Android¿ª·¢¼¼Êõ
ijº½Ì칫˾ Android¡¢IOSÓ¦ÓÃÈí¼þ¿ª·¢
°¢¶û¿¨ÌØ LinuxÄÚºËÇý¶¯
°¬Ä¬Éú ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ
Î÷ÃÅ×Ó Ç¶Èëʽ¼Ü¹¹Éè¼Æ