本博意在记录开发过程中遇到的一些bug。可能大部分内容会有主观偏向,又或者学艺不精说的不对的,请多包涵。
最近的开发是接手别人做的快结束的项目并在其中查杀bug。当时推送这块的问题挺多的。
其中程序在后台运行或者程序没有在运行时,收到推送时就只有上方的view并没有声音提示。在记录的同时顺带提一下推送的几种形式以及推送的处理方法。
首先是推送的几种形式:
1.程序在前端运行
2.程序在后台运行
3.程序没有在运行
然后收到推送后系统提供了3种响应,分别是提示音,alert弹窗和图标右上角的计数。
不过这些需要在程序里注册,貌似一般都是这样注册的
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge |
UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert];
}
这里就不得不提遇到的bug,之前的程序员是这么写的
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
虽然只是多了个括号,但是就是没有声音。
其他的具体流程在网上一搜能找到一大堆,我就不啰嗦了。
然后是收到推送之后该怎么办:
不管推送是通过什么途径推送的,这个方法都能响应的。- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
不过也有一个例外,就是程序没有在运行或者说在后台失去活性(我也不知道该怎么准确称呼这种情况)也就是内存被程序释放的时候,会走这个方法
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
正常通过点击图标进入程序时这个方法的参数launchOptions是为空的,但是如果是通过点击推送进入程序的时候launchOptions就会是该推送的信息。
所以可以这么写
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
...
if (launchOptions != nil)
{
NSDictionary* dictionary = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if (dictionary != nil)
{
[self application:application didReceiveRemoteNotification:dictionary];
}
}
...
}
这样你的程序在离线的时候收到推送也能正确处理了。