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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
dz̸Cordova¿ò¼ÜµÄһЩÀí½â
 
  6415  次浏览      30
 2018-7-13
 
±à¼­ÍƼö:
±¾ÎÄÀ´×ÔÓÚ¸öÈ˲©¿Í,±¾ÎÄÖ÷Òª½²ÊöÈçºÎͨ¹ý¿çƽ̨¿ª·¢µÄ·½·¨Ê¹ÓÃCordova¿ò¼Ü¿ª·¢¡£

Ŀ¼

1.ΪºÎÒªÓÃCordova

2.ʲôÊÇCordova

3.CordovaÖÐUMLÀàͼ

4.CordovaʵÏÖ»úÖÆ

5..С½á

ΪºÎÒªÓÃCordova

Ëæ×ÅÒÆ¶¯»¥ÁªÍøµÄ·¢Õ¹£¬ÏÖÔÚ»ù±¾ÊÇAPPÂúÌì·É£¬²»ÖªÔÚ´ó¼ÒÓ¡ÏóÖУ¬Èç¹ûÎÒÈ¥ÏÂÔØÒ»¸öAPP£¬ÄÇô»ù±¾¶¼ÄÜ¿´µ½ÓÐÁ½ÖÖÑ¡Ôñ£¬Ò»ÖÖÊÇAndroid°æ±¾£¬Ò»ÖÖÊÇIOS°æ±¾¡£²»¹ÜÎÒµÄÊÖ»úÊÇÄÄÖÖ²Ù×÷ϵͳ£¬°²×°ÍêÒ»¸öAPPÖ®ºó£¬ºóÐøÈç¹ûÓÐеİ汾·¢²¼µÄʱºò£¬ÎÒ»¹±ØÐëÈ¥¸üУ¬²ÅÄÜÏíÓÃа汾ÀïµÄ¹¦ÄÜ£¬±ÈÈçÎÒ×°ÁË¡°¾©¶«¡±Õâ¸öAPP£¬Ç°¼¸ÌìÕýºÃÅöµ½¡°618¡±»î¶¯£¬ÄÇô֮ǰһ¸öÔÂAPP Store¾ÍÌáÐÑÎÒҪȥ¸üÐÂ×îеÄAPP°æ±¾£¬ÒÔÃâ´í¹ý¡°618¡±»î¶¯ÖÐÐµĹ¦ÄÜʹÓá£Ïà¶ÔÀ´ËµIOSϵͳ¸üÐÂAPP±ÈÆðAndroidϵͳÓû§ÌåÑé»áºÃÒ»µã£¬µ«ÊÇ»¹ÊÇÉÔÏÔÂé·³µã¡£

ÄÇôÓÐûÓÐÒ»ÖÖ·½Ê½£¬ÎÒÖ»ÐèÒª¿ª·¢Ò»¸öAPP°æ±¾£¬¾ÍÄÜÈ¥ÊÊÅäͨÓõIJÙ×÷ÏµÍ³ÄØ£¬²»½ö¿ÉÒÔÊÊÅäAndroid¡¢IOS£¬»¹¿ÉÒÔÊÊÅäÆäËûϵͳ£¬±ÈÈçWindows Phone¡¢ Palm WebOS¡¢BlackberryµÈµÈ¡£ÓУ¬Cordova¾ÍÄÜÌṩÕâÖÖÄÜÁ¦£¬´úÂëдһ´Î£¬¾ÍÄܵ½´¦ÔËÐУ¬¸úÎÒÃÇÈÕ³£¿ª·¢ÍøÕ¾Ð§¹ûÒ»Ñù£¬»ùÓÚдWeb APP£¬¸ù¾ÝÊä³öƽ̨ҪÇó²»Í¬£¬¾ÍÄÜÌṩ²»Í¬ÀàÐ͵ݲװ°ü¡£CordovaÆäÉè¼Æ³õÖÔÊÇÏ£ÍûÓû§ÈºÌåÄܹ»Í¨¹ý¿çƽ̨¿ª·¢µÄ·½·¨½µµÍÔ­Éú¿ª·¢µÄ³É±¾£¬Îª´Ë£¬¿ª·¢ÈËÔ±ÐèÒª°²×°Ô­Éú¿ª·¢»·¾³£¬ÅäÖù¤³Ì£¬Ê¹ÓÃHTML5¡¢CSS3¡¢JSºÍÔ­ÉúSDKÉú³ÉÓ¦Óá£

