আইওএস 8-এ ইউআইএলোকালনোটিকেশনগুলি পাওয়ার জন্য ব্যবহারকারীর অনুমতি চেয়ে জিজ্ঞাসা করুন


115

আমি এটি ব্যবহার করে অ্যাপ ডেলিগেটে স্থানীয় বিজ্ঞপ্তিগুলি সেট আপ করেছি:

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    UILocalNotification *notification = [[UILocalNotification alloc]init];
    [notification setAlertBody:@"Watch the Latest Episode of CCA-TV"];
    [notification setFireDate:[NSDate dateWithTimeIntervalSinceNow:5]];
    [notification setTimeZone:[NSTimeZone defaultTimeZone]];
    [application setScheduledLocalNotifications:[NSArray arrayWithObject:notification]];
}

আমি যখন অ্যাপটি চালাচ্ছি এবং তারপরে এটি ছেড়ে দিই তখন আমি এই বলে একটি ত্রুটি পেয়েছি:

2014-06-07 11: 14: 16.663 সিসিএ-টিভি [735: 149070] স্থানীয় বিজ্ঞপ্তি নির্ধারণের চেষ্টা করা হচ্ছে - আগুনের তারিখ = শনিবার, 7 জুন, 2014 11: 21:21 প্যাসিফিক দিবালোকের সময়, সময় অঞ্চল = আমেরিকা / লস_এঞ্জেলস (পিডিটি) অফসেট -২২০০ (দিবালোক), পুনরাবৃত্তি বিরতি = 0, পুনরাবৃত্তি গণনা = ইউআইওলোকনোটোটিকেশনআইফিনিটরিপিটকাউন্ট, পরের আগুনের তারিখ = শনিবার, 7 জুন, 2014 11: 11:21 প্যাসিফিক দিবালোক সময়, ব্যবহারকারীর তথ্য = (নাল) an একটি সতর্কতা সহ তবে ব্যবহারকারীর কাছ থেকে সতর্কতা প্রদর্শনের অনুমতি পাননি

সতর্কতা প্রদর্শন করার জন্য আমি কীভাবে প্রয়োজনীয় অনুমতি পেতে পারি?


1
আমি মনে করি অ্যাপটি একবার অনুমতি বাতিল করেছে, আপনি সেটিংস থেকে সক্ষম করার চেষ্টা করতে পারেন। তবে যেভাবে ইউআইএলোকলনোটিকেশনের ব্যবহারকারীর অনুমতি দরকার নেই ..
আইফোনিক

ব্যবহার করে দেখুন registerUserNotificationSettings। এটি যদি আইওএস 8 হয়, তবে এই থ্রেডটি আপনার প্রশ্নের উত্তর দিয়ে দিত। - কিন্তু, জি এগিয়ে একটি চেহারা আছে stackoverflow.com/questions/24006998/...
raurora

উত্তর:


237

আইওএস 8 যেহেতু আপনার অ্যাপ থেকে বিজ্ঞপ্তিগুলি দেখানোর জন্য আপনাকে ব্যবহারকারীর অনুমতি চাইতে হবে, এটি দূরবর্তী / পুশ এবং স্থানীয় উভয় বিজ্ঞপ্তির জন্যই প্রযোজ্য। সুইফটে আপনি এটি এটি করতে পারেন,

সুইফট ২.০ এর জন্য আপডেট

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {
    // Override point for customization after application launch.
    if(UIApplication.instancesRespondToSelector(Selector("registerUserNotificationSettings:")))
    {
        let notificationCategory:UIMutableUserNotificationCategory = UIMutableUserNotificationCategory()
        notificationCategory.identifier = "INVITE_CATEGORY"
        notificationCategory.setActions([replyAction], forContext: UIUserNotificationActionContext.Default)

        //registerting for the notification.
        application.registerUserNotificationSettings(UIUserNotificationSettings(forTypes:[.Sound, .Alert, .Badge], categories: nil))
    }
    else
    {
       //do iOS 7 stuff, which is pretty much nothing for local notifications.
    }
    return true
}

সুইফট ৩.২

