如何在收到通知时在iOS 7-10上显示本地通知?

时间:2017-03-05 22:11:25

标签: ios objective-c iphone notifications

我的应用正在接收来自Firebase的通知。收到通知后,应用程序会决定是否必须显示本地通知。我该怎么表现出来?我试过这段代码,但没有出现任何通知:

- (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];
}

2 个答案:

答案 0 :(得分:1)

我找到了它!

放入此代码时,会显示通知:

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

答案 1 :(得分: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;
}