Pytanie Jak kontrolować, kiedy należy pytać użytkownika o uprawnienia do wysyłania powiadomień w systemie iOS


Zbudowałem aplikację na iPhone'a za pomocą Swifta i Xcode 6 oraz framework Parse do obsługi usług.

Podczas korzystania z samouczków Parse dotyczących konfigurowania powiadomień wypychanych instrukcje zalecały umieszczanie powiadomień wypychanych w pliku Delegata aplikacji.

To jest kod, który dodałem do pliku Delegata aplikacji ...

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?
    var pushNotificationsController: PushNotificationController?


    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

         // Register for Push Notifications
        self.pushNotificationsController = PushNotificationController()

        if application.respondsToSelector("registerUserNotificationSettings:") {
            println("registerUserNotificationSettings.RegisterForRemoteNotificatios")
            let userNotificationTypes: UIUserNotificationType = (.Alert | .Badge | .Sound)
            let settings:UIUserNotificationSettings = UIUserNotificationSettings(forTypes: userNotificationTypes, categories: nil)
            application.registerUserNotificationSettings(settings)
            application.registerForRemoteNotifications()
        }

        return true;
    }

    func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
        println("didRegisterForRemoteNotificationsWithDeviceToken")
        let installation = PFInstallation.currentInstallation()
        installation.setDeviceTokenFromData(deviceToken)
        installation.saveInBackground()
    }
}

Tak więc, gdy tylko aplikacja zostanie uruchomiona po raz pierwszy, użytkownik jest proszony o przyznanie tych uprawnień.

To, co chcę zrobić, to tylko zachęta do uzyskania tych uprawnień po wykonaniu określonej czynności (np. Podczas przeglądania funkcji aplikacji), więc mogę podać nieco więcej kontekstu, dlaczego chcemy, aby zezwalały na powiadomienia push .

Czy jest to tak proste, jak tylko skopiowanie poniższego kodu w odpowiednim ViewController, gdzie będę oczekiwał monitowania użytkownika?

// In 'MainViewController.swift' file

func promptUserToRegisterPushNotifications() {
        // Register for Push Notifications
        self.pushNotificationsController = PushNotificationController()

        if application.respondsToSelector("registerUserNotificationSettings:") {
            println("registerUserNotificationSettings.RegisterForRemoteNotificatios")
            let userNotificationTypes: UIUserNotificationType = (.Alert | .Badge | .Sound)
            let settings:UIUserNotificationSettings = UIUserNotificationSettings(forTypes: userNotificationTypes, categories: nil)
            application.registerUserNotificationSettings(settings)
            application.registerForRemoteNotifications()
        }
}

func application(application: UIApplication,    didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
        println("didRegisterForRemoteNotificationsWithDeviceToken")
        let installation = PFInstallation.currentInstallation()
        installation.setDeviceTokenFromData(deviceToken)
        installation.saveInBackground()
}

dzięki!


11
2018-06-13 09:26


pochodzenie


Tak, możesz po prostu przenieść ten kod do wykonania we właściwym czasie :) - SomeGuy
dzięki SomeGuy! Wypróbuję go, gdy tylko wrócę do mojego projektu i zgłoś się, jeśli potrzebuję dodatkowej pomocy. Dzięki! - Simon
Jak otrzymasz aplikację: UIApplication do innego kontrolera viewController? - denislexic
Hej, czy mógłbyś zaakceptować moją odpowiedź, gdyby to pomogło? :) - LinusGeffarth
@denislexic, co zrobiłem został zadeklarowany jako zmienna globalna i viewController takich jak let application: UIApplication = UIApplication.sharedApplication(). Wydawało się, że zadziałało to dla mnie. :) - Simon


Odpowiedzi:


Odpowiedź jest prosta. Jeśli chcesz, aby użytkownik był monitowany w innym czasie, na przykład po naciśnięciu przycisku, po prostu przenieś kod dotyczący żądania do tej funkcji (lub zadzwoń do promptUserToRegisterPushNotifications() skądinąd).

