iOS远程推送和证书的一些Q&A

iOS开发中的一大课题是研究和排查关于证书和推送的各种问题,以下是一些比较重要但容易被忽略的点。

Q:为什么有时收到远程推送但没有任何提示?

A:如果程序是运行在前台的状态下,收到远程推送时不会有任何提示,这是苹果对iOS系统设定的逻辑,无法改变。但是可以通过以下方式灵活处理:
①在application:didReceiveRemoteNotification:方法中将远程推送转换为本地通知,虽然不能在屏幕顶端弹出提示,但是还是可以显示在系统通知栏且发出提示音的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
// Required
[APService handleRemoteNotification:userInfo];
NSLog(@"收到通知:%@", userInfo);

// 当App运行在前台,转换为本地通知
if (application.applicationState == UIApplicationStateActive && userInfo.count != 0) {
[[UIApplication sharedApplication] cancelAllLocalNotifications];
UILocalNotification *notify = [[UILocalNotification alloc] init];

notify.soundName = UILocalNotificationDefaultSoundName;
notify.userInfo = userInfo;
notify.alertBody = [[userInfo objectForKey:@"aps"] objectForKey:@"alert"];

[[UIApplication sharedApplication] presentLocalNotificationNow:notify];
}
}

但不推荐使用这种方式,因为这样显示在通知栏的通知会在执行
[[UIApplication sharedApplication] cancelAllLocalNotifications];时被删除

②根据业务处理成不同的提示方式,比如像微信一样在收到新消息的tabBarItem上显示红点,或者直接弹出AlertView

Q:开发/生产证书莫名其妙就不能用了?

A:①提示
图1

千万不要点Revoke and Request
出现这种情况说明本地没有安装苹果开发者中心的证书。如果之前一切正常,突然就遇到这个问题,十有八九是同组的成员Revoke并且重新创建了证书。
而如果你点了Revoke and Request,你也将Revoke并且重新创建证书然后自动安装到本地(XCode真够智能的),那么你是正常了,其他成员又会遇到相同的问题。
所以最正确的解决方式是:与掌握这个AppleID的所有成员协商,找到上一次创建证书的『罪魁祸首』,让他把证书的P12文件导出来给所有成员安装,这样大家就可以愉快地共享这个账号了。

②提示
图2

一般是使用不同的XCode或MacOS版本打开同一项目造成的,可以编辑项目的工程文件(.xcodeproj),搜索所有的udid(一般都是两个)整行删除,保存后重新打开项目即可。
注意最好不要点Fix Issue,点完XCode会自己生成一个包含统配包标识符的描述文件,并且Remove已经生成好的描述文件,这样会影响团队中的其他成员。

③提示
图3

在调试时使用了发布证书,换成开发证书即可。

Q:如何验证证书是否配正确了?

A:使用PushMeBaby或者SmartPush在本地验证

附:获取DeviceToken代码

1
2
3
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{
NSLog(@"deviceToken:%@",deviceToken);
}