有朋友问能不能在CanTK和AppBuilder开发的APP里发送UDP数据,HTML5里只能用HTTPS/HTTP/WebSocket几种通讯方式,要使用UDP需要通过phonegap打包成APK等特定平台的安装包。为此我写了一个UDP的例子,但是运行时遇到的问题,所以花了些时间去研究phonegap加载udp插件的过程。
1.添加需要的插件
在cordova_plugins.js中存放了APP引用的插件列表,可以用phonegap plugin add添加,如:
phonegap plugin add org.chromium.sockets.tcp
2.加载cordova_plugins.js
点击(此处)折叠或打开
- exports.load = function(callback) {
- var pathPrefix = findCordovaPath();
- if (pathPrefix === null) {
- console.log('Could not find cordova.js script tag. Plugin loading may fail.');
- pathPrefix = '';
- }
- injectIfNecessary('cordova/plugin_list', pathPrefix + 'cordova_plugins.js', function() {
- var moduleList = require("cordova/plugin_list");
- handlePluginsObject(pathPrefix, moduleList, callback);
- }, callback);
- };
- function handlePluginsObject(path, moduleList, finishPluginLoading) {
- // Now inject the scripts.
- var scriptCounter = moduleList.length;
- if (!scriptCounter) {
- finishPluginLoading();
- return;
- }
- function scriptLoadedCallback() {
- if (!--scriptCounter) {
- onScriptLoadingComplete(moduleList, finishPluginLoading);
- }
- }
- for (var i = 0; i < moduleList.length; i++) {
- injectIfNecessary(moduleList[i].id, path + moduleList[i].file, scriptLoadedCallback);
- }
- }
3.插件的JS文件中调用cordova.define把自己注册到phonegap的模块列表里 点击(此处)折叠或打开
4.调用者不需要直接引用插件的JS,而是调用cordova.require去从插件列表中查找,然后使用
点击(此处)折叠或打开
- var dgram = cordova.require('in.girish.datagram.datagram'); var client = dgram.createSocket("udp4");
- client.send("hello cantk", "192.168.1.168", 41234, function(err) { console.log(err ? JSON.stringify(err) : "success");
- client.close();
- })
插件使用者只需要关注第1步和第4步即可。第2步由phonegap实现,第3步由插件提供者实现。
但是第3步要注意,老版本要求插件自己调用cordova.define,新版本会自动加上这个定义。所以新版本phonegap使用老版本的插件就会存在问题,导致重复定义而无法使用,需要手动删除这个定义。