【问题标题】:Permissions to include in Android Manifest for GCM Push Notifications包含在 GCM 推送通知的 Android 清单中的权限
【发布时间】:2014-07-18 07:28:18
【问题描述】:

我正在尝试开发一个跨平台应用程序,它将接收来自 Amazon SNS 的推送通知。推送通知在 iOS 上运行良好,但在 Android 上,我目前处于十字路口。

当 Android 应用被聚焦时,推送通知是可见的。但是,无论我设置了哪些与 ti.cloudpush 相关的变量(如下所列)。

问题是 - 我无法让推送通知显示在通知托盘中。

CloudPush.showAppOnTrayClick    = true;
CloudPush.showTrayNotification  = true;
CloudPush.showTrayNotificationsWhenFocused= false;
CloudPush.singleCallback        =  true;

我想这与我可能必须在 tiapp.xml 中为 Android Manifest 部分设置的权限有关。我在下面包含了当前使用的权限列表 -

<android xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-sdk>14</uses-sdk>&gt;
    <manifest>
        <uses-sdk android:minSdkVersion="14"/>
        <permission android:name="com.test.push.permission.C2D_MESSAGE" android:protectionLevel="signature"/>
        <uses-permission android:name="com.test.push.permission.C2D_MESSAGE"/>
        <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/>
        <uses-permission android:name="android.permission.WAKE_LOCK"/>
        <uses-permission android:name="android.permission.VIBRATE"/>
        <uses-permission android:name="android.permission.INTERNET"/>
        <uses-permission android:name="android.permission.GET_ACCOUNTS"/>
        <uses-permission android:name="android.permission.USE_CREDENTIALS"/>
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
        <application>
            <receiver
                android:name="com.google.android.gcm.GCMBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND">
                <!-- Start receiver on boot -->
                <intent-filter>
                    <action android:name="android.intent.action.BOOT_COMPLETED"/>
                    <action android:name="android.intent.action.USER_PRESENT"/>
                    <category android:name="android.intent.category.HOME"/>
                </intent-filter>
                <!-- Receive the actual message -->
                <intent-filter>
                    <action android:name="com.google.android.c2dm.intent.RECEIVE"/>
                    <category android:name="com.test.push"/>
                </intent-filter>
                <!-- Receive the registration id -->
                <intent-filter>
                    <action android:name="com.google.android.c2dm.intent.REGISTRATION"/>
                    <category android:name="com.test.push.permission"/>
                </intent-filter>
            </receiver>
        </application>
    </manifest>
</android>

有人可以告诉我我做错了什么/如何解决这个问题?

任何与信息/权限相关的链接将不胜感激。

【问题讨论】:

  • 您的实际问题是什么?具体
  • 你有什么错误吗?如果是,请发布。
  • 对不起,如果我含糊其辞。我已经强调了上面的问题。请分享您的想法。

标签: android titanium titanium-mobile google-cloud-messaging appcelerator-mobile


【解决方案1】:

试试这个代码:

app.js 类:

/*
 Push notifications through device token.
 Steps : 
 1) Retrieve device token
 2) Subscribe for receiving notifications
 3) Notify
 4) Unsubscribe from receiving notifications
*/

 Titanium.UI.setBackgroundColor('#000');

var GcmWin = Ti.UI.createWindow({
  backgroundColor : '#ccc',
  title : 'Android Cloud Push Notification'
});

var CloudPush = require('ti.cloudpush');
CloudPush.debug = true;
CloudPush.enabled = true;
CloudPush.showTrayNotificationsWhenFocused = true;
CloudPush.focusAppOnPush = false;

var deviceToken;
var Cloud = require('ti.cloud');
Cloud.debug = true;

var submit = Ti.UI.createButton({
  title : 'Retrieve Device token',
  color : '#000',
  height : 80,
  width : 200,
  top : 50
});

var subscribe = Ti.UI.createButton({
  title : 'Subscribe',
  color : '#000',
  height : 80,
  width : 200,
  top : 150
});
subscribe.addEventListener('click', subscribeToChannel);
GcmWin.add(subscribe);

