解析服务器(自托管)不使用 FCM 发送 android 通知

Posted

技术标签:

【中文标题】解析服务器(自托管)不使用 FCM 发送 android 通知【英文标题】:Parse server (self hosted) not sending android notification with FCM 【发布时间】:2017-06-13 11:10:41 【问题描述】:

您好,我在数字海洋上有自托管解析服务器,它在 ios 上发送通知,但在 android 上不发送。我的 index.js 文件如下所示:

var api = new ParseServer(
  databaseURI: databaseUri || 'mongodb://1.1.1.1"1/app_name',
  cloud: process.env.CLOUD_CODE_MAIN || __dirname + '/cloud/main.js',
  appId: 'abc',
  masterKey: 'def', 
  serverURL: 'http://1.1.1.1:1337/parse' || 'http://localhost:1337/parse',  
  verbose: true,
  push: 
    android:
      senderId: 'my FCM id',
      apiKey: 'my FCM key'
    ,
    ios: 
      pfx: '1',
      bundleId: '2',
      production: true
    
  
);

当我从解析仪表板(也是自托管的)发送推送时,这是我得到的响应 verbose:true:

"results": [
  
    "objectId": "bNtZqwY8",
    "pushTime": "2017-06-13T10:49:06.095Z",
    "query": "\"UniqueId\":\"c49de788ce\",\"deviceType\":\"$in\":[\"android\"]",
    "payload": "\"alert\":\"Thank you for using my app.\"",
    "source": "rest",
    "status": "succeeded",
    "numSent": 0,
    "pushHash": "266b6b637152b36040830",
    "createdAt": "2017-06-13T10:49:06.095Z",
    "updatedAt": "2017-06-13T10:49:06.214Z",
    "numFailed": 15,
    "failedPerType": 
      "android": 15
    ,
    "ACL": 
  ,
  
    "objectId": "rsYinvGG",
    "pushTime": "2017-06-13T10:48:42.449Z",
    "query": "\"UniqueId\":\"7A0A-9AEA-5870FDEC42A3\"",
    "payload": "\"alert\":\"one\",\"link_key\":1,\"sound\":\"default\"",
    "source": "rest",
    "status": "succeeded",
    "numSent": 2,
    "pushHash": "246431e019c0357dcb180c7",
    "createdAt": "2017-06-13T10:48:42.449Z",
    "updatedAt": "2017-06-13T10:48:43.282Z",
    "numFailed": 0,
    "sentPerType": 
      "ios": 2
    ,
    "ACL": 
  ,

当我从 FCM 在 android 上发送推送时,它可以工作。我真的迷失在 android push 上,有人能指出我正确的方向吗?

这是日志的输出:

ESC[36mverboseESC[39m: REQUEST for [PUT] /parse/classes/_Installation   /zKIp8LLOWr: 
                                                                              "GCMSenderId":"diMV6Hm3j07dbqVPEsZRgqNzDo3YvA5zNdUmtO6Q4ka5ijRyyIRHiWCWOBVBDA22OIls-4bO06kxDPuOKFwJUZuMD3Xt41WuKUoOJwBlW7cKdqv9llj7Me0uiWFLWDwS7V",
  "UniqueId": "a59020fff8ca30d00",
  "appVersion": "2.3.3",
  "objectId": "zKIp8LLOWr"
 method=PUT, url=/parse/classes/_Installation/zKIp8LLOWr, x-parse-  app-display-version=2.3.3, x-parse-installation-id=29918e2f-8bbd-4ab7-975f-f854e1f43689, user-agent=Parse Android SDK 1.13.1 (com.mrfizzy/18) API Level 21, connection=Keep-Alive, accept-encoding=gzip, x-parse-os-version=5.0, x-parse-app-build-version=18, content-type=application/json, x-parse-client-key=, x-parse-client-version=a1.13.1, host=46.101.199.219:1337, content-length=245, x-parse-application-id=JHyfl9YhXCQ24r6J8ohdVlHLt1hfWhB4MF2jQAQn, GCMSenderId=diMV6HmLH3I:APA91bFQS4Sq9G5wlej07dbqVPEsZRgqNzDo3YvA5zNdUmtO6Q4ka5ijRyyIRHiWCWOBVBDA22OIls-4bO06kxDPuOKFwJUZuMD3Xt41WuKUoOJwBlW7cKdqv9llj7Me0uiWFLWDwS7V, UniqueId=a59020a48ca30d00, appVersion=2.3.3, objectId=zKIp8LLOWr
ESC[31merrorESC[39m: Error generating response. ParseError  code: 101, message: 'Object not found for update.'  code=101, message=Object not found for update.
[object Object]

【问题讨论】:

在本地运行,这样您就可以看到具体的错误。推送失败的原因有很多,所以很难说没有错误。 用日志输出更新问题。 【参考方案1】:

您似乎没有正确分配发件人 ID。您传递的 objectId 似乎不正确。确保在设置 GCM 发件人 ID 时使用ParseInstallation.getCurrentInstallation(),而不是尝试通过任何其他方式进行安装。

http://parseplatform.org/Parse-SDK-Android/api/com/parse/ParseInstallation.html#getCurrentInstallation()

【讨论】:

我没有使用 GCM,我在我的 index.js 文件中使用 FCM senderId 和 apiKey,如问题顶部所示。我在该文件的任何地方都没有看到这一行ParseInstallation.getCurrentInstallation()。这会在应用程序中吗?我认为应用程序很好,因为从 FCM 仪表板发送通知时会发出通知 阅读您的日志输出。该错误是因为没有找到具有您传递的正确 ObjectId 的对象,并且您还在 PUT 请求中设置了 GCMSenderId。您正在尝试保存一个不存在的对象。 您正试图保存与ID zKIp8LLOWr _Installation对象(这似乎并不存在,是用户的ObjectID吧?),和你传递GCMSenderId:diMV6Hm3j07dbqVPEsZRgqNzDo3YvA5zNdUmtO6Q4ka5ijRyyIRHiWCWOBVBDA22OIls-4bO06kxDPuOKFwJUZuMD3Xt41WuKUoOJwBlW7cKdqv9llj7Me0uiWFLWDwS7V。错误消息中显示“找不到对象”,这意味着没有_Installation 对象具有objectId zKIp8LLOWr 仍然没有运气,我不再收到该对象丢失错误,这是我现在得到的响应:results=[objectId=jVctUq1lKv, pushTime=2017-06-14T10:18:19.030Z, query="UniqueId":"c34f81f49de788ce","deviceType":"$in":["android"], payload="alert":"Tabib", source=rest, status=succeeded, numSent=0, pushHash=25e44ea99f48ca8a9c54ff1ef578bdbc, createdAt=2017-06-14T10:18:19.030Z, updatedAt=2017-06-14T10:18:19.233Z, numFailed=16, android=16, ] 它说失败 16 但没有说明失败的原因 你确定你有发送者ID和API密钥吗?卸载会失败。如果您从本地服务器运行推送,它会显示每次发送尝试的错误,因此您可以具体查看出了什么问题。我会清除您的安装,重新安装您的应用,然后使用新数据重试。

以上是关于解析服务器(自托管)不使用 FCM 发送 android 通知的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Google FCM 和 Microsoft azure 作为托管服务器从 chrome for android 上的 PWA 发送推送通知

使用 FCM 在 Android 中自定义点对点通信

使用 Parse Server 的 FCM 推送通知

FCM 网络推送通知 Google Analytics

使用 FCM 解析部署在 Amazon EC2 Android 通知上的服务器

向 FCM 服务器发送推送通知不起作用