Azure上的解析服务器不会为Android设备保存deviceToken

时间:2016-10-20 23:53:16

标签: android ios parsing azure notifications

我在Azure通知中心上设置了一个新的Parse Server,以便从托管的Parse.com服务转移。我能够在我们的应用程序中安装Parse Server iOS框架,并让Azure Parse Server在用户登录应用程序时保存用户的信息(包括deviceToken)。 [随后当我们的Windows应用程序向Parse Server API发送推送请求时,Parse服务器会触发sendPush方法,然后能够成功向该用户发送推送通知。]但是我在Android中实现通知时遇到了问题应用程序。 虽然Android应用程序能够使用Parse Server框架(1.13.1)与Azure Parse Server通信并在安装中创建记录,但它似乎没有保存deviceToken以及后续尝试向该用户发送推送通知从Parse Server API上的应用程序确实显示在代码为200的解析服务器日志中,但在Android手机上从未看到通知。 我按照Microsoft的说明使用FCM(Firebase Communications Manager)设置Azure Parse Server: https://azure.microsoft.com/en-us/documentation/articles/notification-hubs-android-push-notification-google-fcm-get-started/ (这些说明的一部分说设置<receiver />名为com.microsoft.windowsazure.notifications.NotificationsBroadcastReceiver,但是在Google的迁移到FCM说明中,他们说“com.google.android.gms.gcm.GcmReceiver”自动添加“所以我不清楚Azure Parse Server通知应该是什么接收器。” 我使用FCM是因为谷歌似乎已经弃用了旧的GCM。我不知道Parse服务器是否无法以预期获取GCM令牌的方式获取FCM令牌。具体来说,这是我用来保存安装在onSuccess方法中的代码,该方法在用户成功登录到[non-Parse] App帐户后触发[因此找出了他们的mainUserName是什么]:

ParseInstallation.getCurrentInstallation().put("user", mainUserName);
ParseInstallation.getCurrentInstallation().put("username", mainUserName);

ParseInstallation.getCurrentInstallation().saveInBackground();

此代码在已经获取FCM令牌后运行 - 我可以在我的日志中看到它成功。在RegistrationIntentService类中,在onHandleIntent方法内,代码包含对FirebaseInstanceId的请求:

String FCM_token = FirebaseInstanceId.getInstance().getToken();

然后向Azure通知中心发出请求:

NotificationHub hub = new NotificationHub(NotificationSettings.HubName,
                    NotificationSettings.HubListenConnectionString, this);

regID = hub.register(FCM_token).getRegistrationId();

然后存储此数据,以便稍后在方法结束时的sharedPreferences中使用:

sharedPreferences.edit().putString("registrationID", regID ).apply();
sharedPreferences.edit().putString("FCMtoken", FCM_token ).apply();

让我感到困惑的是,我可以使用Notificaton Hub“测试发送”功能从Azure后端在我的Android设备上接收测试推送通知,但无法接收来自Parse服务器的通知。我认为这可能是由于deviceToken未保存到_Installation。我尝试使用.put方法添加FCM_token,但Parse服务器响应不允许这样做。 Android应用程序如何与Azure上的Parse框架和Parse服务器进行交互,以便实际保存deviceToken?

1 个答案:

答案 0 :(得分:2)

问题中发布的代码是必要但不充分的:为了成功注册FCM并获取设备令牌,AndroidManifest <application />标记必须包含多个<service />和{{1这两个元素都配置FCM并允许其消息到达设备。

在问题中链接的Azure文章中,Microsoft说要添加一些,但没有提到我发现的所有这些元素,以便Parse通知能够工作:

<receiver />

您需要将<service android:name=".MyInstanceIDService"> <intent-filter> <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/> </intent-filter> </service> <service android:name="<your.app.name>.RegistrationIntentService" android:exported="false"> </service> <receiver android:name="com.microsoft.windowsazure.notifications.NotificationsBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND"> <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> <category android:name="<your.package.name>" /> </intent-filter> </receiver> <meta-data android:name="com.parse.push.gcm_sender_id" android:value="id:<your-FCM-sender-id>" /> <service android:name="com.parse.PushService" /> <receiver android:name="com.parse.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="<your.package.name>" /> </intent-filter> </receiver> <receiver android:name="com.parse.ParsePushBroadcastReceiver" android:exported="false"> <intent-filter> <action android:name="com.parse.push.intent.RECEIVE" /> <action android:name="com.parse.push.intent.OPEN" /> <action android:name="com.parse.push.intent.DELETE" /> </intent-filter> </receiver>更改为应用的套餐名称,并将<your.package.name>更改为您在项目设置下的应用的Google Firebase控制台中找到的发件人ID - &gt;云消息传递。

在我的雇主i1Biometrics从Parse.com转移到Azure Hub的过程中,我们设置了simplistic demo Android app called Kirkland以模拟如何使用Parse服务器设置应用程序Azure上。上面的代码片段取自它,您可以查看整个AndroidManifest文件以查看整个上下文。