if(UIApplication.instancesRespond(to: #selector(UIApplication.registerUserNotificationSettings(_:)))){
     let notificationCategory:UIMutableUserNotificationCategory = UIMutableUserNotificationCategory()
     notificationCategory.identifier = "INVITE_CATEGORY"
     notificationCategory.setActions([replyAction], forContext: UIUserNotificationActionContext.Default)

     //registerting for the notification.
        application.registerUserNotificationSettings(UIUserNotificationSettings(types:[.sound, .alert, .badge], categories: nil))
}
else{
        //do iOS 7 stuff, which is pretty much nothing for local notifications.
    }

অবজেক্টিভ সি সিনট্যাক্সও খুব মিল।

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    if ([UIApplication instancesRespondToSelector:@selector(registerUserNotificationSettings:)]){
        [application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound categories:nil]];
    }
    // Override point for customization after application launch.
    return YES;
}

বর্তমানে নিবন্ধিত বিজ্ঞপ্তির ধরণের জন্য পরীক্ষা করতে আপনি ইউআইএপ্লিকেশন ক্লাসের পদ্ধতিটি ব্যবহার করতে পারেন,

- (UIUserNotificationSettings *)currentUserNotificationSettings

সুতরাং যদি ব্যবহারকারী আপনার অ্যাপ্লিকেশনটিকে না বলে থাকে তবে এই ফাংশনটিতে কোনও প্রকার ছাড়াই একটি সেটিংস ফিরিয়ে দেওয়া উচিত।

আমি এটি সম্পর্কে একটি টিউটোরিয়াল লিখেছি, আপনি এটি এখানে দেখতে পারেন ।


1
যদি ব্যবহারকারী অনুমতি অস্বীকার করে, আপনি কীভাবে পরে এটি অগ্রগতিমূলকভাবে নির্ধারণ করবেন?
jjxtra

@ সতীশ্বরান যখন আমি এই কোডটি ব্যবহার করি এটি আইওএস 8 সহ সিমুলেটারের সাথে দুর্দান্ত কাজ করে। আমি চাইছিলাম আমার অ্যাপ্লিকেশনটির মোতায়েনের লক্ষ্য iOS7 থেকে শুরু wanted সুতরাং যখন আমি একটি সহ iOS7 ডিভাইসে এই কোডটি রান আমি এই ত্রুটি পাবেন: dyld: Symbol not found: _OBJC_CLASS_$_UIUserNotificationSettings। আইওএস 7 এ কাজ করার জন্য ব্যবহারকারীকে অনুমতি চেয়ে জিজ্ঞাসা করার জন্য সুইফটে অন্য কোনও উপায় আছে কি? সাহায্য করুন.
রাঘবেন্দ্র

@ রাঘব ইউআইউসরউনোটিকেশনসেটিংগুলি কেবল আইওএস 8 থেকে পাওয়া যায় এবং আপনি যেটির মুখোমুখি হচ্ছেন তা সঠিক আচরণ। আপনার এটি আইওএস 7 এ ব্যবহার করা উচিত নয়
Sat

1
আইওএস সংস্করণ ইউআইডিভাইস চেক করার জন্য -1। stackoverflow.com/a/25735175/1226304 উত্তরের এটি করার জন্য আরও ভাল পন্থা রয়েছে।
derpoliuk

3
প্রত্যেকের উপকারের উত্তরে উত্তর হিসাবে আপডেট করা হয়েছে, ঠিক আছে ??
সত্যেশ্বরন

38

এই কোডটি ভিউ কন্ট্রোলারে রাখুন যেখানে আপনি প্রথমে বিজ্ঞপ্তিগুলি প্রোগ্রাম করবেন (যদি আপনি সেগুলি লঞ্চের সময় প্রোগ্রাম করেন তবে তা হবে application:didFinishLaunchingWithOptions:):

if ([UIApplication instancesRespondToSelector:@selector(registerUserNotificationSettings:)]) {
    [[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert|UIUserNotificationTypeSound categories:nil]];
}

সুইফটে:

if(UIApplication.instancesRespondToSelector(Selector("registerUserNotificationSettings:"))) {
    UIApplication.sharedApplication().registerUserNotificationSettings(UIUserNotificationSettings(forTypes: .Alert | .Sound, categories: nil))
}

সিস্টেম সংস্করণ নম্বরের বিপরীতে যে সমাধানগুলি পরীক্ষা করে তা হ'ল সাব-অনুকূল এবং ত্রুটি-প্রবণ।


