如何在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.
}
}