ʲôÊÇCordova

¹ÙÍø¶¨ÒåÈçÏ£º

Apache CordovaÊÇÒ»¸ö¿ªÔ´µÄÒÆ¶¯¿ª·¢¿ò¼Ü¡£ÔÊÐíÄãÓñê×¼µÄweb¼¼Êõ-HTML5,CSS3ºÍJavaScript×ö¿çƽ̨¿ª·¢¡£ Ó¦ÓÃÔÚÿ¸öƽ̨µÄ¾ßÌåÖ´Ðб»·â×°ÁËÆðÀ´£¬²¢ÒÀ¿¿·ûºÏ±ê×¼µÄAPI°ó¶¨È¥·ÃÎÊÿ¸öÉ豸µÄ¹¦ÄÜ£¬±ÈÈç˵£º´«¸ÐÆ÷¡¢Êý¾Ý¡¢ÍøÂç״̬µÈ¡£

ʹÓÃApache CordovaµÄÈËȺ:

1.ÒÆ¶¯Ó¦Óÿª·¢Õߣ¬ÏëÀ©Õ¹Ò»¸öÓ¦ÓõÄʹÓÃÆ½Ì¨£¬¶ø²»Í¨¹ýÿ¸öƽ̨µÄÓïÑԺ͹¤¾ß¼¯ÖØÐÂʵÏÖ¡£

2.web¿ª·¢Õߣ¬Ïë°ü×°²¿Êð×Ô¼ºµÄweb App½«Æä·Ö·¢µ½¸÷¸öÓ¦ÓÃÉ̵êÃÅ»§¡£

3.ÒÆ¶¯Ó¦Óÿª·¢Õߣ¬ÓÐÐËȤ»ìºÏÔ­ÉúÓ¦ÓÃ×齨ºÍÒ»¸öWebView(Ò»¸öÌØ±ðµÄä¯ÀÀÆ÷´°¿Ú) ¿ÉÒÔ½Ó´¥É豸A¼¶PI£¬»òÕßÄãÏ뿪·¢Ò»¸öÔ­ÉúºÍWebView×é¼þÖ®¼äµÄ²å¼þ½Ó¿Ú¡£

´ÓͼÖУ¬ÎÒÃÇ¿ÉÒÔ¿´µ½ËüÌṩÁËWeb APP¡¢WebView¡¢Cordova Plugins¡£

Web APP

ÕâÊÇ´æ·ÅÓ¦ÓóÌÐò´úÂëµÄµØ·½£¬ÌåÏÖÊÇÄãµÄ¾ßÌåÒµÎñÂß¼­Ä£¿é¡£Ó¦ÓõÄʵÏÖÊÇͨ¹ýwebÒ³Ãæ£¬Ä¬Èϵı¾µØÎļþÃû³ÆÊÇÊÇindex.html£¬Õâ¸ö±¾µØÎļþÓ¦ÓÃCSS,JavaScript,ͼƬ£¬Ã½ÌåÎļþºÍÆäËûÔËÐÐÐèÒªµÄ×ÊÔ´¡£Ó¦ÓÃÖ´ÐÐÔÚÔ­ÉúÓ¦Óðü×°µÄWebViewÖУ¬Õâ¸öÔ­ÉúÓ¦ÓÃÊÇÄã·Ö·¢µ½app storesÖеġ£

WebView

CordovaÆôÓõÄWebView¿ÉÒÔ¸øÓ¦ÓÃÌṩÍêÕûÓû§·ÃÎʽçÃæ¡£ÔÚһЩƽ̨ÖУ¬ËûÒ²¿ÉÒÔ×÷Ϊһ¸ö×é¼þ¸ø´óµÄ¡¢»ìºÏÓ¦Óã¬ÕâЩӦÓûìºÏºÍWebviewºÍÔ­ÉúµÄÓ¦ÓÃ×é¼þ¡£

Cordova Plugins

