Fix network notifications and add debugging

- Network notifications now show even when app is in foreground
- Added unique identifiers to prevent iOS deduplication
- Set interruptionLevel to timeSensitive for prominence
- Added comprehensive logging throughout notification flow
- Improved error handling for notification permissions
This commit is contained in:
jack
2025-07-22 16:39:56 +02:00
parent 3194da8f85
commit 537d489daa
2 changed files with 40 additions and 4 deletions
@@ -1353,16 +1353,19 @@ class BluetoothMeshService: NSObject {
// Check if we should reset the notification flag
if let emptyTime = networkBecameEmptyTime {
let currentNetworkSize = collectionsQueue.sync { activePeers.count }
print("📱 Checking network empty state: size=\(currentNetworkSize), emptyTime=\(emptyTime)")
if currentNetworkSize == 0 {
// Network is still empty, check if enough time has passed
let timeSinceEmpty = Date().timeIntervalSince(emptyTime)
if timeSinceEmpty >= networkEmptyResetDelay {
// Reset the flag after network has been empty for the delay period
print("📱 Resetting notification flag after \(timeSinceEmpty)s of empty network")
hasNotifiedNetworkAvailable = false
// Keep the empty time set so we don't immediately notify again
}
} else {
// Network is no longer empty, clear the empty time
print("📱 Network no longer empty, clearing empty time")
networkBecameEmptyTime = nil
}
}
@@ -1975,6 +1978,7 @@ class BluetoothMeshService: NSObject {
// Check if we've already announced this peer
let isFirstAnnounce = !announcedPeers.contains(senderID)
print("📱 Peer announce: \(senderID), isFirstAnnounce: \(isFirstAnnounce), wasInserted: \(wasInserted ?? false)")
// Clean up stale peer IDs with the same nickname
collectionsQueue.sync(flags: .barrier) {
@@ -2115,6 +2119,8 @@ class BluetoothMeshService: NSObject {
// Send network available notification if appropriate
let currentNetworkSize = collectionsQueue.sync { self.activePeers.count }
print("📱 Network size after peer announce: \(currentNetworkSize), hasNotified: \(hasNotifiedNetworkAvailable)")
if currentNetworkSize > 0 {
// Clear empty time since network is active
networkBecameEmptyTime = nil
@@ -2126,17 +2132,24 @@ class BluetoothMeshService: NSObject {
if let lastNotification = lastNetworkNotificationTime {
let timeSinceLastNotification = now.timeIntervalSince(lastNotification)
print("📱 Time since last notification: \(timeSinceLastNotification)s, cooldown: \(networkNotificationCooldown)s")
if timeSinceLastNotification < networkNotificationCooldown {
// Too soon to send another notification
shouldSendNotification = false
print("📱 Skipping notification - cooldown period active")
}
}
if shouldSendNotification {
print("📱 Triggering network availability notification for \(currentNetworkSize) peers")
hasNotifiedNetworkAvailable = true
lastNetworkNotificationTime = now
NotificationService.shared.sendNetworkAvailableNotification(peerCount: currentNetworkSize)
} else {
print("📱 Not sending notification - cooldown active")
}
} else {
print("📱 Not sending notification - already notified")
}
}
+27 -4
View File
@@ -20,9 +20,11 @@ class NotificationService {
private init() {}
func requestAuthorization() {
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { granted, _ in
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in
if granted {
// Permission granted
print("📱 Notification permission granted")
} else {
print("📱 Notification permission denied: \(error?.localizedDescription ?? "Unknown")")
}
}
}
@@ -87,8 +89,29 @@ class NotificationService {
func sendNetworkAvailableNotification(peerCount: Int) {
let title = "👥 bitchatters nearby!"
let body = peerCount == 1 ? "1 person around" : "\(peerCount) people around"
let identifier = "network-available"
let identifier = "network-available-\(Date().timeIntervalSince1970)"
sendLocalNotification(title: title, body: body, identifier: identifier)
print("📱 Sending network notification: \(body)")
// For network notifications, we want to show them even in foreground
let content = UNMutableNotificationContent()
content.title = title
content.body = body
content.sound = .default
content.interruptionLevel = .timeSensitive // Make it more prominent
let request = UNNotificationRequest(
identifier: identifier,
content: content,
trigger: nil // Deliver immediately
)
UNUserNotificationCenter.current().add(request) { error in
if let error = error {
print("📱 Error sending network notification: \(error)")
} else {
print("📱 Network notification sent successfully")
}
}
}
}