ios সকল ব্যবহারকারী ধাক্কা বিজ্ঞপ্তি সক্রিয় করা হয়েছে যদি আইফোন নির্ধারণ করুন




আইফোনের সকল খবরাখবর (16)

ব্যবহারকারীর সেটিংসের মাধ্যমে, আমার অ্যাপ্লিকেশনটির জন্য তাদের ধাক্কা বিজ্ঞপ্তিগুলি সক্ষম বা অক্ষম করা হয়েছে কিনা তা নির্ধারণ করার জন্য আমি একটি উপায় সন্ধান করছি।


দুর্ভাগ্যবশত এই সমাধানগুলির মধ্যে কোনটিই আসলেই সমস্যার সমাধান করে না কারণ দিনের শেষে এটি প্রাসঙ্গিক তথ্য সরবরাহ করার সময় API গুলি গুরুতরভাবে অভাবগ্রস্ত। আপনি বর্তমান currentUserNotificationSettings ( currentUserNotificationSettings +) ব্যবহার করে কয়েকটি অনুমান করতে পারেন তবে প্রকৃতপক্ষে প্রশ্নের উত্তর দিতে তার বর্তমান ফর্মটিতে যথেষ্ট নয়। যদিও এখানে অনেকগুলি সমাধান প্রস্তাব করা হয়েছে যে এটি বা হয় isRegisteredForRemoteNotifications আসলেই এটির একটি নির্দিষ্ট উত্তর নয়।

এই বিবেচনা:

সঙ্গে isRegisteredForRemoteNotifications নথিপত্র ডকুমেন্টেশন:

অ্যাপ্লিকেশনটি যদি রিমোট বিজ্ঞপ্তিগুলির জন্য বর্তমানে নিবন্ধিত হয় তবে কোনও সিস্টেমব্যাপী সেটিংস বিবেচনা করে হ্যাঁ প্রদান করে ...

যাইহোক, যদি আপনি আপনার অ্যাপ প্রতিনিধিদের মধ্যে কেবলমাত্র NSLog বজায় রাখেন তবে এটির পরিপ্রেক্ষিতে এটির পরিপ্রেক্ষিতে এটি পরিষ্কারভাবে কাজ করে যা আমরা আশা করি যে এটি কাজ করবে। এটি আসলে এই অ্যাপ্লিকেশন / ডিভাইসের জন্য সক্রিয় করা দূরবর্তী বিজ্ঞপ্তিগুলিতে সরাসরি সম্পর্কিত। একবার সক্রিয় করার জন্য এটি সর্বদা YES ফিরে আসবে। এমনকি সেটিংস (বিজ্ঞপ্তিগুলি) এ তাদের বন্ধ করে দেওয়ার ফলে এখনও এই প্রত্যাবর্তন YES হতে পারে কারণ iOS8 হিসাবে, একটি অ্যাপ্লিকেশন রিমোট বিজ্ঞপ্তিগুলির জন্য নিবন্ধন করতে পারে এবং ব্যবহারকারীর বিজ্ঞপ্তিগুলি সক্ষম না করে এমনকি ডিভাইসে পাঠাতে পারে, তারা কেবল সতর্কতাগুলিও করতে পারে না , ব্যাজ এবং শব্দ ব্যবহারকারী যে চালু বাঁক। নীরব বিজ্ঞপ্তিগুলি এমন একটি ভাল উদাহরণ যা আপনি অবিরত বিজ্ঞপ্তিগুলির সাথে এমনকি অবিরত করতে পারেন।

যতদূর বর্তমান currentUserNotificationSettings এটি চারটি জিনিস এক নির্দেশ করে:

সতর্কতা ব্যাজ উপর হয় সাউন্ড হয় কেউ নেই।

এটি আপনাকে অন্য কারণগুলি বা বিজ্ঞপ্তি সুইচ নিজেই সম্পর্কে কোনও ইঙ্গিত দেয় না।