²å¼þÊÇCordovaÉú̬ϵͳµÄÖØÒª×é³É²¿·Ö¡£ËûÌṩÁËCordovaºÍÔ­Éú×é¼þÏ໥ͨÐŵĽӿڲ¢°ó¶¨µ½Á˱ê×¼µÄÉ豸APIÉÏ£¬ÕâʹÄãÄܹ»Í¨¹ýJavaScriptµ÷ÓÃÔ­Éú´úÂë¡£

CordovaÖÐUMLÀàͼ

ÆäʵCordovaͨ¹ýÃüÁîÀ´Ìí¼ÓÏîÄ¿µÄ£¬µ«ÊÇ¿ÉÒÔÑ¡ÔñÄĸöƽ̨ȥ±àÒ룬±ÈÈçÎÒÃÇÌí¼ÓAndroidƽ̨£¬ÔÚAndroidĬÈÏmainActivityÀ࣬ÎÒÃÇ¿ÉÒÔ¿´µ½ËüÆäʵ¼Ì³ÐCordovaActivityÀ࣬һÇгõʼ»¯Ìõ¼þÊÇ´ÓloadUrl·½·¨¿ªÊ¼¡£

package com.example.hello;

import android.os.Bundle;
import org.apache.cordova.*;

public class MainActivity extends CordovaActivity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);

// enable Cordova apps to be started in the background
Bundle extras = getIntent().getExtras();
if (extras != null && extras.getBoolean("cdvStartInBackground", false)) {
moveTaskToBack(true);
}

// Set by <content src="index.html" /> in config.xml
loadUrl(launchUrl);
}
}

½ø¶øµÃµ½ÒÔÏÂUMLÀàͼ

¼òµ¥·ÖÎöÏ£¬CordovaActivityÄÚÒÀÀµÒ»¸öWebViewÀ࣬һ¸öPreferencesÀ࣬һ¸öCordovaInterface½Ó¿Ú£¬²¢Í¬Ê±³õʼ»¯Ò»Ð©ÅäÖÃÐÅÏ¢¡£WebView¾ßÌåʵÏÖÊÇÓÉCordovaWebViewImplÀ࣬CordovaInterface½Ó¿Ú¾ßÌåʵÏÖÊÇÓÉCordovaInterfaceImplÀàʵÏÖ¡£

CordovaWebViewImplÊǺËÐÄÀ࣬ÀïÃæ»á°ÑһЩ²å¼þÄÜÁ¦³õʼ»¯£¬ÓÃÒ»¸öPluginManager½øÐйÜÀí£¬°üº¬Ò»¸öÒýÇæÀࡪCordovaWebViewEngine£¬Õâ¸öÒýÇæÊÇͨ¹ý·´ÉäµÄ·½Ê½´´½¨£¬×ÔÉí³õʼ»¯µÄʱºò°ÑNativeToJsMessageQueue¹ØÁªÆðÀ´£¬ÀïÃæ°üº¬×ÅÒÔJs×Ö·û´®ÎªÖ÷µÄË«ÏòÁ´±í£¬°Ñÿ´Î´Óǰ¶Ëͨ¹ýJS´úÂë´æ´¢ÆðÀ´£¬È»ºóͨ¹ý°ó¶¨µÄÇŽӷ½Ê½Pop³öµ½ÏàÓ¦µÄNative´úÂëÖÐÈ¥¡£

×îÖÕʵÏÖÓÉSystemWebViewEngineÀàÀ´¶ÔAndroidϵͳÖÐWebView¿Ø¼þ½øÐжþ´Î°ü×°£¬Õâ¸öÀàµÄ³õʼ»¯ÊÇÔÚCordovaWebViewImplÀà·´Éä´´½¨£¬Ïà¹Ø²å¼þºÍÏûÏ¢´«µÝÒ²ÊÇͨ¹ýSystemWebViewEngine½øÐа󶨡£

CordovaʵÏÖ»úÖÆ

