programing

iPhone에서 사용자가 푸시 알림을 활성화했는지 확인합니다.

yellowcard 2023. 4. 10. 21:32
반응형

iPhone에서 사용자가 푸시 알림을 활성화했는지 확인합니다.

사용자가 설정을 통해 내 응용 프로그램에 대한 푸시 알림을 활성화 또는 비활성화했는지 확인할 수 있는 방법을 찾고 있습니다.

★★enabledRemoteNotificationsTypes마스크도 체크하고

예를 들어 다음과 같습니다.

UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
if (types == UIRemoteNotificationTypeNone) 
   // blah blah blah

iOS8 이상:

[[UIApplication sharedApplication] isRegisteredForRemoteNotifications]

quantumpotato 문제:

서 ★★★★★types에 의해 주어집니다.

UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];

쓸 수 있다

if (types & UIRemoteNotificationTypeAlert)

대신

if (types == UIRemoteNotificationTypeNone) 

알림이 활성화되었는지 여부만 확인할 수 있습니다(사운드, 배지, 알림 센터 등은 걱정하지 마십시오).첫 줄( 「」 「」 「 」types & UIRemoteNotificationTypeAlert가 반환됩니다.YES" 스타일로 "경고"가 "경고"로 설정되어 있는 경우,NO다른 설정에 관계없이 "경고 유형"이 "없음"으로 설정된 경우.

iOS의 최신 버전에서는 이 방법이 더 이상 사용되지 않습니다.iOS 7과 iOS 8을 모두 지원하려면 다음을 사용합니다.

UIApplication *application = [UIApplication sharedApplication];

BOOL enabled;

// Try to use the newer isRegisteredForRemoteNotifications otherwise use the enabledRemoteNotificationTypes.
if ([application respondsToSelector:@selector(isRegisteredForRemoteNotifications)])
{
    enabled = [application isRegisteredForRemoteNotifications];
}
else
{
    UIRemoteNotificationType types = [application enabledRemoteNotificationTypes];
    enabled = types & UIRemoteNotificationTypeAlert;
}

swift4.0, iOS11 코드 갱신

import UserNotifications

UNUserNotificationCenter.current().getNotificationSettings { (settings) in
   print("Notification settings: \(settings)")
   guard settings.authorizationStatus == .authorized else { return }

   //Not authorised 
   UIApplication.shared.registerForRemoteNotifications()
}

swift 3.0 코드, iOS10

    let isRegisteredForRemoteNotifications = UIApplication.shared.isRegisteredForRemoteNotifications
    if isRegisteredForRemoteNotifications {
        // User is registered for notification
    } else {
        // Show alert user is not registered for notification
    }

iOS9부터 신속한 2.0 UIRemote 알림유형이 더 이상 사용되지 않습니다. 다음 코드를 사용하십시오.

let notificationType = UIApplication.shared.currentUserNotificationSettings!.types
if notificationType == UIUserNotificationType.none {
        // Push notifications are disabled in setting by user.
    }else{
  // Push notifications are enabled in setting by user.

}

알림 푸시 활성화 여부 확인만 하면 됩니다.

    if notificationType == UIUserNotificationType.badge {
        // the application may badge its icon upon a notification being received
    }
    if notificationType == UIUserNotificationType.sound {
        // the application may play a sound upon a notification being received

    }
    if notificationType == UIUserNotificationType.alert {
        // the application may display an alert upon a notification being received
    }

아래에는 iOS8과 iOS7(및 하위 버전)을 모두 망라한 완전한 예가 나와 있습니다.iOS8 이전 버전에서는 "원격 알림 비활성화"와 "잠금 화면에서 보기만 활성화"를 구분할 수 없습니다.

BOOL remoteNotificationsEnabled = false, noneEnabled,alertsEnabled, badgesEnabled, soundsEnabled;

if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerUserNotificationSettings:)]) {
    // iOS8+
    remoteNotificationsEnabled = [UIApplication sharedApplication].isRegisteredForRemoteNotifications;

    UIUserNotificationSettings *userNotificationSettings = [UIApplication sharedApplication].currentUserNotificationSettings;

    noneEnabled = userNotificationSettings.types == UIUserNotificationTypeNone;
    alertsEnabled = userNotificationSettings.types & UIUserNotificationTypeAlert;
    badgesEnabled = userNotificationSettings.types & UIUserNotificationTypeBadge;
    soundsEnabled = userNotificationSettings.types & UIUserNotificationTypeSound;

} else {
    // iOS7 and below
    UIRemoteNotificationType enabledRemoteNotificationTypes = [UIApplication sharedApplication].enabledRemoteNotificationTypes;

    noneEnabled = enabledRemoteNotificationTypes == UIRemoteNotificationTypeNone;
    alertsEnabled = enabledRemoteNotificationTypes & UIRemoteNotificationTypeAlert;
    badgesEnabled = enabledRemoteNotificationTypes & UIRemoteNotificationTypeBadge;
    soundsEnabled = enabledRemoteNotificationTypes & UIRemoteNotificationTypeSound;
}

if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerUserNotificationSettings:)]) {
    NSLog(@"Remote notifications enabled: %@", remoteNotificationsEnabled ? @"YES" : @"NO");
}

NSLog(@"Notification type status:");
NSLog(@"  None: %@", noneEnabled ? @"enabled" : @"disabled");
NSLog(@"  Alerts: %@", alertsEnabled ? @"enabled" : @"disabled");
NSLog(@"  Badges: %@", badgesEnabled ? @"enabled" : @"disabled");
NSLog(@"  Sounds: %@", soundsEnabled ? @"enabled" : @"disabled");

스위프트 3 이상

    if #available(iOS 10.0, *) {
        UNUserNotificationCenter.current().getNotificationSettings(completionHandler: { (settings: UNNotificationSettings) in
            // settings.authorizationStatus == .authorized
        })
    } else {
        return UIApplication.shared.currentUserNotificationSettings?.types.contains(UIUserNotificationType.alert) ?? false
    }

iOS10+용 RxSwift 감시 버전:

import UserNotifications
extension UNUserNotificationCenter {
    static var isAuthorized: Observable<Bool> {
        return Observable.create { observer in
            DispatchQueue.main.async {
                current().getNotificationSettings(completionHandler: { (settings: UNNotificationSettings) in
                    if settings.authorizationStatus == .authorized {
                        observer.onNext(true)
                        observer.onCompleted()
                    } else {
                        current().requestAuthorization(options: [.badge, .alert, .sound]) { (granted, error) in
                            observer.onNext(granted)
                            observer.onCompleted()
                        }
                    }
                })
            }
            return Disposables.create()
        }
    }
}

를 모두 iOS8을 사용할 isRegisteredForRemoteNotifications신신을 사용했다.currentUserNotificationSettings제 테스트에서 잘 작동했어요

+ (BOOL)notificationServicesEnabled {
    BOOL isEnabled = NO;

    if ([[UIApplication sharedApplication] respondsToSelector:@selector(currentUserNotificationSettings)]){
        UIUserNotificationSettings *notificationSettings = [[UIApplication sharedApplication] currentUserNotificationSettings];

        if (!notificationSettings || (notificationSettings.types == UIUserNotificationTypeNone)) {
            isEnabled = NO;
        } else {
            isEnabled = YES;
        }
    } else {
        UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
        if (types & UIRemoteNotificationTypeAlert) {
            isEnabled = YES;
        } else{
            isEnabled = NO;
        }
    }

    return isEnabled;
}

유감스럽게도 이들 솔루션 중 실제로 문제를 해결하는 것은 없습니다.결국 API는 관련 정보를 제공하는 데 매우 부족하기 때문입니다.어떤 방법을 사용하든 몇 가지 추측을 할 수 있습니다.currentUserNotificationSettings (iOS8+) 해결방법은 과 같은 것 만,isRegisteredForRemoteNotifications확실한 대답에 가깝지만 실제로는 그렇지 않습니다.

다음 사항을 고려하십시오.

isRegisteredForRemoteNotifications서서: :

응용 프로그램이 현재 원격 알림에 등록되어 있는 경우 시스템 전체의 설정을 고려하여 YES를 반환합니다.

, 단순히 '일단'을 던지면NSLog동작을 관찰하기 위해 앱 대리자에게 전달해야 합니다.이 동작은 우리가 예상한 대로 동작하지 않습니다.실제로 이 앱/디바이스에 대해 활성화된 원격 알림과 직접 관련이 있습니다. 반환됩니다.YESYES활성화하지 않은 이 원격 할 수 때문에 및를 수행할 수 때문입니다.iOS8에서는 사용자가 알림을 활성화하지 않은 상태에서 앱이 원격 알림을 등록하거나 단말기로 전송할 수 있기 때문에 사용자가 알림을 켜지 않으면 알림, 배지 및 사운드를 수행할 수 없습니다.자동 통지는 통지가 꺼진 경우에도 계속 수행할 수 있는 좋은 예입니다.

currentUserNotificationSettings중 .

경고는 Badges on Sound is on none on.

다른 요인이나 통지 스위치 자체에 대해서는 전혀 알 수 없습니다.

실제로 사용자가 배지, 사운드 및 경보를 끌 수 있지만 잠금 화면 또는 알림 센터에 여전히 표시될 수 있습니다.이 사용자는 푸시 알림을 받고 잠금 화면과 알림 센터에서 모두 볼 수 있습니다. 있지만 알림 는 켜져 있습니다.currentUserNotificationSettings 돌아온다: will반 will will니 will will will will will will 。UIUserNotificationTypeNone런런경경경경경경이것은, 유저의 실제 설정을 나타내는 것은 아닙니다.

몇 가지 추측은 다음과 같습니다.

  • isRegisteredForRemoteNotificationsNO그러면 이 디바이스가 리모트 알림에 정상적으로 등록되지 않았다고 가정할 수 있습니다.
  • 한 후, 「」에 합니다.application:didRegisterUserNotificationSettings:이 시점에서 사용자 알림 설정이 포함되어 있습니다.사용자가 처음 등록되기 때문에 이 설정은 사용자가 권한 요구와 관련하여 선택한 항목을 나타냅니다.설정이 다음 이외의 것에 해당하는 경우:UIUserNotificationTypeNone푸시 허가가 허가되고, 그렇지 않으면 거부되었습니다.그 이유는 원격 등록 프로세스를 시작하는 순간부터 사용자는 승인 또는 거부할 수 있는 기능만 가지고 있으며, 승인 초기 설정은 등록 프로세스에서 설정한 설정이기 때문입니다.

답을 완성하기 위해서는 이런 식으로...

UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
switch (types) {
   case UIRemoteNotificationTypeAlert:
   case UIRemoteNotificationTypeBadge:
       // For enabled code
       break;
   case UIRemoteNotificationTypeSound:
   case UIRemoteNotificationTypeNone:
   default:
       // For disabled code
       break;
}

edit: 이것은 올바르지 않습니다.이것들은 비트 단위이기 때문에 스위치에서는 동작하지 않기 때문에, 다음과 같이 종료했습니다.

UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
UIRemoteNotificationType typesset = (UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge);
if((types & typesset) == typesset)
{
    CeldaSwitch.chkSwitch.on = true;
}
else
{
    CeldaSwitch.chkSwitch.on = false;
}

및 iOS7을 실제로 enabledRemoteNotificationTypes, 그렇지해 보세요.UIRemoteNotificationTypeNone.

그러나 iOS8의 경우 반드시 다음 웹 사이트에서만 확인하는 만으로는 충분하지 않습니다.isRegisteredForRemoteNotifications 때, 이 때, 이 때, 이 때, 이 때, 이 때, 이 때, 이 때, 이 때, 이 때, 이 때, 이 때, 이, 이, 이, 이, 이, 이, 이, 이, 이, 이, 이, 이, 이, 이, 이, 이, 이, 이, 이, 이, 이, 이, 이, 이, 이,application.currentUserNotificationSettings.types하지 않음)UIUserNotificationTypeNone!

isRegisteredForRemoteNotifications는 될 수 .currentUserNotificationSettings.typesUIUserNotificationTypeNone.

iOS8+ (객체 C)

#import <UserNotifications/UserNotifications.h>


[[UNUserNotificationCenter currentNotificationCenter]getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {

    switch (settings.authorizationStatus) {
          case UNAuthorizationStatusNotDetermined:{

            break;
        }
        case UNAuthorizationStatusDenied:{

            break;
        }
        case UNAuthorizationStatusAuthorized:{

            break;
        }
        default:
            break;
    }
}];
UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
if (types & UIRemoteNotificationTypeAlert)
    // blah blah blah
{
    NSLog(@"Notification Enabled");
}
else
{
    NSLog(@"Notification not enabled");
}

UIRemote 알림이 표시됩니다.UIApplication에서 입력합니다.이 앱의 종류를 쉽게 확인할 수 있는 설정 내 푸시 알림 상태를 나타냅니다.

@제공하는 하여 iOS 만, 문제 @Shaheen Ghiassy를 찾습니다.enabledRemoteNotificationTypes그래서 제가 찾은 솔루션은isRegisteredForRemoteNotificationsenabledRemoteNotificationTypesiOS 8에서는 권장되지 않습니다.다음은 나에게 딱 맞는 최신 솔루션입니다.

- (BOOL)notificationServicesEnabled {
    BOOL isEnabled = NO;
    if ([[UIApplication sharedApplication] respondsToSelector:@selector(currentUserNotificationSettings)]){
        UIUserNotificationSettings *notificationSettings = [[UIApplication sharedApplication] currentUserNotificationSettings];

        if (!notificationSettings || (notificationSettings.types == UIUserNotificationTypeNone)) {
            isEnabled = NO;
        } else {
            isEnabled = YES;
        }
    } else {

        if ([[UIApplication sharedApplication] isRegisteredForRemoteNotifications]) {
            isEnabled = YES;
        } else{
            isEnabled = NO;
        }
    }
    return isEnabled;
}

이 호출할 수 할 수 .Boolvalue에 할 수 있습니다.value는 스트링 으로 변환됩니다.

NSString *str = [self notificationServicesEnabled] ? @"YES" : @"NO";

다른 사람에게도 도움이 되기를 바랍니다:) 해피 코딩.

iOS 7까지는 잭의 답이 완벽하게 맞았지만 iOS 8이 도착한 이후 달라졌다.enabled Remote Notification 이므로iOS 8 이후로는 유형이 더 이상 사용되지 않습니다.iOS 8 이상에서는 isRegisteredForRemoteNotifications를 사용해야 합니다.

  • iOS 7 이전 버전인 경우 --> enabled Remote Notification 사용종류들
  • iOS 8 이후의 경우 --> isRegisteredForRemoteNotifications 를 사용합니다.

Swifty 솔루션은 나에게 잘 작동했습니다(iOS8+).

방법:

func isNotificationEnabled(completion:@escaping (_ enabled:Bool)->()){
    if #available(iOS 10.0, *) {
        UNUserNotificationCenter.current().getNotificationSettings(completionHandler: { (settings: UNNotificationSettings) in
            let status =  (settings.authorizationStatus == .authorized)
            completion(status)
        })
    } else {
        if let status = UIApplication.shared.currentUserNotificationSettings?.types{
            let status = status.rawValue != UIUserNotificationType(rawValue: 0).rawValue
            completion(status)
        }else{
            completion(false)
        }
    }
}

사용방법:

isNotificationEnabled { (isEnabled) in
            if isEnabled{
                print("Push notification enabled")
            }else{
                print("Push notification not enabled")
            }
        }

참조

참조:

이것은 옳다

if (types & UIRemoteNotificationTypeAlert)

(UIRemote Notification으로서) 다음도 정답입니다.TypeNone은 0 입니다).

if (types == UIRemoteNotificationTypeNone) 

다음을 참조하다

NSLog(@"log:%d",0 & 0); ///false
NSLog(@"log:%d",1 & 1); ///true
NSLog(@"log:%d",1<<1 & 1<<1); ///true
NSLog(@"log:%d",1<<2 & 1<<2); ///true
NSLog(@"log:%d",(0 & 0) && YES); ///false
NSLog(@"log:%d",(1 & 1) && YES); ///true
NSLog(@"log:%d",(1<<1 & 1<<1) && YES); ///true
NSLog(@"log:%d",(1<<2 & 1<<2) && YES); ///true

Xamarin.ios에서의 방법은 다음과 같습니다.

public class NotificationUtils
{
    public static bool AreNotificationsEnabled ()
    {
        var settings = UIApplication.SharedApplication.CurrentUserNotificationSettings;
        var types = settings.Types;
        return types != UIUserNotificationType.None;
    }
}

iOS 10+를 지원하는 경우 UNUser Notification Center 메서드만 사용하십시오.

Xamarin에서는 위의 모든 솔루션이 나에게 효과가 있는 것은 아닙니다.대신 사용하는 것은 다음과 같습니다.

public static bool IsRemoteNotificationsEnabled() {
    return UIApplication.SharedApplication.CurrentUserNotificationSettings.Types != UIUserNotificationType.None;
}

설정에서 알림 상태를 변경한 후에도 라이브 업데이트가 표시됩니다.

@ZacBowling의 솔루션(https://stackoverflow.com/a/1535427/2298002)에서 작성된 간단한 복사 및 붙여넣기 코드

또한 사용자가 앱 설정으로 이동하여 즉시 활성화할 수 있도록 합니다.

또, 로케이션 서비스가 유효하게 되어 있는지를 확인하기 위한 솔루션도 추가했습니다(설정도 실시합니다).

// check if notification service is enabled
+ (void)checkNotificationServicesEnabled
{
    if (![[UIApplication sharedApplication] isRegisteredForRemoteNotifications])
    {
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Notification Services Disabled!"
                                                            message:@"Yo don't mess around bro! Enabling your Notifications allows you to receive important updates"
                                                           delegate:self
                                                  cancelButtonTitle:@"Cancel"
                                                  otherButtonTitles:@"Settings", nil];

        alertView.tag = 300;

        [alertView show];

        return;
    }
}

// check if location service is enabled (ref: https://stackoverflow.com/a/35982887/2298002)
+ (void)checkLocationServicesEnabled
{
    //Checking authorization status
    if (![CLLocationManager locationServicesEnabled] || [CLLocationManager authorizationStatus] == kCLAuthorizationStatusDenied)
    {

        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Location Services Disabled!"
                                                            message:@"You need to enable your GPS location right now!!"
                                                           delegate:self
                                                  cancelButtonTitle:@"Cancel"
                                                  otherButtonTitles:@"Settings", nil];

        //TODO if user has not given permission to device
        if (![CLLocationManager locationServicesEnabled])
        {
            alertView.tag = 100;
        }
        //TODO if user has not given permission to particular app
        else
        {
            alertView.tag = 200;
        }

        [alertView show];

        return;
    }
}

// handle bringing user to settings for each
+ (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{

    if(buttonIndex == 0)// Cancel button pressed
    {
        //TODO for cancel
    }
    else if(buttonIndex == 1)// Settings button pressed.
    {
        if (alertView.tag == 100)
        {
            //This will open ios devices location settings
            [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs:root=LOCATION_SERVICES"]];
        }
        else if (alertView.tag == 200)
        {
            //This will open particular app location settings
            [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
        }
        else if (alertView.tag == 300)
        {
            //This will open particular app location settings
            [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
        }
    }
}

GLHF!

언급URL : https://stackoverflow.com/questions/1535403/determine-on-iphone-if-user-has-enabled-push-notifications

반응형