Получение уведомлений iPhone для вызова моего делегата, когда приложение работает в фоновом режиме
У меня есть корпоративное приложение, которое я хочу продолжать работать, чтобы оно могло вызывать веб-сервис и информировать пользователя о том, что ему нужно сделать.
Теперь он работает в фоновом режиме, выполняет звонки, получает результаты, но информирование пользователя - моя проблема.
Когда я стреляю UILocalNotification
предупреждение не вызывает мой UIAlertDelegate
и я не вижу, как настроить это оповещение, чтобы сделать это.
Вот мой код для того, как я делаю уведомление, и это на самом деле вызывает предупреждение, но мне нужно, чтобы затем вызвать View
чтобы они могли видеть таблицу, но View
это открывается не один из двух, которые использует мое приложение.
UILocalNotification *localNotif = [[UILocalNotification alloc] init];
if (localNotif) {
localNotif.alertBody = [NSString stringWithFormat:NSLocalizedString(@"%@ has a message for you.", nil), @"FYR"];
localNotif.alertAction = NSLocalizedString(@"Read Msg", nil);
localNotif.soundName = nil;
localNotif.applicationIconBadgeNumber = -1;
NSDictionary *infoDict = [NSDictionary dictionaryWithObjectsAndKeys:@"Your Background Task works", ItemListKey, @"Message from FYR", MessageTitleKey, nil];
localNotif.userInfo = infoDict;
[[UIApplication sharedApplication] presentLocalNotificationNow:localNotif];
[localNotif release];
}
Кроме того, поэтому я попытался получить предупреждение о том, что могу установить делегата, поэтому в моем контроллере, где я вызываю вышеуказанный код, я также вызываю это:
[[NSNotificationCenter defaultCenter]
postNotificationName:@"ShowAlert"
object:nil
userInfo:mydata];
Затем извлекается это уведомление, и в конце концов эта функция вызывается, и это работает, но предупреждение не отображается для пользователя, я ожидаю, потому что оно находится в фоновом режиме.
- (void) _showAlert:(NSString*)pushmessage withTitle:(NSString*)title {
NSLog(@"%@", @"Attemping to show alert");
UIAlertView* alertView = [[UIAlertView alloc] initWithTitle:title
message:pushmessage
delegate:self
cancelButtonTitle:@"No"
otherButtonTitles:@"Yes",nil];
[alertView show];
if (alertView) {
[alertView release];
}
}
В главном делегате я определил это и соответствующие функции:
@interface FYRViewAppDelegate : NSObject <UIApplicationDelegate, UIAlertViewDelegate> {
я думал, что если я смогу получить всплывающее предупреждение для вызова этого делегата, он может выполнить этот код:
- (void)alertView:(UIAlertView *)alertview clickedButtonAtIndex:(NSInteger)buttonIndex {
alertview--;
if (buttonIndex == 0) {
} else {
[self.window addSubview:[tableController view]];
}
}
Итак, есть ли способ получить UILocalNotification
использовать мой делегат для оповещения?
Или есть ли способ показать предупреждение, когда приложение находится в фоновом режиме?
Или мне нужно написать два приложения, чтобы они связывались с удаленными уведомлениями, чтобы, когда приложение находилось в фоновом режиме, одно запускалось, а затем запускало основное приложение с удаленным уведомлением. Мне не нравится такой подход, потому что он кажется очень грязным, но, вероятно, сработает.
Так как программа никогда не перестает работать
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
вызывается только при запуске, локальное уведомление никогда не вызывает его, и это также никогда не вызывается:
- (void) application:(UIApplication*)application
didReceiveLocalNotification:(UILocalNotification *)localNotification {
,
1 ответ
Я полагаю, что вы не публикуете уведомления, когда приложение активно. Не могли бы вы просто установить флаг, когда вы публикуете локальное уведомление, а затем проверить флаг, когда приложение становится активным:
- (void)applicationDidBecomeActive:(UIApplication *)application
{
if (localNotificationPosted) {
// Do whatever you need to do.
}
}
Вероятно, это будет правильным поведением, поскольку приложение станет активным, если пользователь не отклонит уведомление. Даже если пользователь отклоняет уведомление, показ новых сообщений при следующем открытии приложения, вероятно, не так уж плохо.