Pytanie Ustawienia Powiadomień Push w systemie iOS - Odmowa zezwolenia kontra Zezwolenie Nigdy nie żądano


Czy możliwe jest rozróżnienie przypadków, w których

  1. użytkownik iOS jawnie odmówił uprawnień do powiadamiania użytkownika, oraz
  2. użytkownik iOS nigdy nie został poproszony o pozwolenie?

Moja sytuacja: w przeszłości prosiłem o pozwolenie na zgłaszanie użytkowników, ale nigdy nie śledziłem żądań. Później przestałem próbować zarejestrować jakiekolwiek ustawienia powiadomień. Teraz chciałbym ponownie wprowadzić powiadomienia użytkowników.

Po znaczącym wydarzeniu w aplikacji, moim planem jest wyświetlenie pewnego rodzaju interfejsu użytkownika, który wyjaśnia korzyści wynikające z powiadamiania użytkowników. Jeśli jednak użytkownik już odmówił, wolałbym pokazać osobny interfejs użytkownika, który może je przenieść do Settings.app.

Obecnie używam -[UIApplication currentUserNotificationSettings] aby pobrać aktualne ustawienia, ale wygląda na to, że to się zwraca UIUserNotificationTypeNone dla obu wyżej opisanych przypadków.


21
2018-02-28 17:43


pochodzenie




Odpowiedzi:


Osobiście nie znalazłem sposobu, aby to ustalić za pomocą szybkiego zapytania SDK iOS.

Jednak udało mi się to samemu śledzić podczas nagrywania -[UIApplication application:didRegisterUserNotificationSettings:] jest nazywany.

Kiedy iOS wywołuje tę metodę, możesz być pewien, że użytkownik został poproszony o uprawnienia do zgłaszania użytkowników i (co ważniejsze) zaakceptował lub odmówił.

Przechowując ten fakt, można później sprawdzić tę wartość, aby ustalić, czy monit został wyświetlony przed, czy nie.

Przykładowy kod:

- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
    [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"ABHasPromptedForUserNotification"];
    //... your other notification registration handling... 
}

- (BOOL)hasPromptedForUserNotification {
    return [[NSUserDefaults standardUserDefaults] boolForKey:@"ABHasPromptedForUserNotification"];
}

FYI: Stwierdziłem, że lepiej ustawić "ABHasPromptedForUserNotification" tak jak w in -[UIApplication application:didRegisterUserNotificationSettings:] raczej niż kiedy dzwonię -[UIApplication registerForRemoteNotifications] tak jak w niektórych sytuacjach użytkownik może być pokazywany podpowiedzi wiele razy. Może się tak zdarzyć, gdy użytkownik naświetli aplikację lub podejmie połączenie. W takich przypadkach monit zostanie ukryty przez iOS i wyświetlony ponownie, jeśli następnym razem zadzwonisz -[UIApplication registerForRemoteNotifications]. Ustawienie tego ustawienia w delegate zapobiega myśleniu, że użytkownik został wcześniej zapytany i nie zostanie ponownie zapytany w tych skrajnych przypadkach.


24
2018-02-28 19:44



co jeśli użytkownik wymusi zamknięcie aplikacji po wyświetleniu okna uprawnień? - iSaalis
Jak wspomniano powyżej, nie biorąc pod uwagę monitu pokazanego, dopóki delegat nie będzie obsługiwał tej sprawy. - Glen T


Nie.

I wierzę, że robi się to celowo. Zwykle jest to rejestracja zdalnych powiadomień przy każdym uruchomieniu aplikacji. Oznacza to, że użytkownik nie powinien widzieć okna uprawnień przy każdym otwarciu aplikacji. iOS zrobi to automatycznie. Jeśli jednak wyświetli się dodatkowy ekran przed zażądaniem uprawnień, firma Apple nie może zezwolić użytkownikowi na stwierdzenie, czy użytkownik odmówił uprawnień w przeszłości, aby można było wyświetlić ekran opisujący, w jaki sposób użytkownik może włączać swoje uprawnienia za pośrednictwem ustawień za każdym razem, gdy tego chce. Spowoduje to cofnięcie wszystkich Apple, aby zatrzymać irytujących użytkowników.

W twoim przypadku musisz przestrzegać tej samej strategii. Pokaż tylko jeden typ ekranu objaśniającego w obu scenariuszach i zapisz wybór użytkownika NSUserDefaults aby wiedzieć, czy nie wolno ci tego pokazywać ponownie. Użytkownicy, którzy wcześniej odmawiali uprawnień, nie zobaczą okna uprawnień. Chociaż będziesz miał jedną korzyść dla nowych użytkowników (co oczywiście chcesz osiągnąć): możesz wielokrotnie wyświetlać ekran wyjaśniający, jeśli użytkownik go anuluje.


2
2018-03-19 18:32





Jeśli obsługujesz system iOS 10 lub nowszy, struktura UNUserNotifications zapewnia większą szczegółowość.

let current = UNUserNotificationCenter.current()
current.getNotificationSettings(completionHandler: { (settings) in
    if settings.authorizationStatus == .notDetermined {
        // Not requested
    }

    if settings.authorizationStatus == .denied {
        // User said Don't allow
    }
})

1
2017-11-17 10:11





Na wypadek, gdyby ktoś musiał sprawdzić stary interfejs API UIUserNotification w celu uzyskania uprawnień dostępu. poniższy kod jest wypróbowany i przetestowany.

- (BOOL)isUserNotificationAllowed {
    UIUserNotificationType types = [[UIApplication sharedApplication] currentUserNotificationSettings].types;
    if(types & UIUserNotificationTypeBadge || types & UIUserNotificationTypeSound || types & UIUserNotificationTypeAlert){
        return YES;
    }
    else {
        return NO;
    }
}

0
2018-04-03 07:40