Обнаружение, из которого было открыто приложение 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
}