2017-06-02 89 views
1

我试图在应用程序的前台很多得到修改通知.... 通过创建Notification Service Extensions没有得到推送通知的通知托盘(顶部),而应用程序在前台的iOS

背景和杀害成功修改,但仅在前台获取警报主体中的原始有效负载不在通知中。

这里 在NotificationService.m文件

@implementation NotificationService 
- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler { 
    self.contentHandler = contentHandler; 
    self.bestAttemptContent = [request.content mutableCopy]; 

    // Modify the notification content here... 


    NSLog(@"tesrrrr"); 

    self.bestAttemptContent.title = [NSString stringWithFormat:@"%@ [modified]", self.bestAttemptContent.title]; 
    self.bestAttemptContent.body = [NSString stringWithFormat:@"%@[ body added Manually ]", self.bestAttemptContent.body]; 



    self.contentHandler(self.bestAttemptContent); 
} 
{(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { 
    NSDictionary *userInfo1 = userInfo; 
    NSLog(@"userInfo: %@", userInfo1); 

    //self.textView.text = [userInfo description]; 
    // We can determine whether an application is launched as a result of the user tapping the action 
    // button or whether the notification was delivered to the already-running application by examining 
    // the application state. 

    if (application.applicationState == UIApplicationStateActive) 
    { 
     //opened from a push notification when the app was on background 


    /* UILocalNotification *localNotification = [[UILocalNotification alloc] init]; 
     localNotification.userInfo = userInfo; 
     localNotification.soundName = UILocalNotificationDefaultSoundName; 
     localNotification.alertBody = @"xyz"; 
     localNotification.fireDate = [NSDate date]; 
     [[UIApplication sharedApplication] scheduleLocalNotification:localNotification]; 

     */ 


     NSLog(@"userInfoUIApplicationStateactive->%@",[userInfo objectForKey:@"aps"]); 
     NSLog(@"userInfoUIApplicationStateactive->%@",[userInfo objectForKey:@"aps"]); 

     UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Did receive a Remote Notification" message:[NSString stringWithFormat:@"Your App name received this notification while it was Running:\n%@",[[userInfo objectForKey:@"aps"] objectForKey:@"alert"]]delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 

     [alertView show]; 

     // [self scheduleAlarmForDate1:[NSDate date]alarmDict:userInfo]; 



    } 
    else 
    { 
     // a push notification when the app is running. So that you can display an alert and push in any view 

     NSLog(@"userInfoUIApplicationStateBackground->%@",[userInfo objectForKey:@"aps"]); 

    } 
}} 
+0

在IOS 10你有一个委托方法来处理这种情况,在以前的版本中,你必须处理,在''didReceiveRemoteNotification –

+0

通知完全依赖于有效载荷数据及其使用的密钥,您是否已经在'project> target> capabilities> Background Modes'下启用了'remote notification'服务(这使应用程序能够在后台获得通知)。 – vaibhav

回答

1

实施UNUserNotificationCenterDelegate委托方法得到通知(盘在顶部),而应用程序是在前台。但它只会与IOS 10

工作在你didFinishLaunchingWithOptions方法设置UNUserNotificationCenterDelegate委托这个样子。

[UNUserNotificationCenter currentNotificationCenter].delegate = self; 

实现委托方法...

//Called when a notification is delivered to a foreground app. 
-(void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler{ 

    completionHandler(UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionBadge); 
} 

//Called to let your app know which action was selected by the user for a given notification. 
-(void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)())completionHandler{ 

    completionHandler(); 
} 

注意

如果您的应用开发目标是小于IOS10使用此设置委托。

#if defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 
    // For iOS 10 display notification (sent via APNS) 
    [UNUserNotificationCenter currentNotificationCenter].delegate = self; 
#endif 
+0

感谢它为我工作 – SANTOSH

0

当应用程序处于前台时,顶部的通知横幅未显示。该横幅由操作系统管理,并且只调用时,应用程序在后台或终止状态。

虽然这不适用于iOS 10,但是从iOS 10开始,您可以执行此操作, 您需要捕获委托中的通知并调用显示横幅的函数。

func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { 
completionHandler(UNNotificationPresentationOptions.alert) 
} 

但正如我所说,这只适用于iOS 10+。对于以前的兼容性,你可以做的是提到如下:

为它创建一个自定义的控制。 您可以轻松地赶上委托函数的通知时,应用程序是在前台。然后你可以调用你自己的自定义控件(一个视图)来显示一个横幅。 幸运的是,有很多不错的通知自定义控件做到这一点。 这里有几个:

1. BRYXBanner

2. CRToast

+0

是的,我正在编辑答案,我认为OP想要一个更通用的解决方案 –

相关问题