ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Android:如何使用Parse作为替代GCM推送通知提供程序?

2019-10-06 07:24:57  阅读:141  来源: 互联网

标签:parse-platform android push-notification google-cloud-messaging


在问题的最后看SEIT EDIT#2(Google更新了push的实现方式,因此更容易处理gcm和解析)

我已经在应用程序中使用GCM,我想添加解析作为替代方案.这就是我现在拥有的(所有权限都被正确声明):

<service 
   android:name="com.mypackagename.GCMIntentService" 
   android:enabled="true" />
<receiver 
   android:name="com.google.android.gcm.GCMBroadcastReceiver" 
   android:permission="com.google.android.c2dm.permission.SEND" >
   <intent-filter>
       <action android:name="com.google.android.c2dm.intent.RECEIVE" />
       <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
       <category android:name="com.mypackagename.GCMIntentService" />
   </intent-filter>
</receiver>

‘GCMIntentService'(继承自’GCMBaseIntentService’)类处理服务器注册和接收消息 – 它工作正常并且接收到所有推送消息.服务器有时会发送自定义数据,因此我自己处理消息并以编程方式创建通知(单击通知时使用的意图具有从服务器发送的一些重要附加功能).

我想以某种方式使解析行为以相同的方式,以便能够从解析网站发送频道推送并创建我自己的通知,但我尝试的一切都失败(遵循Android推送教程不是真的为我的问题工作).是否有人尝试过类似的东西?在花了很多时间调整推送指南/教程之后,我有点想法 – 有时候我没有收到任何通知;有时解析和我的接收器都被调用,我得到双重通知.我也尝试使用解析REST apis注册并自己处理所有内容,但发现它在Android上是不可能的.

那么,我怎样才能处理解析推送和传统的gcm推送(使用我的服务器),这样我就可以访问这两个通知,并且我可以从头开始构建它们(使用所需的附加功能创建我自己的待处理通知)?

编辑#1:

我尝试的第一件事是使用解析服务并有一个广播接收器来处理GCM消息:

AndroidMaifest.xml:

<service 
    android:name="com.mypackagename.GCMIntentService" 
    android:enabled="true" />
<service android:name="com.parse.PushService"
    android:enabled="true"/>
<receiver 
    android:name="com.google.android.gcm.GCMBroadcastReceiver" 
    android:permission="com.google.android.c2dm.permission.SEND" >
        <intent-filter>
        <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
        <category android:name="com.mypackagename.GCMIntentService" />
    </intent-filter>
</receiver>

并且解析库需要以下初始化:

Parse.initialize(context, appId, apiKey);
PushService.setDefaultPushCallback(context, MainActivity.class);
// I'm subscribing to channel push because I send channel pushes from the
// parse console
PushService.subscribe(context, MDConstants.PARSE_PUSH_CHANNEL, MainActivity.class);
ParseInstallation.getCurrentInstallation().saveInBackground();

