iOS开发中的一大课题是研究和排查关于证书和推送的各种问题,以下是一些比较重要但容易被忽略的点。
Q:为什么有时收到远程推送但没有任何提示?
A:如果程序是运行在前台的状态下,收到远程推送时不会有任何提示,这是苹果对iOS系统设定的逻辑,无法改变。但是可以通过以下方式灵活处理:
①在application:didReceiveRemoteNotification:
方法中将远程推送转换为本地通知,虽然不能在屏幕顶端弹出提示,但是还是可以显示在系统通知栏且发出提示音的
1 | - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo |
但不推荐使用这种方式,因为这样显示在通知栏的通知会在执行[[UIApplication sharedApplication] cancelAllLocalNotifications];
时被删除
②根据业务处理成不同的提示方式,比如像微信一样在收到新消息的tabBarItem
上显示红点,或者直接弹出AlertView
Q:开发/生产证书莫名其妙就不能用了?
A:①提示
千万不要点Revoke and Request
出现这种情况说明本地没有安装苹果开发者中心的证书。如果之前一切正常,突然就遇到这个问题,十有八九是同组的成员Revoke并且重新创建了证书。
而如果你点了Revoke and Request
,你也将Revoke并且重新创建证书然后自动安装到本地(XCode真够智能的),那么你是正常了,其他成员又会遇到相同的问题。
所以最正确的解决方式是:与掌握这个AppleID的所有成员协商,找到上一次创建证书的『罪魁祸首』,让他把证书的P12文件导出来给所有成员安装,这样大家就可以愉快地共享这个账号了。
②提示
一般是使用不同的XCode或MacOS版本打开同一项目造成的,可以编辑项目的工程文件(.xcodeproj),搜索所有的udid(一般都是两个)整行删除,保存后重新打开项目即可。
注意最好不要点Fix Issue
,点完XCode会自己生成一个包含统配包标识符的描述文件,并且Remove已经生成好的描述文件,这样会影响团队中的其他成员。
③提示
在调试时使用了发布证书,换成开发证书即可。
Q:如何验证证书是否配正确了?
A:使用PushMeBaby或者SmartPush在本地验证
附:获取DeviceToken代码
1 | - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{ |