var notify = Ti.UI.createButton({
  title : 'Notify',
  color : '#000',
  height : 80,
  width : 200,
  top : 250
});
notify.addEventListener('click', sendTestNotification);
GcmWin.add(notify);

var unsubscribe = Ti.UI.createButton({
  title : 'Unsubscribe',
  color : '#000',
  height : 80,
  width : 200,
  top : 350
});
unsubscribe.addEventListener('click', unsubscribeToChannel);
GcmWin.add(unsubscribe);

GcmWin.add(submit);

submit.addEventListener('click', function(e) {
CloudPush.retrieveDeviceToken({
    success : function deviceTokenSuccess(e) {
        alert('Device Token: ' + e.deviceToken);
        deviceToken = e.deviceToken;

    },
    error : function deviceTokenError(e) {
        alert('Failed to register for push! ' + e.error);
    }
 });
});

function subscribeToChannel() {
 // Subscribes the device to the 'test' channel
 // Specify the push type as either 'android' for Android or 'ios' for iOS
 Cloud.PushNotifications.subscribeToken({
    device_token : deviceToken,
    channel : 'test',
    type : Ti.Platform.name == 'android' ? 'android' : 'ios'
 }, function(e) {
    if (e.success) {
        alert('Subscribed');
    } else {
        alert('Error:\n' + ((e.error && e.message) || JSON.stringify(e)));
    }
});
}

function sendTestNotification() {
// Sends an 'This is a test.' alert to specified device if its subscribed to the 'test'  channel.
 Cloud.PushNotifications.notifyTokens({
    to_tokens : deviceToken,
    channel : 'test',
    payload : 'This is a test.'
 }, function(e) {
    if (e.success) {
        alert('Push notification sent');
    } else {
        alert('Error:\n' + ((e.error && e.message) || JSON.stringify(e)));
    }
});
}

function unsubscribeToChannel() {
// Unsubscribes the device from the 'test' channel
Cloud.PushNotifications.unsubscribeToken({
    device_token : deviceToken,
    channel : 'test',
}, function(e) {
    if (e.success) {
        alert('Unsubscribed');
    } else {
        alert('Error:\n' + ((e.error && e.message) || JSON.stringify(e)));
    }
});
}

CloudPush.addEventListener('callback', function(evt) {
 //alert(evt);
 alert(evt.payload);
});

CloudPush.addEventListener('trayClickLaunchedApp', function(evt) {
 Ti.API.info('Tray Click Launched App (app was not running)');
 //alert('Tray Click Launched App (app was not running');
});

CloudPush.addEventListener('trayClickFocusedApp', function(evt) {
 Ti.API.info('Tray Click Focused App (app was already running)');
 //alert('Tray Click Focused App (app was already running)');
});

tiapp.xml 中只需检查以下几行。添加它,如果不存在:

 <modules>
    <module platform="commonjs">ti.cloud</module>
    <module platform="android">ti.cloudpush</module>
</modules>

这对我有用。希望这会有所帮助。

【讨论】:

  • 嗨,悉达多。谢谢您的答复。我最初使用的逻辑与您的回答状态相同。但是,应用程序会在收到推送通知时崩溃。由于错误是 -无法实例化接收器 java.lang.ClassNotFoundException 在研究中我发现以下链接帮助我在应用程序集中时让我的推送通知正常工作。 [link]stackoverflow.com/questions/9601373/…你的代码是否在android通知托盘中显示通知?
  • 能否请您发布错误日志详细信息。此解决方案适用于我。
  • 是的,此代码适用于 android 通知托盘。试一试。我使用的是 3.2.1 GA 版本。
  • 我目前使用 SDK 3.2.3 GA。有同样的想法吗?它适用于哪个 SDK 版本?
  • @FlyingV:你用的是什么cloudpush版本?
猜你喜欢
  • 2016-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-24
  • 1970-01-01
  • 2021-11-10
  • 2018-09-01
相关资源
最近更新 更多