/ / V iOS Firebase Cloud Messaging (FCM), send APNS to topic but other than sender from iphone - ios, iphone, swift, firebase-cloud-messaging

V iOS Firebase Cloud Messaging (FCM) posielajte APNS na tému okrem odosielateľa z iphone - ios, iphone, swift, firebase-cloud-messaging

Prihláste sa na odber témy a odošlite APNS do všetkých zariadení:

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

Poznámka: „všetky zariadenia“ je názov témy, kde budú všetky predplatené zariadenia dostávať APNS

Programové posielanie APNS na všetky zariadenia prostredníctvom témy uvedenej nižšie:

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

Tu nastáva problém s odosielateľom (používateľom aplikácie)APNS ako odosielateľ je príliš prihlásený na odber témy „alldevices“. Ale technicky odosielateľ nepotrebuje APNS, pretože sám odosielateľ vygeneroval APNS pre všetky ostatné zariadenia

Poznámka: Nemáme žiadny samostatný server na odosielanie alebo správu APNS. Podrážka FCM tu spravuje APNS za nás.

odpovede:

0 pre odpoveď č. 1

Nemyslím si, že to môžete urobiť pomocou API.Možno prostredníctvom notifikačnej sekcie konzoly Firebase pomocou „publika (skupín) používateľov“, ale to očividne nevyrieši váš problém. Možno by to mohlo byť v budúcnosti dosiahnuteľné, keď / ak rozhranie Firebase API začne podporovať publikum používateľov.

Jedna vec, na ktorú by ste sa mohli pozrieť, je namiesto „zobrazovacej“ správy posielať „dátovú“ správu.

Týmto by sa všetkým ostatným používateľom odoslalo „tiché“ upozornenie a po prijatí by sa klientský telefón rozhodol, či je potrebné upozornenie zobraziť.

Napríklad váš príspevok na platforme firebase by sa zmenil tak, že namiesto objektu „notifikácie“ použije objekt „data“

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

Kde „odosielateľ“ je jedinečný identifikátor, ktorý ste vytvorili a uložili do telefónu používateľa.

Pri prijímaní oznámenia by ste zobrazili oznámenie, iba ak sa hodnota „odosielateľ“ nerovná UUID uloženému v telefóne.

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

Možno budete chcieť pred použitím tejto metódy preskúmať spoľahlivosť, pretože operačný systém môže obmedziť tiché upozornenia a niekedy ich dokonca nemusí doručiť.