iOS - 当应用程序正在运行时,推送通知警报未显示

35

我在我的应用程序中集成了推送通知。用户将收到加入群组的推送通知。当用户点击加入时,我需要在代码中处理一些内容。因此,我正在实现:

- (void)application:(UIApplication *)application 
        didReceiveRemoteNotification:(NSDictionary *)userInfo

当应用没有运行时,这个问题可以很好地解决。
但是当应用程序正在运行时,我没有看到任何UIAlertView。如何使我的应用程序显示推送通知弹出窗口,以便用户仍然可以决定是否加入?


这是最好的解决方案!https://dev59.com/RWUp5IYBdhLWcg3w_rvT?rq=1 - FedeH
7个回答

71

在我的应用程序委托中,我使用了类似于下面的代码来模拟应用程序活动时的通知警报。你应该实现适当的UIAlertViewDelegate协议方法以处理用户点击按钮时发生的事情。

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {    
  UIApplicationState state = [application applicationState];
  if (state == UIApplicationStateActive) {
      NSString *cancelTitle = @"Close";
      NSString *showTitle = @"Show";
      NSString *message = [[userInfo valueForKey:@"aps"] valueForKey:@"alert"];
      UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Some title"
       message:message 
       delegate:self 
       cancelButtonTitle:cancelTitle 
       otherButtonTitles:showTitle, nil];
      [alertView show];
      [alertView release];
  } else {
    //Do stuff that you would do if the application was not active
  }
}

太好了!有没有办法播放通知声音? - Fernando Santiago
@FernandoSantiago 抱歉回复晚了,但我还没有调查过那个问题...希望你已经找到了播放声音的方法。 - Jakob W

17

如果有人感兴趣的话,我最终创建了一个自定义视图,它看起来像系统推送横幅,但添加了一个关闭按钮(小蓝色X)和一个选项,可点击消息以进行自定义操作。 它还支持用户在阅读/解除旧通知之前接收到多个通知的情况(没有积累数量的限制...)

GitHub链接:AGPushNote

基本使用方法为一行:

[AGPushNoteView showWithNotificationMessage:@"John Doe sent you a message!"];

在 iOS7 上它看起来像这样(iOS6 有一个 iOS6 的外观和感觉...)

范例


1

在运行应用程序时显示警报视图,您必须使用

-(void)application:(UIApplication *)application 
       didReceiveRemoteNotification:(NSDictionary *)userInfo {
}

通过访问 userInfo 变量


1

1

只有这个函数会被调用,你必须明确地在那种情况下显示警报,如果应用程序正在运行并且你已经实现了通知,则不会收到通知。在那里设置断点并处理通知调用,当函数被调用时,在那里显示你的自定义警报。


0

这里有一个支持UIAlertController的版本

-(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
UIApplicationState state = [application applicationState];
[UIApplication sharedApplication].applicationIconBadgeNumber = 0;
if (state == UIApplicationStateActive) {

    UIAlertController * alert=   [UIAlertController
                                  alertControllerWithTitle:notification.alertTitle
                                  message:notification.alertBody
                                  preferredStyle:UIAlertControllerStyleAlert];

    UIAlertAction* ok = [UIAlertAction
                         actionWithTitle:@"OK"
                         style:UIAlertActionStyleDefault
                         handler:^(UIAlertAction * action)
                         {
                             [alert dismissViewControllerAnimated:YES completion:nil];

                         }];

    [alert addAction:ok];

    [self.navigationController presentViewController:alert animated:YES completion:nil];

}

}

请注意,我的应用程序在 App Delegate 中使用 self.navigationController,请连接到任何 ViewController 以呈现(show)警报。

0

应用程序仍将在您的应用委托中接收到-application:didReceiveRemoteNotification消息,但您必须自己处理该消息(即默认情况下不显示警报)。

userInfo参数包含一个带有键notificationType的对象,您可以使用它来识别推送消息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接