推送随记

1.有没有收到通知就马上调用的方法html

有的。若是您的App打开了background mode里的Remote Notifications项,那么当APNS的payload里指定content-available键为1时,且你的APP在后台或前台运行时/甚至你的App没有运行(但前提是用户没有经过强制关闭的方式关掉你的APP,也就是双击Home键能看到你的APP时),iOS会调用您app delegate里的ios

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

2.若是你的程序在未启动的时候,若是用户点击通知,notification会经过didFinishLaunchingWithOptions:传递给您,若是用户未点击通知,则didFinishLaunchingWithOptions:的字典里不会有notification的信息,同理,若是你的程序正在后台运行,若是用户点击通知,则(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo会在你的程序进入前台后才会被调用(注意是经过点按通知启动才会被调用)若是用户收到了通知可是没有点按通知,而是点击屏幕上的App图标进入的app,则(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo不会被调用,里面的代码不会被执行。app

3.补充:-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo不单单是用户点击推送进入app时候会被调用,用户在前台的时候收到推送通知的时候,推送不会显示,可是该过程也会被调用,因此须要在这个地方注意一下。能够判断一下程序是刚刚进入前台,仍是已在前台。并选择是否通知viewController。ide

4.fetch

若是程序经过点击推送启动,而非从后台唤醒,那么userInfo能够经过 -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 这个代理方法里的 launchOptions[@"UIApplicationLaunchOptionsRemoteNotificationKey"] 获得代理

5.code

- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo withResponseInfo:(NSDictionary *)responseInfo completionHandler:(void (^)())completionHandler {

if ([identifier isEqualToString:foregroundActionidentifier]) {

NSLog(@"ios9点击了前台模式");

}

completionHandler();

}

6.App状态htm

根据application.applicationState的状态,判断执行哪一种动做。开发

UIApplicationStateActive, // 激活状态,用户正在使用App
    UIApplicationStateInactive, // 不激活状态,用户切换到其余App、按Home键回到桌面、拉下通知中心
    UIApplicationStateBackground // 在后台运行

7.http://www.cocoachina.com/industry/20140528/8582.html

7.1用户看到消息以后,点击了一下action按钮或者点击了应用图标。若是action按钮被点击了,系统会经过调用application:didFinishLaunchingWithOptions:这个代理方法来启动应用,而且会把notification的payload数据传递进去。若是应用图标被点击了,系统也同样会调用application:didFinishLaunchingWithOptions:这个代理方法来启动应用,惟一不一样的是这时候启动参数里面不会有任何notification的信息。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    // do initializing works 
    ... 
     
    if (launchOptions) { 
        // do something else 
        ... 
     
        [AVAnalytics trackAppOpenedWithLaunchOptions:launchOptions]; 
    } 
     
    [application registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound]; 
 
    return YES; 
}

7.2

若是远程消息发送过来的时候,app正在运行,这时候会发生什么呢?

app代理的application:didReceiveRemoteNotification:方法会被调用,同时远程消息中的payload数据会做为参数传递进去。

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { 
    if (application.applicationState == UIApplicationStateActive) { 
        // 转换成一个本地通知,显示到通知栏,你也能够直接显示出一个alertView,只是那样稍显aggressive:) 
        UILocalNotification *localNotification = [[UILocalNotification alloc] init]; 
        localNotification.userInfo = userInfo; 
        localNotification.soundName = UILocalNotificationDefaultSoundName; 
        localNotification.alertBody = [[userInfo objectForKey:@"aps"] objectForKey:@"alert"]; 
        localNotification.fireDate = [NSDate date]; 
        [[UIApplication sharedApplication] scheduleLocalNotification:localNotification]; 
    } else { 
        [AVAnalytics trackAppOpenedWithRemoteNotificationPayload:userInfo]; 
    } 
}

8.应用图标上红色数字消失,设置 UIApplication.applicationIconBadgeNumber 属性为0

通常咱们会选择在应用启动的时候(application:didFinishLaunchingWithOptions:方法中),或者干脆一点,在应用每次被切换到前台的时候(applicationWillEnterForeground:方法中),调用这一行代码,便可马上清除掉Badge数字了。

9.应用该怎么响应推送消息 

上面说的处理流程,只能简单展现一下远程消息,激活用户让他们从新回到app中来。可是有时候,咱们但愿带给用户更好的使用体验,譬如若是咱们告诉用户:张三刚刚评论了你的照片。这时候用户若是点击action按钮进入app,咱们是展现具体的评论页面为好,仍是展现一般的启动页面而后让用户本身去找张三的评论好?我想负责任的开发者都会选择前者。

要作到灵活响应不一样类型的通知消息,咱们须要在通知的payload中增长更多信息,而不能仅仅只有alert出来的文字信息。对于AVOS Cloud消息推送平台来说,就须要开发者使用更高级功能的JSON格式。譬如咱们发送这样的json字符串{"action":{"type":4},"alert":"hello, everyone”} 最终在app内会收到这样的UserInfo Dictionary:

{ 
    action =     { 
        type = 4; 
    }; 
    aps =     { 
        alert = "hello, everyone"; 
        badge = 4; 
    }; 
}

“hello, everyone”会显示到alertView中,可是整个Dictionary会经过launchOptions传递给application: didFinishLaunchingWithOptions: 方法,这样咱们在程序里面就能够对不一样的消息实现不一样的跳转了。

相关文章
相关标签/搜索