একটি ব্যবহারকারী আসলে ব্যাজ, শব্দ এবং সতর্কতা বন্ধ করতে পারে কিন্তু এখনও lockscreen বা বিজ্ঞপ্তি কেন্দ্রে প্রদর্শন আছে। এই ব্যবহারকারী এখনও ধাক্কা বিজ্ঞপ্তি গ্রহণ করা উচিত এবং লক পর্দায় এবং বিজ্ঞপ্তি কেন্দ্রে তাদের উভয় দেখতে সক্ষম হবেন। তারা বিজ্ঞপ্তি সুইচ আছে। কিন্তু বর্তমান currentUserNotificationSettings ফিরে আসবে: UIUserNotificationTypeNone যে ক্ষেত্রে। এই ব্যবহারকারীদের প্রকৃত সেটিংস সত্যিই নির্দেশক হয় না।

কিছু অনুমান করতে পারেন:

  • যদি isRegisteredForRemoteNotifications হয় তবে isRegisteredForRemoteNotifications NO তবে আপনি অনুমান করতে পারেন যে এই ডিভাইসটি দূরবর্তী বিজ্ঞপ্তিগুলির জন্য সফলভাবে নিবন্ধিত হয়নি।
  • রিমোট বিজ্ঞপ্তিগুলির জন্য নিবন্ধনের প্রথমবারের জন্য application:didRegisterUserNotificationSettings: করার জন্য একটি কলব্যাক application:didRegisterUserNotificationSettings: সেটিংস: এই সময়ে ব্যবহারকারীর বিজ্ঞাপনের সেটিংস তৈরি করা হয়েছে যেহেতু ব্যবহারকারীর নিবন্ধীকরণের প্রথম সময় এই সেটিংটি ব্যবহারকারীর অনুমতির অনুরোধের ভিত্তিতে নির্বাচিত কী নির্দেশ করে । সেটিংস ব্যতীত অন্য কিছুতে সমান হলে: UIUserNotificationTypeNone তারপর push অনুমোদন দেওয়া হয়েছিল, অন্যথায় এটি অস্বীকার করা হয়েছিল। এর কারণ হ'ল যে আপনি রিমোট রেজিস্ট্রেশন প্রক্রিয়াটি শুরু করার মুহূর্তে ব্যবহারকারীর কাছে নিবন্ধীকরণ প্রক্রিয়া চলাকালীন সেটিংস সেটআপ করার জন্য গ্রহণযোগ্যতাগুলির প্রাথমিক সেটিংসের সাথে গ্রহণ বা অস্বীকার করার ক্ষমতা রয়েছে।

উত্তরটি সম্পূর্ণ করার জন্য, এটি এমন কিছু করতে পারে ...

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;
}

নীচে আপনি 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");

IOS7 এর জন্য এবং আপনি অবশ্যই সক্ষম করা উচিত enabledRemoteNotificationTypes এবং enabledRemoteNotificationTypes এটি সমান কিনা (অথবা আপনি যা চান তার উপর নির্ভর করে না) পরীক্ষা করে UIRemoteNotificationTypeNone

তবে isRegisteredForRemoteNotifications জন্য এটি কেবলমাত্র isRegisteredForRemoteNotifications সাথে চেক করার জন্য সর্বদা পর্যাপ্ত নয়application.currentUserNotificationSettings.types . UIUserNotificationTypeNone সমান (অথবা আপনি চান তা নির্ভর করে সমান নয়) UIUserNotificationTypeNone !

isRegisteredForRemoteNotifications সত্য ফিরে আসতে পারে যদিও currentUserNotificationSettings.types UIUserNotificationTypeNone currentUserNotificationSettings.types UIUserNotificationTypeNone currentUserNotificationSettings.types UIUserNotificationTypeNone


@ জ্যাকব্ললিংয়ের সমাধান থেকে নির্মিত সম্পূর্ণ সহজ কপি এবং পেস্ট কোড ( https://.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://.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!


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

এখানে আমরা UIAplplication থেকে UIRemoteNotificationType পাই। এটি সেটিংসে এই অ্যাপ্লিকেশনের ধাক্কা বিজ্ঞপ্তির প্রতিনিধিত্ব করে, আপনি তার টাইপটি সহজেই পরীক্ষা করতে পারেন


এই 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")
            }
        }

