Просмотр исходного кода

Improve TRC APNS push notification reliability

Switch from silent background pushes to alert-type notifications
to align with how Loop APNS commands are sent, fixing unreliable
delivery especially on cellular and when the app is in background.
Jonas Björkert 4 месяцев назад
Родитель
Сommit
83b6c6b59b

+ 18 - 2
LoopFollow/Remote/TRC/PushMessage.swift

@@ -4,10 +4,26 @@
 import Foundation
 
 struct EncryptedPushMessage: Encodable {
-    let aps: [String: Int] = ["content-available": 1]
-
+    let aps: APSPayload
     let encryptedData: String
 
+    init(encryptedData: String, commandType: TRCCommandType) {
+        self.encryptedData = encryptedData
+        aps = APSPayload(alert: "Remote Command: \(commandType.displayName)")
+    }
+
+    struct APSPayload: Encodable {
+        let contentAvailable: Int = 1
+        let interruptionLevel: String = "time-sensitive"
+        let alert: String
+
+        enum CodingKeys: String, CodingKey {
+            case contentAvailable = "content-available"
+            case interruptionLevel = "interruption-level"
+            case alert
+        }
+    }
+
     enum CodingKeys: String, CodingKey {
         case aps
         case encryptedData = "encrypted_data"

+ 4 - 3
LoopFollow/Remote/TRC/PushNotificationManager.swift

@@ -252,16 +252,17 @@ class PushNotificationManager {
             }
 
             let encryptedDataString = try messenger.encrypt(payload)
-            let finalMessage = EncryptedPushMessage(encryptedData: encryptedDataString)
+            let finalMessage = EncryptedPushMessage(encryptedData: encryptedDataString, commandType: payload.commandType)
 
             var request = URLRequest(url: url)
             request.httpMethod = "POST"
             request.setValue("bearer \(jwt)", forHTTPHeaderField: "authorization")
             request.setValue("application/json", forHTTPHeaderField: "content-type")
             request.setValue("10", forHTTPHeaderField: "apns-priority")
-            request.setValue("0", forHTTPHeaderField: "apns-expiration")
+            request.setValue("600", forHTTPHeaderField: "apns-expiration")
             request.setValue(bundleId, forHTTPHeaderField: "apns-topic")
-            request.setValue("background", forHTTPHeaderField: "apns-push-type")
+            request.setValue("alert", forHTTPHeaderField: "apns-push-type")
+            request.setValue(payload.commandType.rawValue, forHTTPHeaderField: "apns-collapse-id")
 
             request.httpBody = try JSONEncoder().encode(finalMessage)
 

+ 11 - 0
LoopFollow/Remote/TRC/TRCCommandType.swift

@@ -10,4 +10,15 @@ enum TRCCommandType: String, Encodable {
     case meal
     case startOverride = "start_override"
     case cancelOverride = "cancel_override"
+
+    var displayName: String {
+        switch self {
+        case .bolus: return "Bolus"
+        case .tempTarget: return "Temp Target"
+        case .cancelTempTarget: return "Cancel Temp Target"
+        case .meal: return "Meal"
+        case .startOverride: return "Start Override"
+        case .cancelOverride: return "Cancel Override"
+        }
+    }
 }