我正在使用 Pigeon (v2.0.0) 通过 Phoenix (1.7.12) 发送新的 FCM V1 API 消息。新消息的一部分包括传出消息中的字段
{:token, my_token}
。当 Phoenix 收到响应时,它会根据响应和原始通知生成 JSON,但没有用于编码元组的协议。
有没有一个简单的解决方案可以避免这个问题?
有人有解决办法吗?有人将 Pigeon V2 与 FCM V1 和 Phoenix 一起使用吗?
样本错误:
13:31:21.789 module=Bandit.Pipeline function=handle_error/5 line=233 [error] ** (Protocol.UndefinedError) protocol Jason.Encoder not implemented for {:token, "fj6NWX76QIyLrm8WseC22C:APA91bHRcPDl6eFRPQr0yrElZIp6Ry931kZAPaV_XotfgePuVXPAb3iblwTwUF81S7Id8q6qi_IWJo8dgTgPbAMSHEbn4fauxFC2h50ymOreVjgsLuk-tqKqLU6SeGEpp8o05XfrbrtG"} of type Tuple, Jason.Encoder protocol must always be explicitly implemented. This protocol is implemented for the following type(s): Any, Atom, BitString, Date, DateTime, Decimal, Ecto.Association.NotLoaded, Ecto.Schema.Metadata, Float, Integer, Jason.Fragment, Jason.OrderedObject, List, Map, NaiveDateTime, Time
(jason 1.4.1) lib/jason.ex:213: Jason.encode_to_iodata!/2
(phoenix 1.7.12) lib/phoenix/controller.ex:365: Phoenix.Controller.json/2
(push_server 2.0.0) lib/push_server_web/api/controllers/fcm_controller.ex:1: PushServerWeb.API.FcmController.action/2
(push_server 2.0.0) lib/push_server_web/api/controllers/fcm_controller.ex:1: PushServerWeb.API.FcmController.phoenix_controller_pipeline/2
(phoenix 1.7.12) lib/phoenix/router.ex:484: Phoenix.Router.__call__/5
(push_server 2.0.0) lib/push_server_web/endpoint.ex:1: PushServerWeb.Endpoint.plug_builder_call/2
(push_server 2.0.0) deps/plug/lib/plug/debugger.ex:136: PushServerWeb.Endpoint."call (overridable 3)"/2
我开始认为我的应用程序组合可能不寻常。我们有一个集中式推送服务器,可以接受来自多个服务器的推送通知,因此 Apple 的身份验证只需在中央专用服务器中进行管理和更新。因此,我们通过 Phoenix 通道将推送发送到推送服务器,这可能是不寻常/独特的。
我通过为 FCM 创建 new 的第二个实现来解决这个问题,该实现接受带有令牌而不是元组的映射。
我还发现为 FCM.Notification 结构定义 Jason.Encoder 协议(不包括 struct 字段)很有用,这样 Jason 就不会反对获取完整的通知结构来处理。