जवाबों:
बुलाओ enabledRemoteNotificationsTypes
और नकाब चेक करो।
उदाहरण के लिए:
UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
if (types == UIRemoteNotificationTypeNone)
// blah blah blah
iOS8 और ऊपर:
[[UIApplication sharedApplication] isRegisteredForRemoteNotifications]
iOS 8
उच्चतर के लिए समाधान गलत है क्योंकि यह केवल तभी जांचता है जब उपयोगकर्ता दूरस्थ अधिसूचना के लिए पंजीकृत हो। प्रलेखन के अनुसार: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];
क्वांटम्पोटेटो का मुद्दा:
कहां types
से दिया गया है
UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
एक का उपयोग कर सकते हैं
if (types & UIRemoteNotificationTypeAlert)
के बजाय
if (types == UIRemoteNotificationTypeNone)
आपको केवल यह देखने की अनुमति देगा कि क्या सूचनाएं सक्षम हैं (और ध्वनियों, बैज, सूचना केंद्र, आदि के बारे में चिंता न करें)। कोड की पहली पंक्ति ( types & UIRemoteNotificationTypeAlert
) वापस आ जाएगी YES
यदि "अलर्ट स्टाइल" "बैनर्स" या "अलर्ट NO
" पर सेट है , और अगर "अलर्ट स्टाइल" अन्य सेटिंग्स के बावजूद, "कोई नहीं" पर सेट है।
grantedSettings.types.contains(notificationType)
आईओएस के नवीनतम संस्करण में यह विधि अब पदावनत हो गई है। 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;
}
UserNotifications
। मेरे पास अब पूर्ण उत्तर नहीं है, दुर्भाग्य से।
स्विफ्ट 4.0, iOS11 के लिए अपडेट किया गया कोड
import UserNotifications
UNUserNotificationCenter.current().getNotificationSettings { (settings) in
print("Notification settings: \(settings)")
guard settings.authorizationStatus == .authorized else { return }
//Not authorised
UIApplication.shared.registerForRemoteNotifications()
}
स्विफ्ट 3.0, आईओएस 10 के लिए कोड
let isRegisteredForRemoteNotifications = UIApplication.shared.isRegisteredForRemoteNotifications
if isRegisteredForRemoteNotifications {
// User is registered for notification
} else {
// Show alert user is not registered for notification
}
IOS9 से, स्विफ्ट 2.0 UIRemoteNotificationType को हटा दिया गया है, निम्नलिखित कोड का उपयोग करें
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()
}
}
}
getNotificationSettings(...)
अतुल्यकालिक है इसलिए अंदर की वापसी को नजरअंदाज कर दिया जाएगा
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;
}
isEnabled = NO;
आपके if
मामलों में इसकी आवश्यकता नहीं है क्योंकि इसे आरंभीकृत किया गया हैNO
दुर्भाग्य से, इनमें से कोई भी समाधान वास्तव में समस्या को हल नहीं करता है क्योंकि दिन के अंत में एपीआई की गंभीरता से कमी होती है जब यह प्रासंगिक जानकारी प्रदान करने की बात आती है। आप हालांकि currentUserNotificationSettings
(iOS8 +) का उपयोग करके कुछ अनुमान लगा सकते हैं कि वास्तव में इस सवाल का जवाब देने के लिए अपने वर्तमान रूप में पर्याप्त नहीं है। यद्यपि यहाँ बहुत सारे समाधान यह प्रतीत करते हैं कि या तो isRegisteredForRemoteNotifications
यह निश्चित उत्तर है या अधिक है या नहीं।
इस पर विचार करो:
isRegisteredForRemoteNotifications
प्रलेखन राज्यों के साथ :
यदि आवेदन वर्तमान में दूरस्थ सूचनाओं के लिए पंजीकृत है, तो किसी भी प्रणालीगत सेटिंग्स को ध्यान में रखते हुए हाँ लौटाता है ...
हालाँकि, यदि आप NSLog
व्यवहार को देखने के लिए अपने एप्लिकेशन प्रतिनिधि में बस फेंकते हैं तो यह स्पष्ट है कि यह उस तरीके का व्यवहार नहीं करता है जिससे हम अनुमान लगा रहे हैं कि यह काम करेगा। यह वास्तव में इस ऐप / डिवाइस के लिए सक्रिय होने वाली दूरस्थ सूचनाओं से सीधे संबंधित है। पहली बार सक्रिय होने के बाद यह हमेशा वापस आ जाएगा YES
। यहां तक कि उन्हें सेटिंग्स (सूचनाओं) में बंद करने के बावजूद भी यह वापस आ जाएगा YES
, क्योंकि iOS8 के रूप में, एक ऐप दूरस्थ सूचनाओं के लिए पंजीकरण कर सकता है और यहां तक कि उपयोगकर्ता को सक्षम किए बिना डिवाइस पर एक डिवाइस भेज सकता है, वे सिर्फ अलर्ट नहीं कर सकते हैं, उपयोगकर्ता के बिना बैज और ध्वनि को चालू किए बिना। साइलेंट नोटिफिकेशन कुछ ऐसी अच्छी मिसालें हैं जिन्हें आप नोटिफिकेशन को बंद करने के बाद भी जारी रख सकते हैं।
जहां तक currentUserNotificationSettings
यह चार चीजों में से एक को इंगित करता है:
बैड पर अलर्ट जारी हैं, साउंड चालू है और कोई भी चालू नहीं है।
यह आपको अन्य कारकों या अधिसूचना स्विच के बारे में पूरी तरह से कोई संकेत नहीं देता है।
एक उपयोगकर्ता वास्तव में बैज, ध्वनि और अलर्ट बंद कर सकता है लेकिन फिर भी लॉकस्क्रीन या सूचना केंद्र में शो हो सकता है। इस उपयोगकर्ता को अभी भी पुश सूचनाएँ मिल रही हैं और लॉक स्क्रीन पर और सूचना केंद्र में दोनों को देखने में सक्षम होना चाहिए। उनके पास अधिसूचना स्विच ऑन है। BUT currentUserNotificationSettings
लौट आएगा: 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;
}
संपादित करें: यह सही नहीं है। चूंकि ये बिट-वाइज सामान हैं, यह एक स्विच के साथ काम नहीं करेगा, इसलिए मैंने इसका उपयोग करना समाप्त कर दिया:
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 + (OBJECTIVE 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");
}
यहाँ हम UIRemoteNotificationType को UIApplication से प्राप्त करते हैं। यह सेटिंग में इस ऐप के पुश नोटिफिकेशन की स्थिति का प्रतिनिधित्व करता है, जबकि आप इसके प्रकार को आसानी से देख सकते हैं
मैं @Shaheen Ghiassy द्वारा प्रदान किए गए समाधान का उपयोग करके iOS 10 और इसके बाद के संस्करण का समर्थन करने की कोशिश करता हूं, लेकिन वंचितता का मुद्दा ढूंढता हूं enabledRemoteNotificationTypes
। इसलिए, आईओएस 8 में पदावनत isRegisteredForRemoteNotifications
करने के बजाय इसका उपयोग करके मैं जो समाधान enabledRemoteNotificationTypes
ढूंढता हूं, नीचे मेरा अद्यतन समाधान है जो मेरे लिए पूरी तरह से काम करता है:
- (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
मूल्य तक पहुंच सकते हैं और इसे इसके द्वारा स्ट्रिंग मान में परिवर्तित कर सकते हैं:
NSString *str = [self notificationServicesEnabled] ? @"YES" : @"NO";
आशा है कि यह दूसरों को भी मदद करेगा :) हैप्पी कोडिंग।
हालांकि Zac का जवाब iOS 7 तक पूरी तरह से सही था, iOS 8 के आने के बाद से यह बदल गया है। क्योंकि enableRemoteNotificationTypes को iOS 8 के बाद से हटा दिया गया है। IOS 8 और उसके बाद के लिए, आपको isRegisteredForRemoteNotifications का उपयोग करने की आवश्यकता है ।
इस स्विफ्ट्टी समाधान ने मेरे ( 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)
लेकिन निम्नलिखित भी सही है! (UIRemoteNotificationTypeNone के रूप में 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+ का समर्थन कर रहे हैं तो केवल UNUserNotificationCenter विधि के साथ जाएं।
ज़मारिन में, उपरोक्त सभी समाधान मेरे लिए काम नहीं करते हैं। इसके बजाय मैं इसका उपयोग करता हूं:
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!