Appcelerator/Titanium:无法向 Android 发送推送通知
Appcelerator/ Titanium: Cannot send push notification to Android
我希望能够在 Android 上使用 Titanium 和 Arrow Push 发送推送通知。
我已按照此处的说明进行操作:
Subscribing to push notifications
我的简单代码如下所示:
var CloudPush = require('ti.cloudpush');
var deviceToken = null;
// Works fine
CloudPush.retrieveDeviceToken({
success: function () {
deviceToken = e.deviceToken;
alert('deviceToken: ' + deviceToken);
subscribeToChannel();
},
error: function () {
alert('Failed to register for push notifications! ' + e.error);
}
});
// Never runs!!!
CloudPush.addEventListener('callback', function (evt) {
Ti.API.info('New notification!');
alert("Notification received: " + evt.payload);
});
// Works fine
function subscribeToChannel () {
Cloud.PushNotifications.subscribeToken({
device_token: deviceToken,
channel: 'general',
type: Ti.Platform.name
}, function (e) {
if (e.success) {
alert('Subscribed');
} else {
alert('Error:\n' + ((e.error && e.message) || JSON.stringify(e)));
}
});
}
以上大部分代码与文档类似。代码的订阅方面似乎工作得很好,因为用户的设备也出现在 Appcelerator 仪表板的设备部分。
然而,当涉及到从 Appcelerator 仪表板发送 通知时,“失败”一词出现在我的 Android 设备旁边。
突出显示“?”时的完整错误消息图标如下:
Exception Type: GCM; Error Code: 3103; Error Message:
RegistrationId(s) is null or empty; Catched Exception: argument cannot
be null
我在 http://docs.appcelerator.com/arrowdb/latest/#!/guide/troubleshooting 上查看了这个错误,它只是说:
The GCM client provided a null or empty registration ID. This error is
uncommon if you are using the Modules.CloudPush module.
这没有帮助。
我做错了什么?这是加速器端的错误吗?
我算不上推送方面的专家,但我将您拥有的与我在我的一个应用程序中拥有的进行了比较。
很确定您需要将 deviceToken 发送到 subscribeToChannel 函数中。
尝试改变这个 -
function subscribeToChannel () {
到这个-
function subscribeToChannel (deviceToken) {
然后在此处将令牌添加到调用中 -
subscribeToChannel (deviceToken);
让我知道这是否适合你。
-乔恩
在subscribeToChannel()
函数中,你应该使用type : 'gcm'
而不是type: Ti.Platform.name
这是我为 Android 推送创建的 commonJS 模块:
function ACSPush(_callback) {
var debug_mode = true;
var Cloud = require('ti.cloud');
var CloudPush = require('ti.cloudpush');
CloudPush.enabled = true;
var deviceToken;
CloudPush.retrieveDeviceToken({
success : function deviceTokenSuccess(e) {
if(debug_mode)
Ti.API.info('Device Token: ' + e.deviceToken);
deviceToken = e.deviceToken;
if(Ti.App.Properties.getString("deviceToken") != deviceToken.toString()){
defaultSubscribe();
};
},
error : function deviceTokenError(e) {
if(debug_mode)
Ti.API.info('deviceTokenError.. :( ' + e.error);
}
});
function defaultSubscribe() {
Cloud.PushNotifications.subscribeToken({
channel : 'MyChannel',
device_token : deviceToken,
type : 'gcm'
}, function(e) {
if(e.success) {
if(debug_mode)
Ti.API.info("Success registerForPushNotifications");
Ti.App.Properties.setString("deviceToken", deviceToken.toString());
} else {
if(debug_mode)
Ti.API.info('Error:\n' + ((e.error && e.message) || JSON.stringify(e)));
};
});
};
CloudPush.addEventListener('callback', function(evt) {
var payload = JSON.parse(evt.payload);
if(debug_mode){
Ti.API.info("Received a push notification\nPayload:\n" + JSON.stringify(evt.payload));
Ti.API.info("payload: " + payload);
};
_callback(payload);
});
CloudPush.addEventListener('trayClickLaunchedApp', function(evt) {
if(debug_mode)
Ti.API.info('Tray Click Launched App (app was not running)');
});
CloudPush.addEventListener('trayClickFocusedApp', function(evt) {
if(debug_mode)
Ti.API.info('Tray Click Focused App (app was already running)');
});
};
module.exports = ACSPush;
很明显,你必须先配置Android推送服务http://docs.appcelerator.com/platform/latest/#!/guide/Configuring_push_services-section-src-37551713_Configuringpushservices-ConfiguringpushservicesforAndroiddevices
原来我的代码没问题。但是,我使用的凭据不正确。请在这里查看我的其他相关问题:
文档需要更新。
我希望能够在 Android 上使用 Titanium 和 Arrow Push 发送推送通知。
我已按照此处的说明进行操作:
Subscribing to push notifications
我的简单代码如下所示:
var CloudPush = require('ti.cloudpush');
var deviceToken = null;
// Works fine
CloudPush.retrieveDeviceToken({
success: function () {
deviceToken = e.deviceToken;
alert('deviceToken: ' + deviceToken);
subscribeToChannel();
},
error: function () {
alert('Failed to register for push notifications! ' + e.error);
}
});
// Never runs!!!
CloudPush.addEventListener('callback', function (evt) {
Ti.API.info('New notification!');
alert("Notification received: " + evt.payload);
});
// Works fine
function subscribeToChannel () {
Cloud.PushNotifications.subscribeToken({
device_token: deviceToken,
channel: 'general',
type: Ti.Platform.name
}, function (e) {
if (e.success) {
alert('Subscribed');
} else {
alert('Error:\n' + ((e.error && e.message) || JSON.stringify(e)));
}
});
}
以上大部分代码与文档类似。代码的订阅方面似乎工作得很好,因为用户的设备也出现在 Appcelerator 仪表板的设备部分。
然而,当涉及到从 Appcelerator 仪表板发送 通知时,“失败”一词出现在我的 Android 设备旁边。
突出显示“?”时的完整错误消息图标如下:
Exception Type: GCM; Error Code: 3103; Error Message: RegistrationId(s) is null or empty; Catched Exception: argument cannot be null
我在 http://docs.appcelerator.com/arrowdb/latest/#!/guide/troubleshooting 上查看了这个错误,它只是说:
The GCM client provided a null or empty registration ID. This error is uncommon if you are using the Modules.CloudPush module.
这没有帮助。
我做错了什么?这是加速器端的错误吗?
我算不上推送方面的专家,但我将您拥有的与我在我的一个应用程序中拥有的进行了比较。
很确定您需要将 deviceToken 发送到 subscribeToChannel 函数中。
尝试改变这个 -
function subscribeToChannel () {
到这个-
function subscribeToChannel (deviceToken) {
然后在此处将令牌添加到调用中 -
subscribeToChannel (deviceToken);
让我知道这是否适合你。
-乔恩
在subscribeToChannel()
函数中,你应该使用type : 'gcm'
而不是type: Ti.Platform.name
这是我为 Android 推送创建的 commonJS 模块:
function ACSPush(_callback) {
var debug_mode = true;
var Cloud = require('ti.cloud');
var CloudPush = require('ti.cloudpush');
CloudPush.enabled = true;
var deviceToken;
CloudPush.retrieveDeviceToken({
success : function deviceTokenSuccess(e) {
if(debug_mode)
Ti.API.info('Device Token: ' + e.deviceToken);
deviceToken = e.deviceToken;
if(Ti.App.Properties.getString("deviceToken") != deviceToken.toString()){
defaultSubscribe();
};
},
error : function deviceTokenError(e) {
if(debug_mode)
Ti.API.info('deviceTokenError.. :( ' + e.error);
}
});
function defaultSubscribe() {
Cloud.PushNotifications.subscribeToken({
channel : 'MyChannel',
device_token : deviceToken,
type : 'gcm'
}, function(e) {
if(e.success) {
if(debug_mode)
Ti.API.info("Success registerForPushNotifications");
Ti.App.Properties.setString("deviceToken", deviceToken.toString());
} else {
if(debug_mode)
Ti.API.info('Error:\n' + ((e.error && e.message) || JSON.stringify(e)));
};
});
};
CloudPush.addEventListener('callback', function(evt) {
var payload = JSON.parse(evt.payload);
if(debug_mode){
Ti.API.info("Received a push notification\nPayload:\n" + JSON.stringify(evt.payload));
Ti.API.info("payload: " + payload);
};
_callback(payload);
});
CloudPush.addEventListener('trayClickLaunchedApp', function(evt) {
if(debug_mode)
Ti.API.info('Tray Click Launched App (app was not running)');
});
CloudPush.addEventListener('trayClickFocusedApp', function(evt) {
if(debug_mode)
Ti.API.info('Tray Click Focused App (app was already running)');
});
};
module.exports = ACSPush;
很明显,你必须先配置Android推送服务http://docs.appcelerator.com/platform/latest/#!/guide/Configuring_push_services-section-src-37551713_Configuringpushservices-ConfiguringpushservicesforAndroiddevices
原来我的代码没问题。但是,我使用的凭据不正确。请在这里查看我的其他相关问题:
文档需要更新。