/ / W iOS Firebase Cloud Messaging (FCM) wysyłaj APNS do tematu, ale innego niż nadawca z iPhone'a - iOS, iPhone, Swift, Firebase-Cloud-Messaging

W iOS Firebase Cloud Messaging (FCM) wysyłaj APNS do tematu, ale innego niż nadawca z iPhone'a - iOS, iPhone, Swift, Firebase-Cloud-Messaging

Zasubskrybuj temat, aby wysłać APNS do wszystkich urządzeń:

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

Uwaga: „wszystkie urządzenia” to nazwa tematu, w którym wszystkie subskrybowane urządzenia otrzymają APNS

Wysyłaj APNS do wszystkich urządzeń programowo za pośrednictwem tematu podanego poniżej:

func sendPushMessage(todoItem:TodoItem, isAdded:Bool = true) {

let url = URL(string: "https://fcm.googleapis.com/fcm/send")!
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
let strKey:String = "Here FCM Server Key"
request.setValue("key=(strKey)", forHTTPHeaderField: "Authorization")

var message:String = ""
if isAdded {
message = "Todo with title "(todoItem.title)" added"
}
else{
message = "Todo with title "(todoItem.title)" removed"
}

let dictData = ["to":"/topics/alldevices","priority":"high","notification":["body":message,"title":"Community","badge":"1"]] as [String : Any]

do {
let jsonData = try JSONSerialization.data(withJSONObject: dictData, options: .prettyPrinted)
// here "jsonData" is the dictionary encoded in JSON data

request.httpBody = jsonData

let task = URLSession.shared.dataTask(with: request, completionHandler: { (responseData: Data?, response: URLResponse?, error: Error?) in

let strData :String = String(data: responseData!, encoding: String.Encoding.utf8)!
print("data : (strData)")
NSLog("(String(describing: response) )")
})
task.resume()

} catch {
print(error.localizedDescription)
}
}

Problem polega na tym, że nadawca (użytkownik korzystający z aplikacji) również dostajeAPNS jako nadawca jest również zasubskrybowany w temacie „alldevices”. Ale z technicznego punktu widzenia nadawca nie potrzebuje APNS, ponieważ nadawca sam wygenerował APNS dla wszystkich innych urządzeń

Uwaga: nie mamy oddzielnego serwera do wysyłania lub zarządzania APNS. Jedyny FCM tutaj zarządza APNS dla nas.

Odpowiedzi:

0 dla odpowiedzi № 1

Nie sądzę, że możesz to zrobić za pośrednictwem interfejsu API. Być może przez sekcję powiadomień konsoli Firebase przy użyciu „odbiorców użytkowników”, ale to oczywiście nie rozwiąże problemu. Być może uda się to osiągnąć w przyszłości, kiedy / jeśli interfejs API Firebase zacznie obsługiwać grupy odbiorców.

Jedną z rzeczy, na które możesz zwrócić uwagę, jest wysłanie komunikatu „dane” zamiast komunikatu „wyświetlacz”.

Spowoduje to wysłanie „cichego” powiadomienia do wszystkich innych użytkowników, a po otrzymaniu telefonu klienta zdecyduje, czy powiadomienie powinno zostać wyświetlone.

Na przykład post Firebase zmieniłby się i używałby obiektu „data” zamiast obiektu „notification”

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

Gdzie „nadawca” to unikalny identyfikator utworzony i przechowywany na telefonie użytkownika.

Podczas odbierania powiadomienia wyświetli się powiadomienie tylko wtedy, gdy wartość „nadawca” nie jest równa identyfikatorowi UUID przechowywanemu w telefonie.

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)
}
}
}

Przed użyciem tej metody warto sprawdzić niezawodność, ponieważ ciche powiadomienia mogą być ograniczane przez system operacyjny, a czasami nawet nie są dostarczane.