#iphone #objective-c #apple-push-notifications
#iPhone #objective-c #apple-push-уведомления
Вопрос:
Итак, что я пытаюсь сделать, это когда вы нажимаете «Просмотр» при получении push-уведомления, когда приложение открывается, в представленном виде нажимается новый контроллер с подробной информацией об уведомлении. Я использую UITabBarController с UINavigationControllers. Я был бы признателен за любую помощь, я пробовал искать, но, похоже, не смог найти ничего, что указывало бы мне в правильном направлении. Текущий код ниже:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound)];
[application setStatusBarStyle:UIStatusBarStyleBlackOpaque];
tabBarController = [[UITabBarController alloc] init];
controller = [[controller alloc] init];
UINavigationController *controller1 = [[[UINavigationController alloc] initWithRootViewController:controller] autorelease];
controller1.tabBarItem.image = [UIImage imageNamed:@"icon_news.png"];
[controller setTitle:@"View"];
[controller release];
controller = [[controller alloc] init];
UINavigationController *controller2 = [[[UINavigationController alloc] initWithRootViewController:controller] autorelease];
controller2.tabBarItem.image = [UIImage imageNamed:@"icon_news.png"];
[controller setTitle:@"View"];
[controller release];
controller = [[controller alloc] init];
UINavigationController *controller3 = [[[UINavigationController alloc] initWithRootViewController:controller3] autorelease];
controller3.tabBarItem.image = [UIImage imageNamed:@"icon_news.png"];
[controller setTitle:@"View"];
[controller release];
controller = [[controller alloc] init];
UINavigationController *controller4 = [[[UINavigationController alloc] initWithRootViewController:controller] autorelease];
controller4.tabBarItem.image = [UIImage imageNamed:@"icon_news.png"];
[controller setTitle:@"View"];
[controller release];
controller = [[controller alloc] init];
UINavigationController *controller5 = [[[UINavigationController alloc] initWithRootViewController:controller] autorelease];
controller5.tabBarItem.image = [UIImage imageNamed:@"icon_news.png"];
[controller setTitle:@"View"];
[controller release];
tabBarController.viewControllers = [NSArray arrayWithObjects:controller1, controller2, controller3, controller4, controller5, nil];
[window addSubview:tabBarController.view];
[window makeKeyAndVisible];
launchDefault = YES;
//[self performSelector:@selector(handlePostLaunch) withObject:nil afterDelay:0];
// Push Notification info
NSDictionary *apns = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
NSString *result = [[[apns valueForKey:@"aps"] valueForKey:@"alert"] valueForKey:@"loc-args"];
NSString *playerID = [NSString stringWithFormat:@"%@", result];
playerID = [[playerID componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]] componentsJoinedByString:@""];
playerID = [playerID stringByReplacingOccurrencesOfString:@" " withString:@""];
playerID = [playerID stringByReplacingOccurrencesOfString:@"(" withString:@""];
playerID = [playerID stringByReplacingOccurrencesOfString:@")" withString:@""];
NSLog(@"Player ID: %@", playerID);
if (![playerID isEqualToString:@"null"]) {
if (!detailViewController) {
detailViewController = [[PlayerDetailViewController alloc] init];
}
NSManagedObjectContext *moc = [[AppController sharedAppController] managedObjectContext];
NSFetchRequest *req = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Players"
inManagedObjectContext:moc];
[req setEntity:entity];
NSPredicate *pre = [NSPredicate predicateWithFormat:@"playerID=%@", playerID];
[req setPredicate:pre];
NSError *error;
NSArray *list = [moc executeFetchRequest:req error:amp;error];
[req release];
Players *player = [list lastObject];
[detailViewController setPlayer:player];
//Want to Push view here
[detailViewController release];
detailViewController = nil;
}
return YES;
}
Ответ №1:
Если приложение запускается с помощью уведомления, то оно будет присутствовать в application:didFinishLaunchingWithOptions:
словаре launchOptions делегата приложения под ключом UIApplicationLaunchOptionsRemoteNotificationKey, который содержит всю информацию, содержащуюся в уведомлении (я полагаю, JSON, преобразованный в NSDictionary).
Редактировать:
Я неправильно понял вопрос, я думаю, что то, что вы ищете, — это просто указатель на выбранный в данный момент навигационный контроллер. Вы получите это, если выполните запрос [tabbarcontroller selectedViewController]
, который возвращает видимый контроллер навигации. Затем просто поместите вновь созданный контроллер поверх стека этого навигационного контроллера.
Комментарии:
1. Я правильно получаю информацию об уведомлении, с чем у меня возникают проблемы, так это с автоматическим запуском подробного просмотра в приложении уведомления. Извините, если мой вопрос был плохо сформулирован.
2. Отредактировал мой ответ, моя ошибка, не совсем понял вопрос.
3. Я пробовал оба [[[TabBarController selectedViewController] NavigationController] pushViewController: анимированный DetailViewController: ДА]; и [[TabBarController selectedViewController] presentModalViewController: анимированный DetailViewController: ДА]; но оба они заканчиваются с ошибкой SIGKILL в функции int main(). Я ошибаюсь в том, как я должен поместить представление в стек? Я думал, что pushViewController — это то, что я искал.
4. [TabBarController selectedViewController] в этом случае является NavigationController, нет необходимости вызывать NavigationController на нем. Просто преобразуйте его во временную переменную и вставьте туда контроллер сведений. UINavigationController * selectedNav = (UINavigationController *)[TabBarController selectedViewController]
5. Это отлично работает в методе didReceiveRemoteNotification, когда приложение работает в фоновом режиме, но по какой-то причине в didFinishLaunchingWithOptions я все еще получаю SIGKILL. Возможно ли это вообще при загрузке приложения?