102 lines
3.1 KiB
Swift
102 lines
3.1 KiB
Swift
import Binders
|
|
import Firebase
|
|
import FirebaseMessaging
|
|
import Foundation
|
|
import Models
|
|
import Services
|
|
import UIKit
|
|
import Utils
|
|
|
|
extension AppDelegate {
|
|
func configurePushNotifications() {
|
|
guard FeatureFlag.enablePushNotifications else { return }
|
|
|
|
let keys: FirebaseKeys? = {
|
|
let isProd = (PublicValet.storedAppEnvironment ?? .initialAppEnvironment) == .prod
|
|
let firebaseKeys = isProd ? AppKeys.sharedInstance?.firebaseProdKeys : AppKeys.sharedInstance?.firebaseDemoKeys
|
|
return firebaseKeys ?? AppKeys.sharedInstance?.firebaseProdKeys
|
|
}()
|
|
|
|
guard let keys = keys else { return }
|
|
|
|
let firebaseOpts = FirebaseOptions(googleAppID: keys.googleAppID, gcmSenderID: keys.gcmSenderID)
|
|
|
|
firebaseOpts.storageBucket = keys.storageBucket
|
|
firebaseOpts.projectID = keys.projectID
|
|
firebaseOpts.bundleID = keys.bundleID
|
|
firebaseOpts.apiKey = keys.apiKey
|
|
firebaseOpts.clientID = keys.clientID
|
|
|
|
FirebaseApp.configure(options: firebaseOpts)
|
|
FirebaseConfiguration.shared.setLoggerLevel(.min)
|
|
|
|
UNUserNotificationCenter.current().delegate = self
|
|
UIApplication.shared.registerForRemoteNotifications()
|
|
Messaging.messaging().delegate = self
|
|
}
|
|
}
|
|
|
|
extension AppDelegate: UNUserNotificationCenterDelegate {
|
|
func userNotificationCenter(
|
|
_: UNUserNotificationCenter,
|
|
willPresent notification: UNNotification,
|
|
withCompletionHandler completionHandler:
|
|
@escaping (UNNotificationPresentationOptions) -> Void
|
|
) {
|
|
let userInfo = notification.request.content.userInfo
|
|
UIApplication.shared.applicationIconBadgeNumber = 0
|
|
print(userInfo) // extract data sent along with PN
|
|
completionHandler([[.banner, .sound]])
|
|
}
|
|
|
|
func userNotificationCenter(
|
|
_: UNUserNotificationCenter,
|
|
didReceive response: UNNotificationResponse,
|
|
withCompletionHandler completionHandler: @escaping () -> Void
|
|
) {
|
|
let userInfo = response.notification.request.content.userInfo
|
|
if let linkData = userInfo["link"] as? String {
|
|
guard let jsonData = Data(base64Encoded: linkData) else { return }
|
|
if let item = FeedItem.fromJsonArticle(linkData: jsonData) {
|
|
NSNotification.pushFeedItem(feedItem: item)
|
|
}
|
|
}
|
|
|
|
print(userInfo)
|
|
completionHandler()
|
|
}
|
|
|
|
func application(
|
|
_: UIApplication,
|
|
didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data
|
|
) {
|
|
Messaging.messaging().apnsToken = deviceToken
|
|
}
|
|
|
|
func application(_: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
|
|
print(error.localizedDescription)
|
|
}
|
|
}
|
|
|
|
extension AppDelegate: MessagingDelegate {
|
|
func messaging(
|
|
_: Messaging,
|
|
didReceiveRegistrationToken fcmToken: String?
|
|
) {
|
|
guard let fcmToken = fcmToken else { return }
|
|
|
|
let savedToken = UserDefaults.standard.string(forKey: UserDefaultKey.firebasePushToken.rawValue)
|
|
|
|
if savedToken == fcmToken {
|
|
return
|
|
}
|
|
|
|
UserDefaults.standard.set(fcmToken, forKey: UserDefaultKey.firebasePushToken.rawValue)
|
|
|
|
Services().dataService
|
|
.deviceTokenPublisher(deviceTokenOperation: .addToken(token: fcmToken))
|
|
.sink(receiveCompletion: { _ in }, receiveValue: { _ in })
|
|
.store(in: &subscriptions)
|
|
}
|
|
}
|