如何在IOS中处理多个远程通知单击

如何在IOS中处理多个远程通知单击,ios,objective-c,notifications,viewcontroller,notificationcenter,Ios,Objective C,Notifications,Viewcontroller,Notificationcenter,我试图根据通知单击打开不同的视图控制器,但当收到推送通知时,它会自动在后台运行控制器代码,因此当我通过通知中心的应用图标/通知打开应用时,它会立即加载视图控制器当接收到多个通知时,它将加载第一个通知控制器,而不管点击哪个通知 比如说,我收到了标题为“晚上”、“早上”和“早上”的通知 “夜间”,应在“夜间”时打开“夜景控制器” 点击通知,但在我离开时它会加载“夜景控制器” 向后加载“晨景控制器”,最后加载“晚景控制器” 视图控制器”。在收到通知之前,我在主控制器上 然后我把应用程序移到了后台 当我

我试图根据
通知
单击打开不同的视图控制器,但当收到
推送通知
时,它会自动在后台运行控制器代码,因此当我通过
通知中心的应用图标/通知打开应用时,它会立即加载
视图控制器
当接收到多个通知时,它将加载第一个通知控制器,而不管点击哪个通知

比如说,我收到了标题为“晚上”、“早上”和“早上”的通知 “夜间”,应在“夜间”时打开“夜景控制器” 点击通知,但在我离开时它会加载“夜景控制器” 向后加载“晨景控制器”,最后加载“晚景控制器” 视图控制器”。在收到通知之前,我在主控制器上 然后我把应用程序移到了后台

当我点击“晨起”时,它现在什么也不做

早些时候,我尝试使用addObserver,但结果是一样的,所以我移动到应用程序委托

以下是应用程序代理代码

@interface AppDelegate ()

@end


@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    [[UIApplication sharedApplication]setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];

    // Override point for customization after application launch.
    // Register for Push Notitications, if running iOS 8 or More

    if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) {

        UIUserNotificationType userNotificationTypes = (UIUserNotificationTypeAlert |
                                                        UIUserNotificationTypeBadge |
                                                        UIUserNotificationTypeSound);
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:userNotificationTypes categories:nil];
        [application registerUserNotificationSettings:settings];
        [application registerForRemoteNotifications];

    } else {
        // Register for Push Notifications before iOS 8

        [application registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert |  UIRemoteNotificationTypeSound)];
    }

    [application setStatusBarHidden:YES];

    return YES;
}

// Handle remote notification registration.
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {

    NSLog(@"Device Token %@",[self stringWithDeviceToken:deviceToken]);

    [[NSUserDefaults standardUserDefaults]setObject:[self stringWithDeviceToken:deviceToken] forKey:@"registration_id"];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)err {

    NSLog(@"Error in registration. Error: %@", err);
}


- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {

    NSDictionary *alertInfo = (NSDictionary *) userInfo[@"aps"][@"alert"];
    NSLog(@"%@",alertInfo);

    NSString *alertID = [userInfo valueForKey:@"alertid"];


    if (application.applicationState == UIApplicationStateBackground) {

        [UIApplication sharedApplication].applicationIconBadgeNumber = [UIApplication sharedApplication].applicationIconBadgeNumber + 1;

        NSLog(@"Background Mode");
        NSString *title = alertInfo[@"title"];

        [self openViewController:title];
    }

    if(application.applicationState == UIApplicationStateActive){

        NSLog(@"Active Mode");
           }

    completionHandler(UIBackgroundFetchResultNewData);
    [self performSelector:@selector(sendAckRequest:) withObject:alertID];
}


