IOS 8 में UILocalNotifications प्राप्त करने के लिए उपयोगकर्ता की अनुमति के लिए पूछें


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 CCA-TV [735: 149070] एक स्थानीय अधिसूचना शेड्यूल करने का प्रयास {अग्नि तिथि = शनिवार, 7 जून, 2014 को 11:14:21 प्रशांत डेलाइट समय, समय क्षेत्र = अमेरिका / लॉस_एंगल (PDT) ऑफ़सेट -25200 (डेलाइट), रिपीट इंटरवल = 0, रिपीट काउंट = UILocalNotificationInfiniteRepeatCount, अगली फायर डेट = शनिवार, 7 जून, 2014 को 11:14:21 पैसिफिक डेलाइट टाइम, उपयोगकर्ता जानकारी = (null)} अलर्ट के साथ लेकिन उपयोगकर्ता को अलर्ट प्रदर्शित करने की अनुमति नहीं मिली है

अलर्ट प्रदर्शित करने के लिए मुझे आवश्यक अनुमति कैसे मिल सकती है?


1
मुझे लगता है कि ऐप ने एक बार अनुमति को अस्वीकार कर दिया है, आप सेटिंग्स से सक्षम करने का प्रयास कर सकते हैं। लेकिन जिस तरह से UILocalNotification उपयोगकर्ता की अनुमति की जरूरत नहीं है ..
iphonic

कोशिश करो registerUserNotificationSettings। अगर यह iOS 8 होता, तो यह धागा आपके प्रश्न का उत्तर देता। लेकिन, जी आगे एक नज़र है - stackoverflow.com/questions/24006998/…
रौरा

जवाबों:


237

IOS 8 के बाद से आपको अपने ऐप से सूचनाएं दिखाने के लिए उपयोगकर्ता की अनुमति मांगनी होगी, यह रिमोट / पुश और स्थानीय सूचनाओं दोनों के लिए लागू होता है। स्विफ्ट में आप इसे इस तरह से कर सकते हैं,

स्विफ्ट 2.0 के लिए अपडेट

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
}

स्विफ्ट 3.2

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

वर्तमान में पंजीकृत अधिसूचना प्रकारों के लिए जाँच करने के लिए आप UIApplication class की विधि का उपयोग कर सकते हैं,

- (UIUserNotificationSettings *)currentUserNotificationSettings

इसलिए यदि उपयोगकर्ता ने आपके ऐप को नहीं कहा है, तो इस फ़ंक्शन को इसमें किसी भी प्रकार के बिना एक सेटिंग वापस करना चाहिए।

मैंने इस बारे में एक ट्यूटोरियल लिखा है, आप इसे यहाँ देख सकते हैं ।


1
यदि उपयोगकर्ता अनुमति से इनकार करता है, तो आप इसे बाद में कैसे निर्धारित करेंगे?
जजक्ट्रा

@ सथेश्वरन जब मैं इस कोड का उपयोग करता हूं, तो यह iOS8 के साथ सिम्युलेटर के साथ ठीक काम कर रहा है। मैं अपने ऐप के तैनाती लक्ष्य को iOS7 से शुरू करना चाहता था। इसलिए, जब मैं इस कोड को iOS7 डिवाइस पर चलाता हूं, तो मुझे यह त्रुटि मिलती है dyld: Symbol not found: _OBJC_CLASS_$_UIUserNotificationSettings:। IOS7 में काम करने के लिए उपयोगकर्ता से अनुमति मांगने के लिए स्विफ्ट में कोई अन्य तरीका है? कृपया मदद कीजिए।
राघवेंद्र

@ राघव UIUserNotificationSettings केवल iOS 8 से उपलब्ध है और आप जो भी सामना कर रहे हैं वह सही व्यवहार है। आप इसे आईओएस 7.
सतेश्वरन

1
-1 iOS संस्करण UIDevice की जाँच के लिए। stackoverflow.com/a/25735175/1226304 उत्तर में ऐसा करने के लिए बेहतर दृष्टिकोण है।
derpoliuk

3
@derpoliuk सभी के लाभ के जवाब में अपडेट किया गया, ठीक है ??
सथेश्वरन

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

मैंने बस उसी समस्या का सामना किया। IOS 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

सिस्टम निर्णय को याद रखेगा, और केवल एक बार पूछेगा।


([[UIDevice currentDevice] .systemVersion floatValue] <10)
मेहुल

1

** iOS8 + के लिए तीन बटन कार्रवाई के साथ स्थानीय अधिसूचना

// बटन: मैं इसे काटता हूं, लेटर याद रखता हूं, SKIP IT **

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

        }

    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.