µ±Cordova¿ò¼ÜÆô¶¯Ê±ºò£¬CordovaActivityÀàÖеÄonCreate·½·¨µ÷ÓÃloadUrl·½·¨¼´¿ÉÆô¶¯£¬×îÖÕÔÚSystemWebViewEngineÀàµÄinit·½·¨ÖУ¬»áµ÷ÓÃwebViewµÄaddJavascriptInterface·½·¨£¬¿´µ½Õâ¸ö·½·¨ÊDz»ÊǺÜÊìϤ£¬ÎÒÃdz£¹æÈÃwebViewÖ§³Ö¿ªÆôJavaScriptµ÷ÓýӿÚÒ²ÊÇʹÓôËÌØÐÔ¡£

private static void exposeJsInterface(WebView webView, CordovaBridge bridge) {
if ((Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1)) {
LOG.i(TAG, "Disabled addJavascriptInterface() bridge since Android version is old.");
// Bug being that Java Strings do not get converted to JS strings automatically.
// This isn't hard to work-around on the JS side, but it's easier to just
// use the prompt bridge instead.
return;
}
SystemExposedJsApi exposedJsApi = new SystemExposedJsApi(bridge);
webView.addJavascriptInterface(exposedJsApi, "_cordovaNative");
}

ÄÇôSystemExposedJsApiÀànew³öÀ´µÄ¶ÔÏó¾ÍµÈͬÅ׳ö¡°_cordovaNative¡±¶ÔÏó¸øJS¶Ëµ÷Ó㬽øÈ¥¿´ÏÂSystemExposedJsApiÀà°üº¬ÄÄЩÄÚÈÝ£¬

class SystemExposedJsApi implements ExposedJsApi {
private final CordovaBridge bridge;

SystemExposedJsApi(CordovaBridge bridge) {
this.bridge = bridge;
}

@JavascriptInterface
public String exec(int bridgeSecret, String service, String action, String callbackId, String arguments) throws JSONException, IllegalAccessException {
return bridge.jsExec(bridgeSecret, service, action, callbackId, arguments);
}

@JavascriptInterface
public void setNativeToJsBridgeMode(int bridgeSecret, int value) throws IllegalAccessException {
bridge.jsSetNativeToJsBridgeMode(bridgeSecret, value);
}

@JavascriptInterface
public String retrieveJsMessages(int bridgeSecret, boolean fromOnlineEvent) throws IllegalAccessException {
return bridge.jsRetrieveJsMessages(bridgeSecret, fromOnlineEvent);
}
}

ÆäÖÐ×î¹Ø¼üÊÇexec·½·¨£¬ÆäÖÐbridgeSecret´ú±íÑ¡ÔñÄĸöÇŽӷ½Ê½£¬serviceÒ»°ã¶ÔÓ¦×ÅÄã±¾µØJavaÎļþÀàÃû£¬action´ú±íjavaÎļþÖз½·¨Ãû£¬callbackId´ú±í»Øµ÷º¯ÊýµÄId£¬Ò²¾ÍÊǾä±ú£¬arguments´ú±í´«µÝµÄ²ÎÊý¡£¿´³öÆäÖÐÉè¼ÆË¼ÏëÁËû£¬serviceÍùÍùÊDZ¾µØÄÜÁ¦¼¯µÄÀàÃû£¬±ÈÈçweb¶ËÏëµ÷ÓÃÏà»ú£¬Ò»°ãÆð¸öCameraÀà´ú±íÕâ¸öÏà»ú·þÎñÀ࣬ȻºóÔÚÕâ¸öÀàÖж¨Òå·½·¨£¬Ò²¾ÍÊÇaction²ÎÊý£¬Õâ¸öactionÃû³Æ¿ÉÀ©Õ¹£¬ÒòΪ·½·¨Ãû³Æ¿É¸÷ÖÖ¸÷Ñù£¬ÊʺÏ×Ô¶¨Ò幦ÄÜÀ©Õ¹¡£

SystemExposedJsApi¶ÔÏó³õʼ»¯