- (void)openViewController:(NSString *)notificationTitle{

    NSDictionary * userDict = [[NSUserDefaults standardUserDefaults] objectForKey:@"loginUser"];

    if([notificationTitle isEqualToString:@"Exercise"]){

    UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController;

    UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];

    Excercise *excerciseController = (Excercise*)[mainStoryboard instantiateViewControllerWithIdentifier: @"Excercise"];       
    [navigationController pushViewController:excerciseController animated:YES];
    //[navigationController presentViewController:excerciseController animated:YES completion:nil];

    }else if([notificationTitle isEqualToString:@"Weight"]){

        UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController;

        UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];

        Weight *weightController = (Weight*)[mainStoryboard instantiateViewControllerWithIdentifier: @"Weight"];           
       [navigationController pushViewController:weightController animated:YES];

        //[navigationController presentViewController:weightController animated:YES completion:nil];

    }else if([notificationTitle isEqualToString:@"MCQ"]){

        UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController;

        UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];

        QuestionOfTheDay *questionController = (QuestionOfTheDay*)[mainStoryboard instantiateViewControllerWithIdentifier: @"QuestionOfTheDay"];
        questionController.self.dictUser = userDict;
        [navigationController pushViewController:questionController animated:YES]
    }
}

-(void)sendAckRequest:(NSString *)alertID {

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    manager.requestSerializer = [AFHTTPRequestSerializer serializer];
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    NSString *userID =[[defaults objectForKey:@"loginUser"]objectForKey:@"UserId"];
    NSString *serverRegistrationID = [defaults objectForKey:@"server_registration_id"];

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];

    [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss"];
    NSString *currentDateString = [dateFormatter stringFromDate:[NSDate date]];

    //NSDate *currentDate = [dateFormatter dateFromString:currentDateString];

    //NSDictionary *parameter = @{@"ReminderDateTime":currentDateString};

    NSString *url = [NSString stringWithFormat:@"%@%@/%@/%@/?ReminderDateTime=%@",sendNotificationAck,userID,serverRegistrationID,alertID,currentDateString];


    NSLog(@"url: %@",url);

    [manager GET:url parameters:nil success:^(AFHTTPRequestOperation * _Nonnull operation, id  _Nonnull responseObject) {

        if(operation.response.statusCode == 200)
            NSLog(@"Notification Acknowledged");
        else
            NSLog(@"Notification failed to acknowledge");

    } failure:^(AFHTTPRequestOperation * _Nullable operation, NSError * _Nonnull error) {

        NSLog(@"error: %@",[error localizedDescription]);
    }];
}

- (NSString *)stringWithDeviceToken:(NSData *)deviceToken {

    const char *data = [deviceToken bytes];

    NSMutableString *token = [NSMutableString string];

    for (int i = 0; i < [deviceToken length]; i++) {

        [token appendFormat:@"%02.2hhX", data[i]];
    }

    return token;
}

- (void)applicationDidBecomeActive:(UIApplication *)application {
    // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.

    if([UIApplication sharedApplication].applicationIconBadgeNumber!=0)
    [UIApplication sharedApplication].applicationIconBadgeNumber = [UIApplication sharedApplication].applicationIconBadgeNumber - 1;
}

