2017-03-05 68 views
0

我的应用正在接收来自Firebase的通知。收到通知后,应用程序会决定是否必须显示本地通知。我如何显示它?我试过这段代码,但没有出现任何通知:如何在收到通知时在iOS 7-10上显示本地通知?

- (BOOL)application:(UIApplication *)application 
    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    // Register for remote notifications 
    if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_7_1) { 
    // iOS 7.1 or earlier. Disable the deprecation warnings. 
    #pragma clang diagnostic push 
    #pragma clang diagnostic ignored "-Wdeprecated-declarations" 
    UIRemoteNotificationType allNotificationTypes = 
     (UIRemoteNotificationTypeSound | 
     UIRemoteNotificationTypeAlert | 
     UIRemoteNotificationTypeBadge); 
    [application registerForRemoteNotificationTypes:allNotificationTypes]; 
    #pragma clang diagnostic pop 
    } else { 
    // iOS 8 or later 
    // [START register_for_notifications] 
    if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_9_x_Max) { 
     UIUserNotificationType allNotificationTypes = 
     (UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge); 
     UIUserNotificationSettings *settings = 
     [UIUserNotificationSettings settingsForTypes:allNotificationTypes categories:nil]; 
     [[UIApplication sharedApplication] registerUserNotificationSettings:settings]; 
    } else { 
     // iOS 10 or later 
     #if defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 
     UNAuthorizationOptions authOptions = 
      UNAuthorizationOptionAlert 
      | UNAuthorizationOptionSound 
      | UNAuthorizationOptionBadge; 
     [[UNUserNotificationCenter currentNotificationCenter] 
      requestAuthorizationWithOptions:authOptions 
      completionHandler:^(BOOL granted, NSError * _Nullable error) { 
       #pragma unused(granted) 
       #pragma unused(error) 
      } 
     ]; 

     // For iOS 10 display notification (sent via APNS) 
     [[UNUserNotificationCenter currentNotificationCenter] setDelegate:self]; 
     // For iOS 10 data message (sent via FCM) 
     [[FIRMessaging messaging] setRemoteMessageDelegate:self]; 
     #endif 
    } 

    [[UIApplication sharedApplication] registerForRemoteNotifications]; 
    // [END register_for_notifications] 
    } 

    // [START configure_firebase] 
    [FIRApp configure]; 
    // [END configure_firebase] 
    // Add observer for InstanceID token refresh callback. 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tokenRefreshNotification:) 
               name:kFIRInstanceIDTokenRefreshNotification object:nil]; 
    return YES; 
} 


-(void)dispathNotification:(UIApplication *)application userInfo:(NSDictionary *)userInfo { 
    NSLog(@"Received notification"); 
    UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; 
    [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) { 
     if (settings.authorizationStatus == UNAuthorizationStatusAuthorized) { 
      UNMutableNotificationContent *content = [UNMutableNotificationContent new]; 
      content.title = @"new notification"; 
      content.body = @"show content"; 
      content.sound = [UNNotificationSound defaultSound]; 
      UNTimeIntervalNotificationTrigger *trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:1 repeats:false]; 
      NSString *identifier = [NSString stringWithFormat:@"%f", [[NSDate date] timeIntervalSince1970]]; 
      UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:identifier content:content trigger:trigger]; 
      [center addNotificationRequest:request withCompletionHandler:nil]; 
     } 
    }]; 
} 

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {  
    [self dispathNotification:application userInfo:userInfo]; 
} 

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo 
    fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { 
    [self dispathNotification:application userInfo:userInfo]; 
    completionHandler(UIBackgroundFetchResultNewData); 
} 

- (void)applicationReceivedRemoteMessage:(FIRMessagingRemoteMessage *)remoteMessage { 
    NSDictionary *userInfo = [remoteMessage appData]; 
    [self dispathNotification:[UIApplication sharedApplication] userInfo:userInfo]; 
} 
+0

你是什么意思?收到通知时,调试方法dispatchNotfication被调用并执行所有步骤,但在中心addNotificationRequest之后,什么也没有发生,什么也没有出现。 – mabg

回答

0

您应该实现2种不同的方法来处理本地或远程通知。看下面。

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{ 
     UIApplicationState state = [application applicationState]; 
     if(state == UIApplicationStateActive){ 

      NSString *message = @""; 
      if([message isEqualToString:@""] || message == nil) 
       message = @"local notify"; 
       UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"local message" 
                   message:message 
                   delegate:self cancelButtonTitle:[[ContentKeeper getKeeper] getResourceForKey:@"OKButtonText"].Value 
                 otherButtonTitles:nil]; 
       [alert show]; 
     } 
    } 



- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification 
{ 
    UIApplicationState state = [application applicationState]; 
    if (true) { 
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Reminder" 
                 message:notification.alertBody 
                 delegate:self cancelButtonTitle:@"OK" 
               otherButtonTitles:nil]; 
     [alert show]; 
    } 

    // Set icon badge number to zero 
    application.applicationIconBadgeNumber = 0; 
} 
+0

这显示了一个提醒,但是,如何在通知中心上发出通知? – mabg

+0

当你在应用程序中时,推送通知没有从上面提出。如果你愿意,你可以开发自定义的小狗,而不是改变警报去做。 –

0

我发现了!

当把这个代码,表明通知:

-(void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler{ 
    completionHandler(UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionBadge); 
}