ÔÚ´´½¨SystemExposedJsApiʱÐèÒªCordovaBridgeÀ࣬CordovaBridgeÀà³õʼ»¯ÐèÒªCordovaWebViewµÄPluginManager¶ÔÏóºÍNativeToJsMessageQueue¶ÔÏó¡£ÒòΪËùÓеÄJS¶ËÓëAndroid native´úÂë½»»¥¶¼ÊÇͨ¹ýSystemExposedJsApi¶ÔÏóµÄexec·½·¨¡£ÔÚexec·½·¨ÖÐÖ´ÐÐPluginManagerµÄexec·½·¨£¬PluginManagerÈ¥²éÕÒ¾ßÌåµÄPlugin²¢ÊµÀý»¯È»ºóÔÙÖ´ÐÐPluginµÄexecute·½·¨£¬²¢¸ù¾Ýͬ²½±êʶÅжÏÊÇͬ²½·µ»Ø¸øJSÏûÏ¢»¹ÊÇÒì²½¡£ÓÉNativeToJsMessageQueueͳһ¹ÜÀí·µ»Ø¸øJSµÄÏûÏ¢¡£

ºÎʱ¼ÓÔØPlugin£¬ÈçºÎ¼ÓÔØ

CordovaÖкÜÖØÒªµÄ²¿·ÖÊDzå¼þ£¬CordovaÔÚÆô¶¯Ã¿¸öActivityµÄʱºò¶¼»á½«ÅäÖÃÎļþÖеÄËùÓÐplugin¼ÓÔØµ½PluginManager£¬ÔÚµÚÒ»´ÎloadUrl·½·¨Ê±£¬¾Í»áÈ¥³õʼ»¯PluginManager²¢¼ÓÔØplugin£¬PluginManager ÔÚ¼ÓÔØ plugin µÄʱºò²¢²»ÊÇÂíÉÏʵÀý»¯plugin¶ÔÏ󣬶øÊÇÖ»Êǽ«pluginµÄClassÃû×Ö±£´æµ½Ò»¸öhashmapÖУ¬ÓÃserviceÃû×Ö×÷ΪkeyÖµ¡£µ±JS¶Ëͨ¹ýJavascriptInterface½Ó¿ÚµÄ SystemExposedJsApi ¶ÔÏóÇëÇóAndroidʱ£¬PluginManager »á´Ó hashmap ÖвéÕÒµ½ plugin £¬Èç¹û¸Ãplugin»¹Î´ÊµÀý»¯£¬ÀûÓÃjava·´Éä»úÖÆÊµÀý»¯¸Ãplugin£¬²¢Ö´ÐÐpluginµÄexecute·½·¨¡£

CordovaµÄÊý¾Ý·µ»Ø

CordovaÖÐͨ¹ýexec()º¯ÊýÇëÇóandroid²å¼þ£¬Êý¾ÝµÄ·µ»Ø¿Éͬ²½Ò²¿ÉÒÔÒì²½ÓÚexec()º¯ÊýµÄÇëÇó¡£ÔÚ¿ª·¢android²å¼þµÄʱºò¿ÉÒÔÖØÐ´ public boolean isSynch(String action) ·½·¨À´¾ö¶¨ÊÇͬ²½»¹ÊÇÒì²½¡£CordovaÔÚandroid¶ËʹÓÃÁËÒ»¸ö¶ÓÁÐ (NativeToJsMessageQueue) À´×¨ÃŹÜÀí·µ»Ø¸øJSµÄÊý¾Ý¡£

1£¬Í¬²½

CordovaÔÚÖ´ÐÐÍêexec()ºó£¬android»áÂíÉÏ·µ»ØÊý¾Ý£¬µ«²»Ò»¶¨¾ÍÊǸôÎÇëÇóµÄÊý¾Ý£¬¿ÉÄÜÊÇÇ°ÃæÄ³´ÎÇëÇóµÄÊý¾Ý£»ÒòΪµ±exec()ÇëÇóµÄ²å¼þÊÇÔÊÐíͬ²½·µ»ØÊý¾ÝµÄÇé¿öÏ£¬CordovaÒ²ÊÇ´ÓNativeToJsMessageQueue¶ÓÁÐÍ·popÍ·Êý¾Ý²¢·µ»Ø¡£È»ºóÔÙ¸ù¾Ý callbackID ·´Ïò²éÕÒij¸öJSÇëÇ󣬲¢½«Êý¾Ý·µ»Ø¸ø¸ÃÇëÇóµÄsuccessº¯Êý¡£

