diff --git a/MeshtasticApple/Helpers/BLEManager.swift b/MeshtasticApple/Helpers/BLEManager.swift index 0613cc62..176514b4 100644 --- a/MeshtasticApple/Helpers/BLEManager.swift +++ b/MeshtasticApple/Helpers/BLEManager.swift @@ -391,8 +391,15 @@ class BLEManager: NSObject, ObservableObject, CBCentralManagerDelegate, CBPeriph } var decodedInfo = FromRadio() - decodedInfo = try! FromRadio(serializedData: characteristic.value!) - + + do { + + decodedInfo = try FromRadio(serializedData: characteristic.value!) + + } catch { + + print(characteristic.value!) + } switch decodedInfo.packet.decoded.portnum { // Handle Any local only packets we get over BLE diff --git a/MeshtasticApple/Helpers/MeshPackets.swift b/MeshtasticApple/Helpers/MeshPackets.swift index 644ac847..e2704e93 100644 --- a/MeshtasticApple/Helpers/MeshPackets.swift +++ b/MeshtasticApple/Helpers/MeshPackets.swift @@ -633,7 +633,7 @@ func nodeInfoAppPacket (packet: MeshPacket, meshLogging: Bool, context: NSManage } } else { - return + //return } do { @@ -725,7 +725,7 @@ func positionPacket (packet: MeshPacket, meshLogging: Bool, context: NSManagedOb } else { - return + //return } do { @@ -923,14 +923,27 @@ func textMessageAppPacket(packet: MeshPacket, connectedNode: Int64, meshLogging: newMessage.messagePayload = messageText newMessage.fromUser?.objectWillChange.send() newMessage.toUser?.objectWillChange.send() + + var messageSaved = false - do { + do { - try context.save() + try context.save() - if meshLogging { MeshLogger.log("💾 Saved a new message for \(newMessage.messageId)") } - - if newMessage.toUser != nil && newMessage.toUser!.num == broadcastNodeNum || connectedNode == newMessage.toUser!.num { + if meshLogging { MeshLogger.log("💾 Saved a new message for \(newMessage.messageId)") } + + messageSaved = true + + } catch { + + context.rollback() + + let nsError = error as NSError + print("💥 Failed to save new MessageEntity \(nsError)") + } + do { + + if messageSaved && (newMessage.toUser != nil && newMessage.toUser!.num == broadcastNodeNum || connectedNode == newMessage.toUser!.num) { // Create an iOS Notification for the received message and schedule it immediately let manager = LocalNotificationManager() @@ -942,19 +955,15 @@ func textMessageAppPacket(packet: MeshPacket, connectedNode: Int64, meshLogging: subtitle: "AKA \(newMessage.fromUser?.shortName ?? "???")", content: messageText) ] - manager.schedule() - if meshLogging { MeshLogger.log("💬 iOS Notification Scheduled for text message from \(newMessage.fromUser?.longName ?? "Unknown") \(messageText)") } - - } + + manager.schedule() + if meshLogging { MeshLogger.log("💬 iOS Notification Scheduled for text message from \(newMessage.fromUser?.longName ?? "Unknown") \(messageText)") } + } + + } catch { - } catch { - - context.rollback() - - let nsError = error as NSError - print("💥 Failed to save new MessageEntity \(nsError)") } - + } catch { print("💥 Fetch Message To and From Users Error") diff --git a/MeshtasticApple/Views/Bluetooth/Connect.swift b/MeshtasticApple/Views/Bluetooth/Connect.swift index 72a43bd3..6155c3f2 100644 --- a/MeshtasticApple/Views/Bluetooth/Connect.swift +++ b/MeshtasticApple/Views/Bluetooth/Connect.swift @@ -18,6 +18,8 @@ struct Connect: View { @Environment(\.managedObjectContext) var context @EnvironmentObject var bleManager: BLEManager @EnvironmentObject var userSettings: UserSettings + + @State var initialLoad: Bool = true @State var isPreferredRadio: Bool = false @@ -269,10 +271,22 @@ struct Connect: View { } .navigationViewStyle(StackNavigationViewStyle()) .onAppear(perform: { + + if initialLoad { - self.bleManager.context = context - self.bleManager.userSettings = userSettings - + self.bleManager.context = context + self.bleManager.userSettings = userSettings + + // Ask for notification permission + UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { success, error in + if success { + print("All set!") + } else if let error = error { + print(error.localizedDescription) + } + } + initialLoad = false + } if self.bleManager.connectedPeripheral != nil && userSettings.preferredPeripheralId == self.bleManager.connectedPeripheral.peripheral.identifier.uuidString { isPreferredRadio = true } else {