আমি ব্যবহার করব application.respondsToSelector(Selector("registerUserNotificationSettings"))এবংif ([application respondsToSelector:@selector(registerUserNotificationSettings:)])
derpoliuk

7
ওয়েল এটি কেবল কারণ আপনি এটির ভিতরে এটি ব্যবহার করছেন application:didFinishLaunchingWithOptions:যা একটি সহজ applicationজিনিস সরবরাহ করে :)
কেপিএম

18

উদ্দেশ্য-সি এর জন্য এটি ব্যবহার করে দেখুন:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:    (NSDictionary *)launchOptions
{
// are you running on iOS8?
if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) 
  {
    UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge|UIUserNotificationTypeAlert|UIUserNotificationTypeSound) categories:nil];
    [application registerUserNotificationSettings:settings];
  } 
else // iOS 7 or earlier
  {
    UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
    [application registerForRemoteNotificationTypes:myTypes];
  }
}

সুইফ্টের জন্য:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {
// Override point for customization after application launch.
 if(UIApplication.instancesRespondToSelector(Selector("registerUserNotificationSettings:")))
 {
    application.registerUserNotificationSettings(UIUserNotificationSettings(forTypes: UIUserNotificationType.Sound | UIUserNotificationType.Alert | UIUserNotificationType.Badge, categories: nil))
 }
 else
 {
    //
 }
return true
}

5

আমি ঠিক একই সমস্যার মুখোমুখি হয়েছি। আইওএস 8 এর মতো মনে হচ্ছে আমাদের একটি অতিরিক্ত পদক্ষেপ করা দরকার যা সাধারণত ভিতরে করা হয়:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { /*...*/ }

আপনি যদি এই কোডটিকে পিছিয়ে সামঞ্জস্য রাখতে চান তবে আপনি এই কোডটি ব্যবহার করতে পারেন:

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000
    if ([UIApplication instancesRespondToSelector:@selector(registerUserNotificationSettings:)])
    {
        [[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil]];
    }
#endif

সিস্টেম সিদ্ধান্তটি মনে রাখবে, এবং কেবল একবার জিজ্ঞাসা করবে।


ভালো কোড সহ iOS সংস্করণ চেক করতে যদি ([[UIDevice currentDevice] .systemVersion floatValue] <10)
তানবিরা Chuahan

1

** আইওএস 8 + এর জন্য তিনটি বোতাম ক্রিয়া সহ স্থানীয় বিজ্ঞপ্তি

// বোতাম: আমি এটি টোক করছি, লেটারটি স্মরণ করুন, এটি এড়িয়ে যান **

        let completeAction = UIMutableUserNotificationAction()
        completeAction.identifier = "COMPLETE_TODO"
        completeAction.title = "I TOOK IT"
        completeAction.activationMode = .Background
        completeAction.destructive = true
        completeAction.authenticationRequired = false

        let remindAction = UIMutableUserNotificationAction()
        remindAction.identifier = "REMIND_TODO"
        remindAction.title = "REMIND LATER"
        remindAction.activationMode = .Background
        remindAction.destructive = false
        //  remindAction.authenticationRequired = false

        let skipAction = UIMutableUserNotificationAction()
        skipAction.identifier = "SKIP_TODO"
        skipAction.title = "SKIP IT"
        skipAction.activationMode = .Background
        skipAction.destructive = false
        skipAction.authenticationRequired = false


        let todoCategory = UIMutableUserNotificationCategory()
        todoCategory.identifier = "TODO_CATEGORY"
        todoCategory.setActions([completeAction, remindAction, skipAction], forContext: .Default)
        todoCategory.setActions([completeAction,remindAction,skipAction], forContext: .Minimal)


        if application.respondsToSelector("isRegisteredForRemoteNotifications")
        {

            let categories = NSSet(array: [todoCategory,todoVideoCategory])
            let types:UIUserNotificationType = ([.Alert, .Sound, .Badge])

            let settings:UIUserNotificationSettings = UIUserNotificationSettings(forTypes: types, categories: categories as? Set<UIUserNotificationCategory>)

            application.registerUserNotificationSettings(settings)
            application.registerForRemoteNotifications()

        }

    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.