2£¬Òì²½

CordovaÔÚÖ´ÐÐÍêexec()ºó²¢²»»áͬ²½µÃµ½Ò»¸ö·µ»ØÊý¾Ý¡£CordovaÔÚÖ´ÐÐexec()µÄͬʱÆô¶¯ÁËÒ»¸öXMLHttpRequest¶ÔÏó·½Ê½»òÕßprompt()º¯Êý·½Ê½µÄÑ­»·º¯ÊýÀ´²»Í£µÄÈ¥»ñÈ¡NativeToJsMessageQueue¶ÓÁÐÖеÄÊý¾Ý£¬²¢¸ù¾Ý callbackID ·´Ïò²éÕÒµ½Ïà¶ÔÓ¦µÄJSÇëÇ󣬲¢½«¸ÃÊý¾Ý½»¸øsuccessº¯Êý¡£

webView.sendJavascript ·¢Ë͵½js¶ÓÁУ¬onNativeToJsMessageAvailable ¸ºÔðÖ´ÐÐ js.

Native µ÷Óà JS Ö´Ðз½Ê½ÓÐÈýÖÖʵÏÖ LoadUrlBridgeMode ¡¢ OnlineEventsBridgeMode ¡¢ PrivateApiBridgeMode

1¡¢webView.sendJavascript ·¢ËÍjs·½·¨µ½JS¶ÓÁÐ

2¡¢onJsPrompt ·½·¨À¹½Ø£¬»ñÈ¡µ÷Ó÷½Ê½

Èç¹ûÊÇgap_bridge_mode£¬ÔòÖ´ÐÐ appView.exposedJsApi . setNativeToJsBridgeMode(Integer.parseInt(message)) ;

Èç¹ûÊÇ gap_poll , ÔòÖ´ÐÐ appView.exposedJsApi . retrieveJsMessages ("1".equals(message));

3¡¢µ÷Óà setBridgeMode ·½·¨µ÷Óà onNativeToJsMessageAvailable Ö´ÐÐ javascript µ÷ÓÃ

С½á

×ܵÄÀ´Ëµ£¬Ê¹Óà Cordova ¿ò¼Ü¿ª·¢ÓÅȱµãºÜÃ÷ÏÔ¡£

Óŵ㣺

1.¿çƽ̨£¬¿ª·¢¼òµ¥£¬Ñ§Ï°³É±¾µÍ

2.¿ò¼Ü¶à£¬²å¼þ¶à£¬¿É×Ô¶¨Òå²å¼þ

3.·¢Õ¹×îÔ磬ÉçÇø×ÊÔ´·á¸»£¬

ȱµã£º

1.WebViewÐÔÄܵÍÏÂʱ£¬Óû§ÌåÑé²î£¬·´Ó¦Âý

2.±Ï¾¹ÊÇÀÏÍâµÄ¿ò¼Ü£¬ÖÐÎÄÎĵµ×ÊÔ´ÉÙ

3.µ÷ÊÔ²»·½±ã£¬¼È²»ÏñÔ­ÉúÄÇôºÃµ÷ÊÔ£¬Ò²²»Ïñ´¿webÄÇÖÖµ÷ÊÔ

×îºóÏë˵һ¾ä£¬ÎÞÂÛÊÇÑ¡ÔñÔ­Éúģʽ¿ª·¢»¹ÊÇHybrid»ìºÏģʽ£¬Ò»¶¨ÊÇÒª»ùÓÚ¾ßÌåÒµÎñ³¡¾°È¥Ñ¡Ôñ£¬¶ø²»ÊÇäĿºÍ¾ø¶Ô»¯¾õµÃÄÄÖÖģʽºÃ¾Í²»×ö·ÖÎöÏ뵱ȻµÄȥѡÔñ£¬»¹ÊÇÓÐÑ¡ÔñµÄ½áºÏ£¬ÒªÖªµÀÓ¦ÓÃÖ®ÃÀÔÚÓÚÒ©µ½²¡³ý¡£

   
6415 ´Îä¯ÀÀ       30
Ïà¹ØÎÄÕÂ

Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
Ïà¹ØÎĵµ

ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
Ïà¹Ø¿Î³Ì

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì