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
동작을 관찰하기 위해 앱 대리자에게 전달해야 합니다.이 동작은 우리가 예상한 대로 동작하지 않습니다.실제로 이 앱/디바이스에 대해 활성화된 원격 알림과 직접 관련이 있습니다. 반환됩니다.YES
YES
활성화하지 않은 이 원격 할 수 때문에 및를 수행할 수 때문입니다.iOS8에서는 사용자가 알림을 활성화하지 않은 상태에서 앱이 원격 알림을 등록하거나 단말기로 전송할 수 있기 때문에 사용자가 알림을 켜지 않으면 알림, 배지 및 사운드를 수행할 수 없습니다.자동 통지는 통지가 꺼진 경우에도 계속 수행할 수 있는 좋은 예입니다.
currentUserNotificationSettings
중 .
경고는 Badges on Sound is on none on.
다른 요인이나 통지 스위치 자체에 대해서는 전혀 알 수 없습니다.
실제로 사용자가 배지, 사운드 및 경보를 끌 수 있지만 잠금 화면 또는 알림 센터에 여전히 표시될 수 있습니다.이 사용자는 푸시 알림을 받고 잠금 화면과 알림 센터에서 모두 볼 수 있습니다. 있지만 알림 는 켜져 있습니다.currentUserNotificationSettings
돌아온다: will반 will will니 will will will will will will 。UIUserNotificationTypeNone
런런경경경경경경이것은, 유저의 실제 설정을 나타내는 것은 아닙니다.
몇 가지 추측은 다음과 같습니다.
isRegisteredForRemoteNotifications
NO
그러면 이 디바이스가 리모트 알림에 정상적으로 등록되지 않았다고 가정할 수 있습니다.- 한 후, 「」에 합니다.
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.types
UIUserNotificationTypeNone
.
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
그래서 제가 찾은 솔루션은isRegisteredForRemoteNotifications
enabledRemoteNotificationTypes
iOS 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;
}
이 호출할 수 할 수 .Bool
value에 할 수 있습니다.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
'programing' 카테고리의 다른 글
git 오류: 일부 참조를 원격으로 푸시하지 못했습니다. (0) | 2023.04.10 |
---|---|
병렬 리스트의 해당 값에 따라 리스트 정렬 (0) | 2023.04.10 |
How to create a link inside a cell using EPPlus (0) | 2023.04.10 |
bash 스크립트에서 파일 이름 확장자를 확인하는 방법 (0) | 2023.04.10 |
어레이의 각 루프에 대해를 사용하려면 어떻게 해야 합니까? (0) | 2023.04.10 |