title: Firebase iOS 11 Ask for user notifications after button push
body: <p>I'm using Firebase to enable push notifications on iOS 11.  I'm trying to ask the user's notification permission only AFTER a button is pushed.</p>
  
  <p>Currently, the app asks for the users permission immediately on load.  I want to ask this permission in the <code>EnableNotificationViewController.swift</code> class after a button is pushed.</p>
  
  <p><strong>AppDelegate.swift</strong></p>
  
  <pre><code>import UIKit
  import Firebase
  import FBSDKCoreKit
  import UserNotifications
  import FirebaseInstanceID
  import FirebaseMessaging
  
  @UIApplicationMain
  class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate, MessagingDelegate {
  
      var window: UIWindow?
  
      func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -&gt; Bool {
          // Override point for customization after application launch.
  
          FirebaseApp.configure()
  
          // [START set_messaging_delegate]
          Messaging.messaging().delegate = self
  
  
          if #available(iOS 10.0, *) {
              // For iOS 10 display notification (sent via APNS)
              UNUserNotificationCenter.current().delegate = self
  
              let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
              UNUserNotificationCenter.current().requestAuthorization(
                  options: authOptions,
                  completionHandler: {_, _ in })
          } else {
              let settings: UIUserNotificationSettings =
                  UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
              application.registerUserNotificationSettings(settings)
          }
  
          application.registerForRemoteNotifications()
  
          FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions)
          return true
      }
  
      func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -&gt; Bool {
          return FBSDKApplicationDelegate.sharedInstance().application(application, open: url, sourceApplication: sourceApplication, annotation: annotation)
      }
  
      func applicationWillResignActive(_ application: UIApplication) {
          // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
          // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
      }
  
      func applicationDidEnterBackground(_ application: UIApplication) {
          // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
          // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
      }
  
      func applicationWillEnterForeground(_ application: UIApplication) {
          // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
      }
  
      func applicationDidBecomeActive(_ application: UIApplication) {
          // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
          FBSDKAppEvents.activateApp()
      }
  
      func applicationWillTerminate(_ application: UIApplication) {
          // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
      }
  
      // MARK: - Notifications
  
      // The callback to handle data message received via FCM for devices running iOS 10 or above.
      func application(received remoteMessage: MessagingRemoteMessage) {
          print(remoteMessage.appData)
      }
  
  
  }
  </code></pre>
  
  <p><strong>EnableLocationViewController.swift</strong></p>
  
  <pre><code>import UIKit
  import Spring
  import Firebase
  
  class EnableNotificationsViewController: UIViewController {
  
      // MARK: - Outlets
      @IBOutlet weak var textLabel: DesignableLabel!
  
      // MARK: - View Did Load
      override func viewDidLoad() {
          super.viewDidLoad()
  
      }
  
      // MARK: - Actions
      @IBAction func notificationButton(_ sender: UIButton) {
  
      }
  
  
  }
  </code></pre>