问题是我收到了来自我的其他提供者的通知但是我没有从parse收到任何内容(声明了所有权限)并且我从解析库中收到以下错误(当收到错误时,解析注册没有正确完成 – 我在解析控制台中看不到我的设备:

E/com.parse.ManifestInfo(11677): Cannot use GCM for push because the app manifest is missing some required declarations. Please make sure that these permissions are declared as children of the root <manifest> element:
E/com.parse.ManifestInfo(11677): 
E/com.parse.ManifestInfo(11677): <uses-permission android:name="android.permission.INTERNET" />
E/com.parse.ManifestInfo(11677): <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
E/com.parse.ManifestInfo(11677): <uses-permission android:name="android.permission.VIBRATE" />
E/com.parse.ManifestInfo(11677): <uses-permission android:name="android.permission.WAKE_LOCK" />
E/com.parse.ManifestInfo(11677): <uses-permission android:name="android.permission.GET_ACCOUNTS" />
E/com.parse.ManifestInfo(11677): <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
E/com.parse.ManifestInfo(11677): <permission android:name="com.mypackagename.permission.C2D_MESSAGE" android:protectionLevel="signature" />
E/com.parse.ManifestInfo(11677): <uses-permission android:name="com.mypackagename.permission.C2D_MESSAGE" />
E/com.parse.ManifestInfo(11677): 
E/com.parse.ManifestInfo(11677): Also, please make sure that these services and broadcast receivers are declared as children of the <application> element:
E/com.parse.ManifestInfo(11677): 
E/com.parse.ManifestInfo(11677): <service android:name="com.parse.PushService" />
E/com.parse.ManifestInfo(11677): <receiver android:name="com.parse.GcmBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND">
E/com.parse.ManifestInfo(11677):   <intent-filter>
E/com.parse.ManifestInfo(11677):     <action android:name="com.google.android.c2dm.intent.RECEIVE" />
E/com.parse.ManifestInfo(11677):     <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
E/com.parse.ManifestInfo(11677):     <category android:name="com.mypackagename" />
E/com.parse.ManifestInfo(11677):   </intent-filter>
E/com.parse.ManifestInfo(11677): </receiver>
E/com.parse.PushService(11677): Tried to use push, but this app is not configured for push due to: Push is not configured for this app because the app manifest is missing required declarations. Please add the following declarations to your app manifest to support either GCM or PPNS for push (or both). To enable GCM support, please make sure that these permissions are declared as children of the root <manifest> element:
E/com.parse.PushService(11677): 
E/com.parse.PushService(11677): <uses-permission android:name="android.permission.INTERNET" />
E/com.parse.PushService(11677): <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
E/com.parse.PushService(11677): <uses-permission android:name="android.permission.VIBRATE" />
E/com.parse.PushService(11677): <uses-permission android:name="android.permission.WAKE_LOCK" />
E/com.parse.PushService(11677): <uses-permission android:name="android.permission.GET_ACCOUNTS" />
E/com.parse.PushService(11677): <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
E/com.parse.PushService(11677): <permission android:name="com.mypackagename.permission.C2D_MESSAGE" android:protectionLevel="signature" />
E/com.parse.PushService(11677): <uses-permission android:name="com.mypackagename.permission.C2D_MESSAGE" />
E/com.parse.PushService(11677): 
E/com.parse.PushService(11677): Also, please make sure that these services and broadcast receivers are declared as children of the <application> element:
E/com.parse.PushService(11677): 
E/com.parse.PushService(11677): <service android:name="com.parse.PushService" />
E/com.parse.PushService(11677): <receiver android:name="com.parse.GcmBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND">
E/com.parse.PushService(11677):   <intent-filter>
E/com.parse.PushService(11677):     <action android:name="com.google.android.c2dm.intent.RECEIVE" />
E/com.parse.PushService(11677):     <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
E/com.parse.PushService(11677):     <category android:name="com.mypackagename" />
E/com.parse.PushService(11677):   </intent-filter>
E/com.parse.PushService(11677): </receiver>
E/com.parse.PushService(11677): To enable PPNS support, please make sure that these permissions are declared as children of the root <manifest> element:
E/com.parse.PushService(11677): 
E/com.parse.PushService(11677): <uses-permission android:name="android.permission.INTERNET" />
E/com.parse.PushService(11677): <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
E/com.parse.PushService(11677): <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
E/com.parse.PushService(11677): <uses-permission android:name="android.permission.VIBRATE" />
E/com.parse.PushService(11677): <uses-permission android:name="android.permission.WAKE_LOCK" />
E/com.parse.PushService(11677): 
E/com.parse.PushService(11677): Also, please make sure that these services and broadcast receivers are declared as children of the <application> element:
E/com.parse.PushService(11677): 
E/com.parse.PushService(11677): <service android:name="com.parse.PushService" />
E/com.parse.PushService(11677): <receiver android:name="com.parse.ParseBroadcastReceiver">
E/com.parse.PushService(11677):   <intent-filter>
E/com.parse.PushService(11677):     <action android:name="android.intent.action.BOOT_COMPLETED" />
E/com.parse.PushService(11677):     <action android:name="android.intent.action.USER_PRESENT" />
E/com.parse.PushService(11677):   </intent-filter>
E/com.parse.PushService(11677): </receiver>

编辑#2:

我更新了基于google push notification developer guide处理gcm push的方式.在实现扩展’GcmListenerService’的类时,您现在可以轻松检查’from’参数是否与用于注册推送的google项目ID相同.

public class MyGcmListenerService extends GcmListenerService {
    @Override
    public void onMessageReceived(String from, Bundle data) {
        // only handle gcm messages that come from the same project id used to register
        if (from.equals("Your google project id)) {
            // handle the gcm push
        }
    }
}

另外,解析更新了它们的库(我现在正在使用’1.9.4′)你可以继承’ParsePushBroadcastReceiver’来处理你想要的通知.有关基本实现,请参见指南here.

在’Application’类的’onCreate’方法中解析初始化:

Parse.initialize(this, "your parse app id", "your parse client key");

// subscribing to a channel
ParsePush.subscribeInBackground("your channel name", new SaveCallback() {
    @Override
    public void done(ParseException e) {
        if (e == null) {
            Log.d("com.parse.push", "successfully subscribed to the broadcast channel.");
        } else {
            Log.e("com.parse.push", "failed to subscribe for push");
        }
    }
});

广播接收器实现:

public class MyParsePushBroadcastReceiver extends ParsePushBroadcastReceiver {
    @Override
    protected void onPushReceive(Context context, Intent intent) {
        // handle the parse push notification
    }
}

解析和gcm的清单声明:

...

<!-- GCM listener service -->
<service
    android:name=".MyGcmListenerService"
    android:exported="false" >
    <intent-filter>
        <action android:name="com.google.android.c2dm.intent.RECEIVE" />
    </intent-filter>
</service>

...

<!-- Parse broadcast receiver -->
<receiver android:name=".MyParsePushBroadcastReceiver" android:exported="false">
    <intent-filter>
        <action android:name="com.parse.push.intent.RECEIVE" />
        <action android:name="com.parse.push.intent.DELETE" />
        <action android:name="com.parse.push.intent.OPEN" />
    </intent-filter>
</receiver>

...

我只添加了服务和接收器,但您需要确保遵循GCM指南和Parse推送指南以实现完整实现(例如,谷歌还添加了一种处理令牌刷新的方法 – 包含完整代码的示例样品可以找到here).

解决方法:

如果我理解正确,您希望您的代码处理所有传入的GCM消息,无论其来源(可以是您的服​​务器或Parse网站),这意味着您不希望应用程序中的Parse代码处理它们.

您可以通过在清单中仅声明处理com.google.android.c2dm.intent.RECEIVE操作的单个广播接收器来实现此目的.那将是你的GCMBroadcastReceiver类,它将处理所有到达的GCM消息.

当您声明处理相同操作的两个广播接收器时,可能会发生您当前遇到的行为.

标签:parse-platform,android,push-notification,google-cloud-messaging
来源: https://codeday.me/bug/20191006/1859313.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有