2015-12-04 3 views
14

В некоторых случаях мое приложение IOS должен вызвать мультипликатор UILocalNotification в одновременно. Я хочу решить, к какому пользователю щелкнул UILocalNotification. Когда пользователь нажимает на UILocalNotification, приложение неактивно или в фоновом режиме. Проблема заключается в том, что методDetect, из которого UILocalNotification приложение было открыто

func application(application: UIApplication, didReceiveLocalNotification notification: UILocalNotification) { 

вызывается для каждого срабатывает UILocalNotification. Поэтому, когда приложение становится активным, этот метод вызывается несколько раз, так как я получил несколько UILocalNotification. Есть ли способ определить, какая из UILocalNotification была причиной открытия приложения? Проверка applicationState не работает, поскольку все UILocalNotification были получены, когда приложение было неактивным или в фоновом режиме.

Большое спасибо!

Редактировать: В качестве далекого примера: когда вы получаете сообщение WhatsApp из двух разных групп A и B и выбираете push-уведомление из группы A, это будет отображаться сразу после того, как приложение откроется. Разница между WhatsApp и моим вариантом использования заключается в том, что у меня есть локальные уведомления.

+1

По моему опыту (а я просто написал небольшой тест приложение, которое планирует три UILocalNotifications с тем же fireDate, когда приложение закрыто, чтобы проверить это), когда пользователь нажимает на данную тревоге в их экране уведомления, таким образом, запуск приложения, единственная UILocalNotification, которая передается методу didReceiveNotifications UIApplication, - это тот, на который пользователь нажал. Поэтому я не совсем понимаю ваш вопрос. – vaticRite

+0

Он не отвечает на ваш вопрос, но как насчет того, чтобы иметь только одно локальное уведомление (т. Е. Отменить предыдущие). Если вы это сделаете, вы можете отслеживать словарь пользовательской информации уведомления для последующего использования, когда приложение становится активным. В случае, если вам все еще требуется несколько локальных уведомлений, можно ли это как-то сгруппировать? Если да, вы можете подготовить вид массива словарей userInfo для его потребления, когда приложение станет активным. – atxe

+0

Невозможно использовать словарь userinfo, чтобы выяснить, какое уведомление было открыто, и проверить, что в didRecieveLocalNotif, –

ответ

2

Вы можете использовать launch options, чтобы получить доступ к словарю, который был отправлен с уведомлением, и оттуда, в зависимости от того, какие данные вы даете местному уведомлению при его настройке, вы можете проверить словарь и посмотреть, какие уведомление, на которое отвечает метод.

+0

Привет, pbush25, благодарю вас за ответ. К сожалению, это не поможет мне узнать, какой UILocalNotification пользователь нажал с момента приложения: didReceiveLocalNotification вызывается для каждого пользователя UILocalNotification, который был получен пользователем одновременно. –

+0

Кроме того, параметры запуска отправляются только тогда, когда приложение запускается в первый раз, когда он не активируется из фона. –

1

Просто небольшое дополнение к @ pbush25, вы можете назначить объект словаря для свойства notification.userInfo = [:] так же, как и вы, и вы можете получить его таким же образом и использовать, как вам нравится!

8

При отправке уведомления вы можете установить уникальный идентификатор для уведомления userinfo.

UILocalNotification *notif = [[UILocalNotification alloc] init]; 
    notif.fireDate = [NSDate dateWithTimeIntervalSinceNow:10]; 
    notif.timeZone = [NSTimeZone defaultTimeZone]; 

// set the your data with unique id 
    NSMutableDictionary *dict=[NSMutableDictionary new]; 
    [dict setObject:Id forKey:@"id"]; 

// assignt the dictionary to user info 
    notif.userInfo=dict; 


    notif.alertBody = @"test Notification"; 
    notif.soundName = UILocalNotificationDefaultSoundName; 


    [[UIApplication sharedApplication] scheduleLocalNotification:notif]; 

вы можете получить USERINFO от didReceiveLocalNotification так

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification 
{ 
    if ([[notification.userInfo valueForKey:@"id"] isEqualToString:@"1"]) 
    { 
     NSLog(@"notification id %@",[notification.userInfo valueForKey:@"id"]); 
    } 
    else if ([[notification.userInfo valueForKey:@"id"] isEqualToString:@"2"]) 
    { 
     NSLog(@"notification id %@",[notification.userInfo valueForKey:@"id"]); 
    } 

    ////// or ///// 

    if ([notification.userInfo valueForKey:@"id"]) 
    { 
     NSLog(@"id of notification %@",[notification.userInfo valueForKey:@"id"]); 
    } 

} 

из didFinishLaunchingWithOptions

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    // Override point for customization after application launch. 
    if ([launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey]) 
    { 
     UILocalNotification *notif=[launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey]; 
     NSLog(@"notif.userInfo %@",notif.userInfo); 

//  notif.userInfo { 
//   id = 2; 
//  } 

    } 


     return YES; 
} 
2

Обеспечивают некоторую уникальную информацию, как идентификатор или что-то в USERINFO собственности UILocalNotification в NSDictionary при планировании вашего уведомление. И когда получите его либо в didFinishLaunchingWithOptions, либо didReceiveLocalNotification, вытащите словарь user info из экземпляра уведомления и выполните свою работу соответственно.

2

Поскольку вы используете swift, я понимаю, что ваше приложение, вероятно, работает для iOS 8 и более поздних версий.

Если вы используете iOS8, вы можете указать действия для вашего уведомления (щелчок на уведомлении - это само действие).

Таким образом, вы будете иметь эти методы срабатывает через UIApplicationDelegate:

application(_:handleActionWithIdentifier:forLocalNotification:completionHandler:)

И

application(_:handleActionWithIdentifier:forLocalNotification:withResponseInfo:completionHandler:)

Оба эти методы дают вам UILocalNotification который contains a userInfo property, что вы можете заполнить, когда вы создайте уведомление, а затем введите какой-то идентификатор, чтобы узнать, какой из них.

0

В Swift 3.x используйте следующий код в методе didFinishLaunchingWithOptions AppDelegate.

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 
     // See if the application was launched from a local notification. 
     if let options = launchOptions { 
      if let notification = options[UIApplicationLaunchOptionsKey.localNotification] as? UILocalNotification { 
       print(notification.userInfo ?? "No info attached.") 
      } 
     } 
     return true 
} 
Смежные вопросы