Aby uzyskać chwyt application zmienna poza AppDelegate, po prostu wykonaj to:

let application = UIApplication.shared

Mam nadzieję, że pomaga :)


5
2018-06-13 09:32



Dziękuję Linus. :) W tej chwili jestem na swoim komputerze, aby to wypróbować, i to jest to, co założyłem, więc dziękuję za wyjaśnienia. :) spróbuje i zgłoś informacje! Dzięki! - Simon
Cześć Linus, uwierz lub nie, przyjmuję tylko wdrożenie tego rozwiązania. Zrobiłem to, co sugerowałeś i przeniosłeś promptUserToRegisterPushNotifications () metody do innego kontrolera widoku, ale teraz mam problem jako Denislexic powyżej wychowany .. jak mogę odwołać się do application : UIApplication zapisać ustawienia w moim pliku MainViewController.swift? - Simon
Nie ma problemu;) Ahm, dlaczego nie po prostu wkładasz całość promptUserToRegisterPushNotifications() metoda do twojej MainVC? - LinusGeffarth
Zrobiłem to, ale w metodzie jest if application.respondsToSelector("registerUserNotificationSettings:") że moja MainVC nic nie wie o tym application. Nie jestem pewien, czy muszę zadeklarować wystąpienie application w MainVC? Jeśli tak to jak? - Simon
fajne, więc znalazłem rozwiązanie problemu "aplikacji". Po prostu w moim MainViewController, zadeklarowałem application zmienna jak let application: UIApplication = UIApplication.sharedApplication(). To rozwiązało mój problem. :) Dzięki Linus! - Simon


To jest dla Swift 2. Umieściłem promptUserToRegisterPushNotifications () w MainViewController.swift, ale zostawiłem didRegisterForRemoteNotificationsWithDeviceToken w AppDelegate, ponieważ nie działało, gdy umieściłem go na tym samym MainViewController.swift.

// In 'MainViewController.swift' file
func promptUserToRegisterPushNotifications() {
    // Register for Push Notifications

    let application: UIApplication = UIApplication.sharedApplication()

    if application.respondsToSelector(#selector(UIApplication.registerUserNotificationSettings(_:))) {
        print("registerUserNotificationSettings.RegisterForRemoteNotificatios")

        let notificationSettings = UIUserNotificationSettings(
            forTypes: [.Badge, .Sound, .Alert], categories: nil)
        application.registerUserNotificationSettings(notificationSettings) // Register for Remote Push Notifications
        application.registerForRemoteNotifications()
    }
}


// In AppDelegate
func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
    let tokenChars = UnsafePointer<CChar>(deviceToken.bytes)
    var tokenString = ""

    for i in 0..<deviceToken.length {
        tokenString += String(format: "%02.2hhx", arguments: [tokenChars[i]])
    }

    NSUserDefaults.standardUserDefaults().setObject(tokenString, forKey: "deviceToken")

    print("Device Token:", tokenString)

}

3
2018-05-26 09:58





Jest to metoda, którą napisałem w kodzie i działa poprawnie po uruchomieniu (didFinishLaunch)

class func registerNotification() {
    if #available(iOS 10.0, *) {
        // push notifications
        UNUserNotificationCenter.current().requestAuthorization(options: [.sound, .alert, .badge]) {
            (granted, error) in
            if (granted) {
                UIApplication.shared.registerForRemoteNotifications()
            }
        }

        let center  = UNUserNotificationCenter.current()
        center.delegate = AppManager.appDel()
        center.requestAuthorization(options: [.sound, .alert, .badge]) { (granted, error) in
            if error == nil {
                UIApplication.shared.registerForRemoteNotifications()
            }
        }
    } else {
        UIApplication.shared.registerUserNotificationSettings(UIUserNotificationSettings(types: [.badge, .sound, .alert], categories: nil))
        UIApplication.shared.registerForRemoteNotifications()
    }
}

1
2017-07-25 07:07