在iOS Firebase云消息传递(FCM)中,将APNS发送到主题但不是iphone发送者

时间:2017-11-09 10:06:12

标签: ios iphone swift firebase-cloud-messaging

订阅主题以将APNS发送到所有设备:

df = df.sort_values('update_timestamp').drop_duplicates(['biz_id','offer_id'], 'last')
print (df)

   biz_id  offer_id update_timestamp  amount
0       1         1       2013-04-30       5
3       0         2       2013-08-30       5
1       2         1       2014-05-30       7
2       1         2       2015-11-30       3

注意:'所有设备'是所有下标设备将获得APNS

的主题名称

通过下面给出的主题以编程方式将APNS发送到所有设备:

//subscribe to topic to send message to multiple device
Messaging.messaging().subscribe(toTopic: "alldevices")

这里的问题是发件人(使用app的用户)也获得了APNS,因为发件人也订阅了主题' alldevices'。但从技术上讲,发送方并不需要APNS,因为发送方自己为所有其他设备生成了APNS

注意:我们没有单独的服务器来发送或管理APNS。 FCM这里为我们管理APNS。

1 个答案:

答案 0 :(得分:0)

我认为你不能通过API做到这一点。也许通过Firebase控制台的通知部分使用“用户受众”,但这显然无法解决您的问题。如果Firebase API开始支持用户受众,那么将来可能会实现这一点。

您可以研究的一件事是发送“数据”消息,而不是“显示”消息。

这会向所有其他用户发送“无声”通知,一旦收到,客户端电话就会决定是否需要显示通知。

例如,您的firebase帖子会更改为使用'data'对象,而不是'notification'对象

{
  "to": "/topics/alldevices",
  "content_available": true,
  "data": {
    "sender": "{{this_phones_uuid}}"
  },
  "priority": "high"
}

“发件人”是您创建并存储在用户手机上的唯一标识符。

收到通知时,如果“发件人”值不等于手机上存储的UUID,则只会显示通知。

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
        if let sender = userInfo["sender"] as? String {
            if sender != {{your_stored_uuid}} {
                let notification = UNMutableNotificationContent()
                notification.title = "title"
                notification.body = "body"
                let trigger = UNTimeIntervalNotificationTrigger.init(timeInterval: 1, repeats: false)
                let request = UNNotificationRequest.init(identifier: "todo", content: notification, trigger: trigger)
                UNUserNotificationCenter.current().add(request)
            }
        }
    }

您可能希望在使用此方法之前研究可靠性,因为操作系统可能会限制静默通知,有时甚至无法提供。