@end
@接口AppDelegate()
@结束
@实现AppDelegate
-(BOOL)应用程序:(UIApplication*)应用程序使用选项完成启动:(NSDictionary*)启动选项{
[[UIApplication sharedApplication]setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];
//应用程序启动后自定义的覆盖点。
//如果运行iOS 8或更高版本,请注册推送通知
if([application respondsToSelector:@selector(registerUserNotificationSettings:)])){
UIUserNotificationType userNotificationTypes=(UIUserNotificationTypeAlert|
UIUserNotificationTypeBadge|
UIUserNotificationTypeSound);
UIUserNotificationSettings*设置=[UIUserNotificationSettings设置类型:userNotificationTypes类别:nil];
[应用程序注册表通知设置:设置];
[申请登记处证明];
}否则{
//在iOS 8之前注册推送通知
[应用程序注册表的通知类型:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound)];
}
[应用程序设置StatusBarHidden:是];
返回YES;
}
//处理远程通知注册。
-(无效)应用程序:(UIApplication*)应用程序DIdRegisterForRemotionTificationswithDeviceToken:(NSData*)deviceToken{
NSLog(@“设备令牌%@”,[self-stringWithDeviceToken:deviceToken]);
[[NSUserDefaults standardUserDefaults]setObject:[self-stringWithDeviceToken:deviceToken]forKey:@“注册id”];
[[NSUserDefaults standardUserDefaults]同步];
}
-(无效)应用程序:(UIApplication*)应用程序未能注册远程通知,错误为:(N错误*)错误{
NSLog(@“注册错误。错误:%@”,错误);
}
-(void)application:(UIApplication*)application didReceiveMemotentification:(NSDictionary*)userInfo fetchCompletionHandler:(void(^)(UIBackgroundFetchResult))completionHandler{
NSDictionary*alertInfo=(NSDictionary*)用户信息[@“aps”][@“alert”];
NSLog(@“%@”,alertInfo);
NSString*alertID=[userInfo valueForKey:@“alertID]”;
if(application.applicationState==UIApplicationStateBackground){
[UIApplication sharedApplication].applicationIconBadgeNumber=[UIApplication sharedApplication].applicationIconBadgeNumber+1;
NSLog(“背景模式”);
NSString*title=alertInfo[@“title”];
[自打开视图控制器:标题];
}
if(application.applicationState==UIApplicationStateActive){
NSLog(“主动模式”);
}
completionHandler(UIBackgroundFetchResultNewData);
[自执行选择器:@selector(sendAckRequest:)with object:alertID];
}
-(void)openViewController:(NSString*)notificationTitle{
NSDictionary*userDict=[[NSUserDefaults standardUserDefaults]objectForKey:@“loginUser”];
如果([notificationTitle IsequalString:@“Exercise”]){
UINavigationController*导航控制器=(UINavigationController*)self.window.rootViewController;
UIStoryboard*mainStoryboard=[UIStoryboard情节提要,名称:@“Main”bundle:nil];
EXERCISE*EXERCISECONTROLLER=(EXERCISE*)[MainstryBoard实例化控制器的标识符:@“EXERCISE]”;
[导航控制器pushViewController:ExerciseController已设置动画:是];
//[导航控制器当前视图控制器:运动控制器已设置动画:是完成:无];
}else if([notificationTitle IsequalString:@“Weight”]){
UINavigationController*导航控制器=(UINavigationController*)self.window.rootViewController;
UIStoryboard*mainStoryboard=[UIStoryboard情节提要,名称:@“Main”bundle:nil];
重量*重量控制器=(重量*)[MainstryBoard实例化设备控制器的标识符:@“重量”];
[导航控制器pushViewController:weightController动画:是];
//[navigationController presentViewController:weightController动画:是完成:无];
}else if([notificationTitle IsequalString:@“MCQ”]){
UINavigationController*导航控制器=(UINavigationController*)self.window.rootViewController;
UIStoryboard*mainStoryboard=[UIStoryboard情节提要,名称:@“Main”bundle:nil];
QuestionOfDay*questionController=(QuestionOfDay*)[MainstryBoard实例化控制器的标识符:@“QuestionOfDay”];
questionController.self.dictUser=userDict;
[导航控制器pushViewController:questionController动画:是]
}
}
-(无效)sendAckRequest:(NSString*)警报ID{
AFHTTPRequestOperationManager*manager=[AFHTTPRequestOperationManager];
manager.requestSerializer=[AFHTTPRequestS
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {

 //recieved notification
    if ( application.applicationState == UIApplicationStateActive ){
        // app was already in the foreground
        UIViewController* topViewController = [self.navigationController topViewController];
        if ([topViewController isKindOfClass:[HomeVC class]]) {
            [[NSNotificationCenter defaultCenter] postNotificationName:@"getUpdatedServiceData" object:nil];
        }
    }
}
UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController;

UIViewController* topViewController = [navigationController visibleViewController];

if ([topViewController isKindOfClass:[Excercise class]])
{
    [topViewController dismissViewControllerAnimated:NO completion:nil];
}
    func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void)
    {
        if ( application.applicationState == UIApplicationState.Active)
        {
            // App is foreground and notification is recieved,
            // Show a alert.
        }
        else if( application.applicationState == UIApplicationState.Background)
        {
            // App is in background and notification is received, 
            // You can fetch required data here don't do anything with UI.
        }
        else if( application.applicationState == UIApplicationState.Inactive)
        {
           // App came in foreground by used clicking on notification, 
           // Use userinfo for redirecting to specific view controller.
        }

    }