Ref


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()
}

Swift3.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 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 + (উদ্দেশ্যমূলক সি)

#import <UserNotifications/UserNotifications.h>


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

    switch (settings.authorizationStatus) {
          case UNAuthorizationStatusNotDetermined:{

            break;
        }
        case UNAuthorizationStatusDenied:{

            break;
        }
        case UNAuthorizationStatusAuthorized:{

            break;
        }
        default:
            break;
    }
}];

কল সক্ষম enabledRemoteNotificationsTypes এবং মাস্ক চেক করুন।

উদাহরণ স্বরূপ:

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

iOS8 এবং উপরে:

[[UIApplication sharedApplication] isRegisteredForRemoteNotifications]

যদিও জ্যাক এর উত্তর iOS 7 পর্যন্ত পুরোপুরি সঠিক ছিল, আইওএস 8 আসার পরে এটি পরিবর্তিত হয়েছে। কারণ সক্ষম করা হয়েছে RemoteNotificationTypes iOS 8 এর পরে থেকে অপ্রাপ্তিত হয়েছে। আইওএস 8 এর জন্য এবং পরে, আপনি isRegisteredForRemoteNotifications ব্যবহার করতে হবে।

  • আইওএস 7 এবং এর আগে -> সক্রিয় ব্যবহার করুনোটোটনোটাইনিং টাইপস
  • iOS 8 এবং তারপরে -> isRegisteredForRemoteNotifications ব্যবহার করুন।

Xamarin মধ্যে, উপরের সব সমাধান আমার জন্য কাজ করে না। এই পরিবর্তে আমি কি ব্যবহার করি:

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

সেটিংসে বিজ্ঞপ্তির অবস্থা পরিবর্তন করার পরেও এটি লাইভ আপডেট পেয়েছে।


সুইফ্ট 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 ব্যবহার 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;
}

আমি @ সোহেন গিয়াসি দ্বারা সমাধান প্রদানের মাধ্যমে iOS 10 এবং তার উপরে সমর্থন করার চেষ্টা করি তবে বঞ্চনা সমস্যা সক্ষম করুন enabledRemoteNotificationTypes খুঁজে enabledRemoteNotificationTypes । সুতরাং, আমি ব্যবহার করে যে isRegisteredForRemoteNotifications ব্যবহার isRegisteredForRemoteNotifications হল enabledRemoteNotificationTypes isRegisteredForRemoteNotifications পরিবর্তে isRegisteredForRemoteNotifications করুন enabledRemoteNotificationTypes যা আইওএস 8 এ enabledRemoteNotificationTypes 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 মান অ্যাক্সেস করতে এবং এটি দ্বারা স্ট্রিং মান রূপান্তর করতে পারেন:

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

আশা করি এটা অন্যদের সাহায্য করবে :) শুভ কোডিং।


আমি মন্তব্য করতে পারছি না (যথেষ্ট খ্যাতি নেই), কিন্তু আবারঃ কোয়ান্টামপোটটো এর সমস্যা:

যেখানে types দ্বারা দেওয়া হয়

UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];

এক ব্যবহার করতে পারেন

if (types & UIRemoteNotificationTypeAlert)

পরিবর্তে

if (types == UIRemoteNotificationTypeNone) 

বিজ্ঞপ্তিগুলি সক্ষম কিনা তা পরীক্ষা করার জন্য আপনাকে অনুমতি দেবে (এবং শব্দের, ব্যাজ, বিজ্ঞপ্তি কেন্দ্র ইত্যাদি সম্পর্কে চিন্তা করবেন না)। "অ্যালার্ট স্টাইল" "ব্যানার" বা "সতর্কতা" তে সেট করা হলে কোডের প্রথম ধরণের লাইন ( types & UIRemoteNotificationTypeAlert ) YES ফিরে আসবে এবং NO সেটিংস ব্যতীত "অ্যালার্ট স্টাইল" সেটিকে "কোনটি" তে সেট করা নেই।





push