我陷入了这个phonegap项目。一切在Android和iOS上都很完美< = 7但在iOS> = 8.0时失败。将出现一个弹出窗口,其中显示消息:“找不到变量:device”
这是我得到的信息:
这是我的HTML:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="format-detection" content="telephone=no" />
<meta name="msapplication-tap-highlight" content="no" />
<meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, target-densitydpi=device-dpi" />
<link rel="stylesheet" type="text/css" href="css/index.css" />
<title>Hello World</title>
<script type="text/javascript" src="cordova.js" charset="utf-8"></script>
<script type="text/javascript" src="js/PushNotification.js" charset="utf-8"></script>
</head>
<body onload="documentReady();">
<div class="app">
<h1>Apache Cordova</h1>
<div id="deviceready" class="blink">
<p class="event listening">Connecting to Device</p>
<p class="event received">Device is Ready</p>
</div>
</div>
<script type="text/javascript" src="https://code.jquery.com/jquery-1.11.1.min.js"></script>
<script type="text/javascript" src="js/index.js"></script>
</body>
</html>
这是我在标签底部加载的'index.js'。
var myPushNotification;
// result contains any message sent from the plugin call
function successHandler (result) {
alert('result = ' + result);
}
// result contains any error description text returned from the plugin call
function errorHandler (error) {
alert('error = ' + error);
}
var app = {
// Application Constructor
initialize: function() {
this.bindEvents();
},
// Bind Event Listeners
//
// Bind any events that are required on startup. Common events are:
// 'load', 'deviceready', 'offline', and 'online'.
bindEvents: function() {
document.addEventListener('deviceready', this.onDeviceReady, false);
},
// deviceready Event Handler
//
// The scope of 'this' is the event. In order to call the 'receivedEvent'
// function, we must explicitly call 'app.receivedEvent(...);'
onDeviceReady: function() {
app.receivedEvent('deviceready');
},
// Update DOM on a Received Event
receivedEvent: function(id) {
var parentElement = document.getElementById(id);
var listeningElement = parentElement.querySelector('.listening');
var receivedElement = parentElement.querySelector('.received');
listeningElement.setAttribute('style', 'display:none;');
receivedElement.setAttribute('style', 'display:block;');
try
{
if(window.plugins && window.plugins.pushNotification){
myPushNotification = window.plugins.pushNotification;
}else{
window.plugins = {};
window.plugins.pushNotification = new PushNotification();
}
if(typeof window.device === 'undefined' || typeof device === 'undefined'){
alert('Device plugin not found');
}else{
//Android register
if (device.platform == 'android' || device.platform == 'Android' || device.platform == "amazon-fireos" ){
myPushNotification.register(
successHandler,
errorHandler,
{
"senderID":"1010852256891",
"ecb":"onNotification"
});
//Blackberry
}else if(device.platform == 'blackberry10'){
myPushNotification.register(
successHandler,
errorHandler,
{
invokeTargetId : "replace_with_invoke_target_id",
appId: "replace_with_app_id",
ppgUrl:"replace_with_ppg_url", //remove for BES pushes
ecb: "pushNotificationHandler",
simChangeCallback: replace_with_simChange_callback,
pushTransportReadyCallback: replace_with_pushTransportReady_callback,
launchApplicationOnPush: true
});
//iPhone - iPad
}else{
myPushNotification.register(
tokenHandler,
errorHandler,
{
"badge":"true",
"sound":"true",
"alert":"true",
"ecb":"onNotificationAPN"
});
}
}//End device plugin check.
}catch(e){
alert("Plugin of PushNotify niet beschikbaar\n" + e.message);
}
}
};
// Android and Amazon Fire OS onNotification
function onNotification(e) {
switch( e.event )
{
case 'registered':
if ( e.regid.length > 0 )
{
//Register our device
$.post('http://www.my_webaddress.com/action/device',
{
device:e.regid
}
,function(res){
alert(res);
});
// Your GCM push server needs to know the regID before it can push to this device
// here is where you might want to send it the regID for later use.
//console.log("regID = " + e.regid);
}
break;
case 'message':
// if this flag is set, this notification happened while we were in the foreground.
// you might want to play a sound to get the user's attention, throw up a dialog, etc.
if ( e.foreground )
{
alert('<li>--INLINE NOTIFICATION--' + '</li>');
// on Android soundname is outside the payload.
// On Amazon FireOS all custom attributes are contained within payload
var soundfile = e.soundname || e.payload.sound;
// if the notification contains a soundname, play it.
var my_media = new Media("/android_asset/www/"+ soundfile);
my_media.play();
}
else
{ // otherwise we were launched because the user touched a notification in the notification tray.
if ( e.coldstart )
{
alert('<li>--COLDSTART NOTIFICATION--' + '</li>');
}
else
{
alert('<li>--BACKGROUND NOTIFICATION--' + '</li>');
}
}
alert('<li>MESSAGE -> MSG: ' + e.payload.message + '</li>');
//Only works for GCM
alert('<li>MESSAGE -> MSGCNT: ' + e.payload.msgcnt + '</li>');
//Only works on Amazon Fire OS
alert('<li>MESSAGE -> TIME: ' + e.payload.timeStamp + '</li>');
break;
case 'error':
alert('<li>ERROR -> MSG:' + e.msg + '</li>');
break;
default:
alert('<li>EVENT -> Unknown, an event was received and we do not know what it is</li>');
break;
}
}
// iOS
function onNotificationAPN (event) {
if ( event.alert )
{
navigator.notification.alert(event.alert);
}
if ( event.sound )
{
var snd = new Media(event.sound);
snd.play();
}
if ( event.badge )
{
myPushNotification.setApplicationIconBadgeNumber(successHandler, errorHandler, event.badge);
}
}
// BlackBerry10
function pushNotificationHandler(pushpayload) {
var contentType = pushpayload.headers["Content-Type"],
id = pushpayload.id,
data = pushpayload.data;//blob
// If an acknowledgement of the push is required (that is, the push was sent as a confirmed push
// - which is equivalent terminology to the push being sent with application level reliability),
// then you must either accept the push or reject the push
if (pushpayload.isAcknowledgeRequired) {
// In our sample, we always accept the push, but situations might arise where an application
// might want to reject the push (for example, after looking at the headers that came with the push
// or the data of the push, we might decide that the push received did not match what we expected
// and so we might want to reject it)
pushpayload.acknowledge(true);
}
}
function tokenHandler(result){
// Your iOS push server needs to know the token before it can push to this device
// here is where you might want to send it the token for later use.
//alert('device token = ' + result);
$.post('http://www.my_webaddress.com/action/device',
{
device:result
}, function(res){
alert(res);
});
}
//When HTML document is finished loading. Jquery should be available
function documentReady(){
$(function(){
alert('Jquery loaded');
});
}
app.initialize();
这是我的config.xml
<?xml version='1.0' encoding='utf-8'?>
<widget id="io.cordova.hellocordova" version="0.0.5" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
<name>HelloCordova</name>
<description>
A sample Apache Cordova application that responds to the deviceready event.
</description>
<author email="dev@cordova.apache.org" href="http://cordova.io">
Apache Cordova Team
</author>
<content src="index.html" />
<access origin="*" />
<plugin name="Device" value="org.apache.cordova.Device" />
<feature name="Device">
<param name="android-package" value="org.apache.cordova.device.Device" />
</feature>
<feature name="Device">
<param name="ios-package" value="CDVDevice" />
</feature>
<feature name="PushPlugin">
<param name="ios-package" value="com.phonegap.plugins.PushPlugin" />
</feature>
<preference name="BackupWebStorage" value="local" />
</widget>
答案 0 :(得分:7)
您需要先安装设备cordova插件。
https://github.com/apache/cordova-plugin-device
命令
cordova plugin add https://github.com/apache/cordova-plugin-device
答案 1 :(得分:2)
是的,我尝试过ofc diddn工作。我发现问题在于你需要先编译ios插件才能使用它。这在Windows机器上根本不可能。 某些东西(Windows用户)需要考虑。