cordova pushplugin无法在iOS中获取设备令牌
cordova pushplugin can't get device token in iOS
我正在尝试使用pushplugin https://github.com/phonegap-build/PushPlugin在cordova/phonegap应用程序上添加推送通知
我安装了插件
cordova plugin add https://github.com/phonegap-build/PushPlugin.git
它似乎是工作的,因为当我第一次在我的设备(iPhone 5)上运行应用程序时,它说"你的应用程序想要向你发送通知bla bla…",但后来我没有得到设备令牌:它现在应该显示一个警报。
我是这样编辑cordova创建的默认index.js的:
var pushNotification;
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');
// var pushNotification;
$("#app-status-ul").append('<li>deviceready event received</li>');
document.addEventListener("backbutton", function(e)
{
$("#app-status-ul").append('<li>backbutton event received</li>');
if( $("#home").length > 0)
{
// call this to get a new token each time. don't call it to reuse existing token.
//pushNotification.unregister(successHandler, errorHandler);
e.preventDefault();
navigator.app.exitApp();
}
else
{
navigator.app.backHistory();
}
}, false);
try
{
pushNotification = window.plugins.pushNotification;
$("#app-status-ul").append('<li>registering ' + device.platform + '</li>');
if (device.platform == 'android' || device.platform == 'Android' ||
device.platform == 'amazon-fireos' ) {
pushNotification.register(successHandler, errorHandler, {"senderID":"661780372179","ecb":"onNotification"}); // required!
} else {
pushNotification.register(tokenHandler, errorHandler, {"badge":"true","sound":"true","alert":"true","ecb":"onNotificationAPN"}); // required!
}
}
catch(err)
{
txt="There was an error on this page.'n'n";
txt+="Error description: " + err.message + "'n'n";
alert(txt);
}
// handle APNS notifications for iOS
function onNotificationAPN(e) {
if (e.alert) {
$("#app-status-ul").append('<li>push-notification: ' + e.alert + '</li>');
// showing an alert also requires the org.apache.cordova.dialogs plugin
navigator.notification.alert(e.alert);
}
if (e.sound) {
// playing a sound also requires the org.apache.cordova.media plugin
var snd = new Media(e.sound);
snd.play();
}
if (e.badge) {
pushNotification.setApplicationIconBadgeNumber(successHandler, e.badge);
}
}
// handle GCM notifications for Android
function onNotification(e) {
$("#app-status-ul").append('<li>EVENT -> RECEIVED:' + e.event + '</li>');
switch( e.event )
{
case 'registered':
if ( e.regid.length > 0 )
{
$("#app-status-ul").append('<li>REGISTERED -> REGID:' + e.regid + "</li>");
// 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)
{
$("#app-status-ul").append('<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.
// playing a sound also requires the org.apache.cordova.media plugin
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)
$("#app-status-ul").append('<li>--COLDSTART NOTIFICATION--' + '</li>');
else
$("#app-status-ul").append('<li>--BACKGROUND NOTIFICATION--' + '</li>');
}
$("#app-status-ul").append('<li>MESSAGE -> MSG: ' + e.payload.message + '</li>');
//android only
$("#app-status-ul").append('<li>MESSAGE -> MSGCNT: ' + e.payload.msgcnt + '</li>');
//amazon-fireos only
$("#app-status-ul").append('<li>MESSAGE -> TIMESTAMP: ' + e.payload.timeStamp + '</li>');
break;
case 'error':
$("#app-status-ul").append('<li>ERROR -> MSG:' + e.msg + '</li>');
break;
default:
$("#app-status-ul").append('<li>EVENT -> Unknown, an event was received and we do not know what it is</li>');
break;
}
}
function tokenHandler (result) {
$("#app-status-ul").append('<li>token: '+ result +'</li>');
// 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(result);
}
function successHandler (result) {
$("#app-status-ul").append('<li>success:'+ result +'</li>');
}
function errorHandler (error) {
$("#app-status-ul").append('<li>error:'+ error +'</li>');
}
document.addEventListener('deviceready', onDeviceReady, true);
},
// 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;');
console.log('Received Event: ' + id);
}
};
app.initialize();
在index.html我没有做任何改变…只是添加了最后两个。js文件,就像例子中一样,即使index.html几乎是空的
<!DOCTYPE html>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<html>
<head>
<!--
Customize this policy to fit your own app's needs. For more guidance, see:
https://github.com/apache/cordova-plugin-whitelist/blob/master/README.md#content-security-policy
Some notes:
* gap: is required only on iOS (when using UIWebView) and is needed for JS->native communication
* https://ssl.gstatic.com is required only on Android and is needed for TalkBack to function properly
* Disables use of inline scripts in order to mitigate risk of XSS vulnerabilities. To change this:
* Enable inline JS: add 'unsafe-inline' to default-src
-->
<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *">
<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, width=device-width">
<link rel="stylesheet" type="text/css" href="css/index.css">
<title>Hello World</title>
</head>
<body>
<script type="text/javascript">
// var pushNotification;
</script>
<div class="app">
<h1>Apache Cordova</h1>
</div>
<script type="text/javascript" src="cordova.js"></script>
<script type="text/javascript" src="js/index.js"></script>
<script type="text/javascript" charset="utf-8" src="js/jquery_1.5.2.min.js"></script>
<script type="text/javascript" src="js/PushNotification.js"></script>
</body>
</html>
我甚至不确定我添加了var pushNotification和所有的功能在正确的地方…我对phonegap非常陌生,试图学习,但我找到的所有示例都与我制作新应用程序时创建的文件非常不同。
我也读到有一些问题与pushplugin和iOS 8,不知道他们是否已经解决了。谁能给我提点建议?
谢谢
您的index.js
都很好,您需要在index.html
中修复以下内容:
1:您不必自己包含PushNotifications.js
,因此删除<script type="text/javascript" src="js/PushNotification.js"></script>
,cordova.js
将自动包含所有插件js文件。
2:在index.js
之上包含jquery
脚本
3:在你的index.js中你有以下代码
if (device.platform == 'android' || device.platform == 'Android' ||
device.platform == 'amazon-fireos' ) {
这将给你错误,因为device
对象没有定义,实际上它是从设备插件导出的对象,所以运行命令
安装这个插件cordova plugin add cordova-plugin-device
4:还要在index.html中添加<ul id="app-status-ul"></ul>
,这样您就可以看到结果。
做这些改变,你的代码将完美地工作。
- 使用Javascript获取Twitter访问令牌
- Phonegap:获取访问令牌时出现LinkedIn登录错误
- 如何安全地获取&使用Facebook应用程序访问令牌发送通知使用PHP&Javascript
- 如何获取登录用户的twitter oAuth令牌
- 如何使用密码和用户名从 bitly 获取访问令牌
- 获取意外的令牌ILLEGAL JS错误
- Axios CORS 问题与 Github oauth 未获取访问令牌
- 在angularjs或nodejs中获取Pocket访问令牌
- jQuery令牌输入轨道获取错误Uncaught TypeError:Object[Object Object]没有方法
- 如何通过AngularJS$http从ASP.Net Web API 2获取访问令牌
- 正在外部js文件中获取CSRF令牌
- 获取错误SyntaxError:意外的令牌<djangojquery文件上传
- 从JavaScript代码中获取令牌
- 如何获取用户访问令牌,与图形 API 资源管理器中使用的令牌相同
- 尝试用 JSON 编写函数,在函数调用中获取“意外令牌”
- 使用 Chrome 扩展程序内容脚本从 localStorage 中获取令牌值
- 没有从ion-push.register获取令牌
- 在Azure AD B2C中获取令牌时出现CORS问题(隐含流)
- 在json中获取令牌的正则表达式
- 在获取令牌期间重定向至m.box.com.没有任何象征性的回应