Yanıtlar:
enabledRemoteNotificationsTypes
Maskeyi arayın ve kontrol edin.
Örneğin:
UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
if (types == UIRemoteNotificationTypeNone)
// blah blah blah
iOS8 ve üstü:
[[UIApplication sharedApplication] isRegisteredForRemoteNotifications]
iOS 8
ve üstü için yanlış çünkü yalnızca kullanıcının uzaktan bildirim için kayıtlı olup olmadığını kontrol eder. Belgelere göre:This method reflects only the successful completion of the remote registration process that begins when you call the registerForRemoteNotifications method. This method does not reflect whether remote notifications are actually available due to connectivity issues. The value returned by this method takes into account the user’s preferences for receiving remote notifications.
[[UIApplication sharedApplication] currentUserNotificationSettings];
kuantumpotato sorunu:
Nerede types
verilir?
UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
biri kullanabilir
if (types & UIRemoteNotificationTypeAlert)
onun yerine
if (types == UIRemoteNotificationTypeNone)
yalnızca bildirimlerin etkin olup olmadığını kontrol etmenizi sağlar (ve sesler, rozetler, bildirim merkezi vb. hakkında endişelenmeyin). "Uyarı Stili", "Afişler" veya "Uyarılar " olarak ayarlanırsa ve "Uyarı Stili", diğer ayarlardan bağımsız olarak "Yok" olarak ayarlanırsa, ilk kod satırı ( types & UIRemoteNotificationTypeAlert
) döndürülür .YES
NO
grantedSettings.types.contains(notificationType)
İOS'un en son sürümünde bu yöntem artık kullanımdan kaldırıldı. Hem iOS 7 hem de iOS 8'i desteklemek için şunu kullanın:
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;
}
UserNotifications
. Maalesef şimdi tam bir cevabım yok.
Swift4.0, iOS11 için güncellenmiş kod
import UserNotifications
UNUserNotificationCenter.current().getNotificationSettings { (settings) in
print("Notification settings: \(settings)")
guard settings.authorizationStatus == .authorized else { return }
//Not authorised
UIApplication.shared.registerForRemoteNotifications()
}
Swift3.0, iOS10 için kod
let isRegisteredForRemoteNotifications = UIApplication.shared.isRegisteredForRemoteNotifications
if isRegisteredForRemoteNotifications {
// User is registered for notification
} else {
// Show alert user is not registered for notification
}
İOS9'dan, swift 2.0 UIRemoteNotificationType kullanımdan kaldırıldı, aşağıdaki kodu kullanın
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.
}
Push bildirimlerinin etkin olup olmadığını kontrol edin
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
}
Aşağıda hem iOS8 hem de iOS7'yi (ve daha düşük sürümleri) kapsayan eksiksiz bir örnek bulacaksınız. İOS8'den önce "uzaktan bildirimler devre dışı" ile "yalnızca kilit ekranında görüntüle etkin" arasında ayrım yapamayacağınızı lütfen unutmayın .
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");
Hızlı 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
}
İOS10 + için RxSwift Gözlenebilir Sürüm:
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()
}
}
}
getNotificationSettings(...)
eşzamansızdır, bu nedenle içerideki geri dönüş yok
Hem iOS8 hem de daha düşük sürümlerini desteklemeye çalışırken isRegisteredForRemoteNotifications
, Kevin'in önerdiği gibi kullanmakta şansım yoktu . Bunun yerine currentUserNotificationSettings
testlerimde harika sonuç verdi.
+ (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;
}
isEnabled = NO;
sizin de if
o kadar başlatıldı edildiği gibi durumlarda gerekli değildirNO
Ne yazık ki bu çözümlerin hiçbiri sorunu gerçekten çözmemektedir, çünkü günün sonunda API'ler ilgili bilgileri sağlama konusunda ciddi şekilde eksiktir. Birkaç tahmin yapabilirsiniz, ancak currentUserNotificationSettings
(iOS8 +) kullanmak mevcut formda soruyu gerçekten cevaplamak için yeterli değildir. Her ne kadar burada birçok çözüm ya bu ya isRegisteredForRemoteNotifications
da daha kesin bir cevap olduğunu düşündürüyor olsa da , gerçekten değil.
Bunu düşün:
ile isRegisteredForRemoteNotifications
dokümantasyon devletler:
Uygulama şu anda sistem çapındaki ayarları dikkate alarak uzaktan bildirimler için kayıtlıysa EVET döndürür ...
Ancak NSLog
, davranışı gözlemlemek için uygulama temsilcinize basitçe atarsanız , bunun çalışacağını tahmin ettiğimiz şekilde davranmadığı açıktır. Aslında bu uygulama / cihaz için etkinleştirilen uzaktan bildirimlerle doğrudan ilgilidir. İlk kez etkinleştirildiğinde bu her zaman geri dönecektir YES
. Bunları ayarlarda (bildirimlerde) kapatmak bile, bunun geri dönmesine neden olacaktır YES
, çünkü iOS8'den itibaren, bir uygulama uzaktan bildirimler için kaydolabilir ve hatta kullanıcı bildirimleri etkinleştirilmeden bir cihaza gönderebilir, Uyarı yapamayabilir, Kullanıcı açmadan Rozetler ve Ses. Sessiz bildirimler, bildirimler kapalı olsa bile yapmaya devam edebileceğiniz şeylere iyi bir örnektir.
Bildiğim kadarıyla currentUserNotificationSettings
bu dört şeyden birini gösterir:
Uyarılar açık Rozetler açık Ses açık Hiçbiri açık.
Bu, diğer faktörler veya Bildirim anahtarının kendisi hakkında kesinlikle hiçbir belirti vermez.
Bir kullanıcı aslında rozetleri, sesleri ve uyarıları kapatabilir, ancak yine de kilit ekranında veya bildirim merkezinde gösterebilir. Bu kullanıcı yine de push bildirimleri almalı ve bunları hem kilit ekranında hem de bildirim merkezinde görebilmelidir. Bildirim düğmesi açıktır. AMA currentUserNotificationSettings
dönecektir: UIUserNotificationTypeNone
bu durumda. Bu, kullanıcıların gerçek ayarlarının gerçek bir göstergesi değildir.
Kişinin yapabileceği birkaç tahmin:
isRegisteredForRemoteNotifications
, NO
bu cihazın uzaktan bildirimler için asla başarıyla kaydedilmediğini varsayabilirsiniz.application:didRegisterUserNotificationSettings:
bu kullanıcı ayarlarını tescil edilmiştir ilk kez bu yana şu anda kullanıcı bildirim ayarlarını içeren yapılır gerektiğini kullanıcı izni talebi açısından seçilmiş neyi işaret eder. Ayarlar aşağıdakilerden başka bir şeye eşitse: UIUserNotificationTypeNone
itme izni verildi, aksi takdirde reddedildi. Bunun nedeni, uzaktan kayıt işlemine başladığınız andan itibaren kullanıcının yalnızca kabul etme veya reddetme yeteneğine sahip olmasıdır; kabul işleminin başlangıç ayarları kayıt işlemi sırasında ayarladığınız ayarlardır.Cevabı tamamlamak için böyle bir şey işe yarayabilir ...
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: Bu doğru değil. Bunlar biraz bilge şeyler olduğundan, bir anahtarla çalışmaz, bu yüzden bunu kullanarak sona erdi:
UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
UIRemoteNotificationType typesset = (UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge);
if((types & typesset) == typesset)
{
CeldaSwitch.chkSwitch.on = true;
}
else
{
CeldaSwitch.chkSwitch.on = false;
}
İOS7 ve öncesi için gerçekten kullanmanızın enabledRemoteNotificationTypes
eşit olup olmadığını (veya istediğiniz şeye bağlı olarak eşit olup olmadığını) kullanmanız ve kontrol etmeniz gerekir UIRemoteNotificationTypeNone
.
Bununla birlikte, iOS8 için sadece yukarıda belirtilen durumlarla kontrol etmek her zaman yeterli değildirisRegisteredForRemoteNotifications
. Ayrıca application.currentUserNotificationSettings.types
eşit olup olmadığını kontrol etmelisiniz (veya istediğiniz şeye bağlı olarak eşit değil) UIUserNotificationTypeNone
!
isRegisteredForRemoteNotifications
gerçi gerçek bile döndürebilir currentUserNotificationSettings.types
getiriler UIUserNotificationTypeNone
.
iOS8 + (AMAÇ 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");
}
Burada UIApplication'dan UIRemoteNotificationType'ı alıyoruz. Kolayca türünü kontrol edebilirsiniz daha, ayarda bu uygulamanın push bildirim durumunu temsil eder
@Shaheen Ghiassy tarafından sağlanan çözümü kullanarak iOS 10 ve üstünü desteklemeye çalışıyorum, ancak yoksunluk sorunu buluyorum enabledRemoteNotificationTypes
. Yani, isRegisteredForRemoteNotifications
bunun yerine kullanarak bulduğum çözüm enabledRemoteNotificationTypes
iOS 8'de kullanımdan kaldırıldı. Aşağıda benim için mükemmel çalışan güncellenmiş çözümüm var:
- (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;
}
Ve bu işlevi kolayca çağırabilir ve Bool
değerine erişebilir ve bunu dize değerine dönüştürebiliriz:
NSString *str = [self notificationServicesEnabled] ? @"YES" : @"NO";
Umarım başkalarına da yardımcı olur :) Mutlu kodlama.
Zac'in cevabı iOS 7'ye kadar mükemmel olsa da, iOS 8'in gelmesinden bu yana değişti. Çünkü enabledRemoteNotificationTypes itibaren iOS 8'den kaldırılmıştır. İOS 8 ve sonraki sürümler için isRegisteredForRemoteNotifications kullanmanız gerekir .
Bu Swifty çözümü benim için iyi çalıştı ( iOS8 + ),
Yöntem :
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)
}
}
}
Kullanımı :
isNotificationEnabled { (isEnabled) in
if isEnabled{
print("Push notification enabled")
}else{
print("Push notification not enabled")
}
}
yeniden:
doğru
if (types & UIRemoteNotificationTypeAlert)
ama takip etmek de doğru! (UIRemoteNotificationTypeNone 0 olduğu için)
if (types == UIRemoteNotificationTypeNone)
aşağıdakilere bakın
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
Bunu Xamarin.ios'da nasıl yapacağınız aşağıda açıklanmıştır.
public class NotificationUtils
{
public static bool AreNotificationsEnabled ()
{
var settings = UIApplication.SharedApplication.CurrentUserNotificationSettings;
var types = settings.Types;
return types != UIUserNotificationType.None;
}
}
İOS 10+ sürümünü destekliyorsanız yalnızca UNUserNotificationCenter yöntemiyle devam edin.
Xamarin'de, yukarıdaki çözümlerin hepsi benim için çalışmıyor. Bunun yerine kullandığım şey:
public static bool IsRemoteNotificationsEnabled() {
return UIApplication.SharedApplication.CurrentUserNotificationSettings.Types != UIUserNotificationType.None;
}
Ayarlar'daki bildirim durumunu değiştirdikten sonra da canlı bir güncelleme oluyor.
@ ZacBowling'in çözümünden oluşturulan tam kolay kopyalama ve yapıştırma kodu ( https://stackoverflow.com/a/1535427/2298002 )
bu ayrıca kullanıcıyı uygulama ayarlarınıza getirecek ve hemen etkinleştirmelerine izin verecektir
Ayrıca konum hizmetlerinin etkin olup olmadığını kontrol etmek için bir çözüm ekledim (ve ayarları da getiriyor)
// 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!