Files
firebase-ios-sdk/Example/Messaging/App/iOS/NotificationsController.swift
T
Mathew Huusko V 5c59342e6e macOS (#38)
* Example/Core: create macOS app/tests target

* Example/Core: Core_Example/Tests -> Core_Example/Tests_iOS

* Example/Core: macOS building/tests passing

* Example/Database: separate iOS/macOS targets

* BuildFrameworks: macOS

* .travis.yml, test.sh: AllUnitTests -> AllUnitTests_iOS

* test.sh: add AllUnitTests_macOS

* Example/Storage: Example/Tests->_iOS

* Example/Storage: macOS

* test.sh: try to prevent double error 65

* test.sh: build before test

* Example/Auth|Messaging: -> _iOS

* Example/Auth: macOS build

* Example/Auth: macOS passing

* Example/Firebase: pod de/re-integrate; fix static DerivedData references; copy phase for OCMock

* Example/Firebase: manually copied OCMock, Products Dir vs. Frameworks

* Example/Firebase: copied OCMock, prevent header removal

* Example/Storage: integration tests sdk fix

* Example/Auth: macOS exclude FIRAuthAppCredentialManager; cleanup

* Firebase/Core: remove nullability annotation

* Firebase/Core|Database: correct TARGET_X usage for correctness and anticipation of OS_WATCH|TV branches

* build.swift: style fix

* Firebase/Core: FIRLogger: fix macOS intermittent va_list error
2017-06-02 10:42:17 -07:00

133 lines
4.4 KiB
Swift

/*
* Copyright 2017 Google
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import UIKit
import UserNotifications
import FirebaseDev
enum NotificationsControllerAllowedNotificationType: String {
case none = "None"
case silent = "Silent Updates"
case alert = "Alerts"
case badge = "Badges"
case sound = "Sounds"
}
let APNSTokenReceivedNotification: Notification.Name
= Notification.Name(rawValue: "APNSTokenReceivedNotification")
let UserNotificationsChangedNotification: Notification.Name
= Notification.Name(rawValue: "UserNotificationsChangedNotification")
class NotificationsController: NSObject {
static let shared: NotificationsController = {
let instance = NotificationsController()
return instance
}()
class func configure() {
let sharedController = NotificationsController.shared
// Always become the delegate of UNUserNotificationCenter, even before we've requested user
// permissions
if #available(iOS 10.0, *) {
UNUserNotificationCenter.current().delegate = sharedController
}
}
func registerForUserFacingNotificationsFor(_ application: UIApplication) {
if #available(iOS 10.0, *) {
UNUserNotificationCenter.current()
.requestAuthorization(options: [.alert, .badge, .sound],
completionHandler: { (granted, error) in
NotificationCenter.default.post(name: UserNotificationsChangedNotification, object: nil)
})
} else if #available(iOS 8.0, *) {
let userNotificationSettings = UIUserNotificationSettings(types: [.alert, .badge, .sound],
categories: [])
application.registerUserNotificationSettings(userNotificationSettings)
} else {
application.registerForRemoteNotifications(matching: [.alert, .badge, .sound])
}
}
func getAllowedNotificationTypes(_ completion:
@escaping (_ allowedTypes: [NotificationsControllerAllowedNotificationType]) -> Void) {
guard Messaging.messaging().apnsToken != nil else {
completion([.none])
return
}
var types: [NotificationsControllerAllowedNotificationType] = [.silent]
if #available(iOS 10.0, *) {
UNUserNotificationCenter.current().getNotificationSettings(completionHandler: { (settings) in
if settings.alertSetting == .enabled {
types.append(.alert)
}
if settings.badgeSetting == .enabled {
types.append(.badge)
}
if settings.soundSetting == .enabled {
types.append(.sound)
}
DispatchQueue.main.async {
completion(types)
}
})
} else if #available(iOS 8.0, *) {
if let userNotificationSettings = UIApplication.shared.currentUserNotificationSettings {
if userNotificationSettings.types.contains(.alert) {
types.append(.alert)
}
if userNotificationSettings.types.contains(.badge) {
types.append(.badge)
}
if userNotificationSettings.types.contains(.sound) {
types.append(.sound)
}
}
completion(types)
} else {
let enabledTypes = UIApplication.shared.enabledRemoteNotificationTypes()
if enabledTypes.contains(.alert) {
types.append(.alert)
}
if enabledTypes.contains(.badge) {
types.append(.badge)
}
if enabledTypes.contains(.sound) {
types.append(.sound)
}
completion(types)
}
}
}
// MARK: - UNUserNotificationCenterDelegate
@available(iOS 10.0, *)
extension NotificationsController: UNUserNotificationCenterDelegate {
func userNotificationCenter(_ center: UNUserNotificationCenter,
willPresent notification: UNNotification,
withCompletionHandler completionHandler:
@escaping (UNNotificationPresentationOptions) -> Void) {
// Always show the incoming notification, even if the app is in foreground
completionHandler([.alert, .badge, .sound])
}
}