我目前正在尝试使用 PhoneGap LocalNotification插件, 将Android 4.1与Cordova 2.0.0和Sketcha(UI库)结合使用。
更新#2 20/9/12:我使用了Bozzzi的代码并修复了一些问题:
将cordova.define("cordova/plugin/LocalNotification", function(require, exports, module)
更改为:
cordova.define("cordova/plugin/LocalNotification", function(require, exports, module)
,
所以模块名称将匹配此功能(在找不到模块之前):
window.plugins.LocalNotification = cordova.require( “科尔多瓦/插件/ LocalNotification”);
从此改变:
if(!window.plugins){ window.plugins = {}; } 否则if(!window.plugins.LocalNotification){ window.plugins.LocalNotification = cordova.require(“cordova / plugin / LocalNotification”); }
到此:
if (!window.plugins) {
window.plugins = {};
}
if (!window.plugins.LocalNotification) {
window.plugins.LocalNotification = cordova.require("cordova/plugin/LocalNotification");
}
在此更改之前,如果找不到window.plugins,则会创建它,但window.plugins.LocalNotification不会。
完成所有这些修复后,我收到此错误:
> 09-20 01:22:27.355: D/CordovaLog(8297): > file:///android_asset/www/index.html: Line 21 : PAPA AMERICANO ready > 09-20 01:22:27.360: I/Web Console(8297): PAPA AMERICANO ready at > file:///android_asset/www/index.html:21 09-20 01:22:27.370: > D/CordovaLog(8297): Uncaught TypeError: Cannot call method 'add' of > undefined 09-20 01:22:27.375: D/CordovaLog(8297): > file:///android_asset/www/index.html: Line 35 : Uncaught TypeError: > Cannot call method 'add' of undefined 09-20 01:22:27.375: E/Web > Console(8297): Uncaught TypeError: Cannot call method 'add' of > undefined at file:///android_asset/www/index.html:35 09-20 > 01:22:29.185: D/DroidGap(8297): onMessage(spinner,stop) 09-20 > 01:22:30.255: E/SKIA(8297): FimgApiStretch:stretch failed 09-20 > 01:22:41.755: E/SKIA(8297): FimgApiStretch:stretch failed 09-20 > 01:22:52.565: D/CordovaWebView(8297): >>> loadUrlNow() 09-20 > 01:22:52.565: D/webkit(8297): Firewall not null 09-20 01:22:52.565: > D/webkit(8297): euler: isUrlBlocked = false
由于某种原因,cordova.require("cordova/plugin/LocalNotification")
不设置window.plugins.LocalNotification
值并且它一直未定义。
这是我更新的index.html(更新#2):
<!DOCTYPE HTML>
<html manifest="" lang="en-US">
<head>
<meta charset="UTF-8">
<title>AndroidSencha</title>
<script id="microloader" type="text/javascript" src="cordova-2.0.0.js"></script>
<script id="microloader" type="text/javascript" src="LocalNotification.js"></script>
<script id="microloader" type="text/javascript">
function onDeviceReady() {
if (!window.plugins) {
window.plugins = {};
} else if (!window.plugins.LocalNotification) {
window.plugins.LocalNotification = cordova.require("cordova/plugin/LocalNotification");
}
}
window.document.addEventListener("deviceready", appReady, false);
function appReady() {
console.log("PAPA AMERICANO ready");
var d = new Date();
d = d.getTime() + 2 * 1000; //60 seconds from now
d = new Date(d);
if (!window.plugins) {
window.plugins = {};
}
if (!window.plugins.LocalNotification) {
window.plugins.LocalNotification = cordova.require("cordova/plugin/LocalNotification");
}
window.plugins.localNotification.add({
date: d,
message: 'This is an Android alarm using the statusbar',
id: 123
});
}
</script>
<style type="text/css">
/**
* Example of an initial loading indicator.
* It is recommended to keep this as minimal as possible to provide instant feedback
* while other resources are still being loaded for the first time
*/
html, body {
height: 100%;
background-color: #1985D0
}
</style>
<!-- The line below must be kept intact for Sencha Command to build your application -->
<script id="microloader" type="text/javascript" src="sdk/microloader/development.js"></script>
<style type="text/css">
.loadingText{
color: white;
font-family: "Avant Garde", Avantgarde, "Century Gothic", CenturyGothic, "AppleGothic", sans-serif;
text-align: center;
font-size: 20px;
padding-top: 10%;
}
</style>
</head>
<body>
<div id="appLoadingIndicator">
<div class="loadingText"><div style="margin-bottom: 10px;">Loading, Please wait..</div>
<div><img src="resources\images\smileloading.gif"></div></div>
</div>
</body>
</html>
这是修复后的localnotificaiton.js(更新#2):
cordova.define("cordova/plugin/LocalNotification", function(require, exports, module) {
var exec = require("cordova/exec");
var LocalNotification = function () {};
LocalNotification.prototype.add = function(options) {
var defaults = {
date : new Date(),
message : '',
ticker : '',
repeatDaily : false,
id : ""
};
if (options.date) {
options.date = (options.date.getMonth()) + "/" + (options.date.getDate()) + "/"
+ (options.date.getFullYear()) + "/" + (options.date.getHours()) + "/"
+ (options.date.getMinutes());
}
for ( var key in defaults) {
if (typeof options[key] !== "undefined")
defaults[key] = options[key];
}
cordova.exec(null, null, "LocalNotification", "add", new Array(defaults));
};
LocalNotification.prototype.cancel = function(notificationId) {
cordova.exec(null, null, 'LocalNotification', 'cancel', new Array({
id : notificationId
}));
};
LocalNotification.prototype.cancelAll = function() {
cordova.exec(null, null, 'LocalNotification', 'cancelAll', new Array());
};
var LocalNotification = new LocalNotification();
module.exports = LocalNotification
});
更新#1:我已经将插件添加到plugins.xml文件中:
<plugins>
...
<plugin name="LocalNotification" value="com.phonegap.plugin.localnotification.LocalNotification"/>
...
</plugins>
我已经完成了here提到的步骤,并替换了提到的here的破解java表达式。
不幸的是,当我运行应用程序时,我收到以下错误(模拟器和设备中都有):
09-16 16:46:16.330:E / Web Console(27875):未捕获的ReferenceError: 插件未在file:///android_asset/www/index.html:74
中定义
This guy was facing the same problem但是我在index.html中引用了cordova javascript文件,但仍无效。
这是我的包浏览器的样子(你可能会发现缺少的东西): 我不确定我是否应该有plugins.xml或者有config.xml并且有插件, 我有两个以防万一
提前致谢!
答案 0 :(得分:4)
插件的.js尚未更新为2.0.0规范。看看我最近的一篇关于如何编写符合2.0.0规范的插件的博客文章。
http://simonmacdonald.blogspot.ca/2012/08/so-you-wanna-write-phonegap-200-android.html
答案 1 :(得分:4)
我更改了LocalNotification.js,因此您可以复制代码。它适用于cordova 2.0(已测试!)
cordova.define("cordova/plugin/js/LocalNotification", function(require, exports, module) {
var exec = require("cordova/exec");
var LocalNotification = function () {};
LocalNotification.prototype.add = function(options) {
var defaults = {
date : new Date(),
message : '',
ticker : '',
repeatDaily : false,
id : ""
};
if (options.date) {
options.date = (options.date.getMonth()) + "/" + (options.date.getDate()) + "/"
+ (options.date.getFullYear()) + "/" + (options.date.getHours()) + "/"
+ (options.date.getMinutes());
}
for ( var key in defaults) {
if (typeof options[key] !== "undefined")
defaults[key] = options[key];
}
cordova.exec(null, null, "LocalNotification", "add", new Array(defaults));
};
LocalNotification.prototype.cancel = function(notificationId) {
cordova.exec(null, null, 'LocalNotification', 'cancel', new Array({
id : notificationId
}));
};
LocalNotification.prototype.cancelAll = function() {
cordova.exec(null, null, 'LocalNotification', 'cancelAll', new Array());
};
var LocalNotification = new LocalNotification();
module.exports = LocalNotification;
});
现在你可以打电话给通知。用:
datum = '2012-09-20 15:51:00';
tt1 = datum.split(/[- :]/);
dd = new Date(tt1[0], tt1[1]-1, tt1[2], tt1[3], tt1[4], tt1[5]);
window.plugins.LocalNotification.add({ date: dd, message: "Some message", ticker : "Some ticker", repeatDaily : false, id: 1234 });
答案 2 :(得分:3)
查看cordova 2.2的最新插件更新 LocalNotification 2.2
答案 3 :(得分:0)
使用window.plugin不单独插件,看看会发生什么。