Обнаружение, из которого было открыто приложение UILocalNotification

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

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

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

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

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

Ответы

Ответ 1

При рассылке уведомления вы можете установить уникальный идентификатор для уведомления 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"]);
    }

}

from 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

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

Ответ 3

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

Ответ 4

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

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

Итак, вы будете запускать эти методы с помощью UIApplicationDelegate:

application(_:handleActionWithIdentifier:forLocalNotification:completionHandler:)

и

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

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

Ответ 5

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

Ответ 6

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

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
}