2017-03-05 103 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); 
} 
相關問題