2016-07-18 3 views
2

docs for registerUserNotificationSettings: состояние:Должен `registerUserNotificationSettings:` Вызываться во время запуска приложения?

Если приложение отображает оповещения, воспроизводить звуки, или значки ее значок, вы должны вызвать этот метод во время запуска цикла, чтобы запросить разрешение на оповещать пользователя в этих отношениях.

Я был разочарован тем, что прочитал это, так как кажется, что грубо для приложения запрашивать разрешение на отправку push-уведомлений, прежде чем есть необходимость. Например, в приложении, которое я разрабатываю, пользователь должен создать учетную запись в нашей онлайн-службе, прежде чем есть какие-либо причины для отправки push-уведомлений. И может случиться так, что пользователь никогда не подписывается, просто использует приложение локально, поэтому никогда не возникает причин спрашивать. Но если я могу только спросить о запуске приложения, это означает, что пользователю нужно будет создать учетную запись, выйти из приложения, а затем запустить ее еще раз, прежде чем мы сможем спросить. Кажется странным.

Действительно ли это необходимо? Я попробовал поместить вызов в registerUserNotificationSettings: в более значимую часть приложения, но затем приложение никогда не запрашивало разрешения на отправку push-уведомлений. Является ли это просто политикой для push-уведомлений iOS или существует какой-то способ повысить гибкость в отношении того, когда запрашивать разрешение на отправку push-уведомлений?

+1

Вы можете спросить, когда захотите. Если приглашение на разрешение не появилось, это связано с какой-то другой причиной. – dan

+0

Согласитесь с @dan, у вас может возникнуть другая проблема! В противном случае, вы можете спросить, когда захотите. –

+0

Вы можете зарегистрироваться для уведомления Push в любое время, приглашение на поддержку должно быть показано немедленно. Попробуйте создать образец приложения только с кодом push-уведомления и проверьте, работает ли он. –

ответ

2

Начальный вызов -registerForNotifications не должен вызываться во время цикла запуска приложения. Однако после первого вызова он всегда должен быть вызван во время цикла запуска приложения.

Здесь были две проблемы: одна моя и одна из сторонних служб, которые я использовал для push-уведомлений. Моя проблема заключалась в том, что я отклонил контроллер вида, который вызвал -registerForNotifications после его возврата; Я не понимал, что он работает асинхронно. Поэтому я добавил -application:didRegisterUserNotificationSettings моему делегату приложения. Этот метод вызывается после того, как пользователь ответил на приглашение, представленное -registerForNotifications, и я отправил ему уведомление. Перед вызовом -registerForNotifications я настроил прослушиватель для этого уведомления и только отклонил контроллер вида после получения уведомления. Вид желания был делегат или блок, чтобы указать вместо этого, но нет.

И я подозреваю, что причина есть не потому, что IOS действительно хочет, чтобы вы звоните -registerForNotifications в application:didFinishLaunchingWithOptions:, так что это естественно для асинхронной обратного вызова, чтобы быть просто еще один метод в приложении делегата. [Удален бит о необходимости перезапуска приложения, чтобы получить push-уведомления. Добавление:] Другая проблема заключалась в том, что сторонняя служба, которую я использовал для push-уведомлений, которая все еще находится в alpha, часто не отправляла push-уведомления. Как только это исправлено, они начали работать, как только я утвердил push-уведомления, независимо от того, было ли приглашение при запуске приложения или позже.[/ ADDED]

Так вот полная картина:

  • В application:didFinishLaunchingWithOptions: вызове метода в приложении делегата -registerForNotifications, если пользователь по умолчанию установлено:

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
        if NSUserDefaults.standardUserDefaults().boolForKey("registedNotificationSettings") { 
         self.registerForNotifications() 
        } 
        return true 
    } 
    
  • В приложении делегата -application:didRegisterUserNotificationSettings: метод, настроить для удаленных уведомлений, сохранить значение по умолчанию пользователя и опубликовать уведомление:

    func application(application: UIApplication, didRegisterUserNotificationSettings notificationSettings: UIUserNotificationSettings) { 
        if notificationSettings.types != .None { 
         application.registerForRemoteNotifications() 
        } 
        let defaults = NSUserDefaults.standardUserDefaults() 
        if !defaults.boolForKey("registedNotificationSettings") { 
         defaults.setBool(true, forKey: "registedNotificationSettings") 
         defaults.synchronize() 
        } 
        NSNotificationCenter.defaultCenter().postNotification(
         NSNotification(name: "RegistedNotificationSettings", object: notificationSettings) 
        ) 
    } 
    
  • На мой взгляд регулятора на нажатие кнопки, слушать для этого уведомления, а затем запросить разрешение на отправку уведомления толчка:

    @IBAction func okayButtonTapped(sender: AnyObject) { 
        NSNotificationCenter.defaultCenter().addObserver(
         self, 
         selector: #selector(didRegisterNotificationSettings(_:)), 
         name: "RegistedNotificationSettings", 
         object: nil 
        ) 
        let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
        appDelegate.registerForNotifications() 
    } 
    
  • Тогда, конечно, мы будем нуждаться метод уведомления, который увольняет вид управления, когда разрешение было предоставлено, и нужно сделать что-то другое, когда он не имеет:

    func didRegisterNotificationSettings(notification: NSNotification) { 
        let status = notification.object as! UIUserNotificationSettings 
        if status.types != .None { 
         // Yay! 
         self.done() 
         return 
        } 
    
        // Tell them a little more about it. 
        NSLog("User declined push notifications") 
        self.done() 
    } 
    

с помощью этой конфигурации, все это приста ks [Удалена дезинформация о -registerForNotifications времени вызова] и не запрашивает пользователя при запуске приложения.

Смежные вопросы