ios10更新以来,推送改的还是很多的,让我们从头说来
先说系统注册远程通知,ios10之后,注册方法变成了这样
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
center.delegate = self;
[center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionCarPlay) completionHandler:^(BOOL granted, NSError *_Nullable error) {
if (!error) {
NSLog(@"request authorization succeeded!");
}
}];
[[UIApplication sharedApplication] registerForRemoteNotifications];
注意,用这个方法,需要你引入这个,并遵循代理(因为之后的处理收到的消息时会用到)
#import <UserNotifications/UserNotifications.h>
UNUserNotificationCenterDelegate
ios8之后,还需要添加这个方法
//ios8之后,需要添加这个方法
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
[application registerForRemoteNotifications];
}
成功之后,会走注册成功的代理
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
在这个方法里,你可以获取到apns服务器返回的devicetoken,用这个token来注册第三方的推送平台
顺便说一下,第三方推送的过程,1.程序向苹果服务器,注册获取devicetoken,2.第三方服务器根据devicetoken,注册程度,返回一个cid,3.如果程序在运行,ios10之前,是直接走的是第三方的透传消息成功通道,ios10之后,先走的是系统自己的收到通知的方法,然后再走的是第三方的成功方法,4.程序在后台,第三方会通过apns服务器来推送消息
NSString *token = [[deviceToken description] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]];
token = [token stringByReplacingOccurrencesOfString:@" " withString:@""];
[customPlatform registerDeviceToken:token];//根据自己的使用的平台来替换customPlatform
如果第三方平台注册成功了,会走平台自己的成功回调,返回一个cid(第三方平台的一个id,绑定了你的devicetoken)
第三方平台注册账号,绑定你的app这个就不说了,每个第三方都很明白的写出来了。
好了,到现在你的注册已经搞定了------注意,模拟器也可以成功注册(虽然一直走的是系统注册失败的方法,但是你在第三方的成功回调中,会得到cid),但是不支持推送测试的。
--------------我是分割线---------------
真机测试推送,创建证书流程
如果你之前创建的有测试用的app id,但是没有开启推送功能,很好办
找到这个app id,点击edit,勾选里边的
如果你的app id这个东西死活都点击不了,那说明,你的app id命名不对,命名不能包含通配符*
接下来就是添加csr证书了,这个网上很多教程,很简单就搞定了
这个时候你的app id推送这一栏应该是这样的
我这里已经配好了开发者,如果你还没有配置开发者推送证书的话,那么两个都应该是黄色的点
接下来,创建开发者推送证书
下一步
然后选择你刚才的app id
接下来还是csr,如果你之前创建过的有csr直接用就行,这样,开发者推送证书就搞定了(如果别人要用,要把这个证书导出,在钥匙串哪里,直接导出,后缀是p12的,最好设置一个密码,第三方用这个证书配置你app的时候,要用到密码的)
接下来,就是描述文件了,描述文件就是把你的app id跟证书绑定到一块的东西
如果已经存在的有开发者描述文件了,直接点进去,选择edit(如果没有,那就直接添加一个,过程是一样的)
app id选择你刚才的,证书选择你的开发者证书(不是刚才创建的那个推送证书)设备一般都是全选,一路点击到底,最后down下来。
到此,你的开发者推送证书也已经搞定了,接下来就要开始愉快的测试了
--------------我是可爱的分割线-----------------
如果想要真机测试收到消息,在xcode中,(好像是ios10之后)必须要手动开启推送服务
ios10之前,收到通知处理相关逻辑是这个
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler{
NSLog(@"收到的推送信息为------%@",userInfo);
completionHandler(UIBackgroundFetchResultNewData);
}
这里的userinfo就是收到的东西,是一个字典,格式为
你可以根据需要,取出里边的东西
ios10之后,收到通知是这个方法,不管是本地的还是远程,都是这个方法,你可以在这里写上弹窗来提提示用户(应用在打开的情况下,没有在后台也没杀死)
- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler {
NSDictionary *dic = notification.request.content.userInfo;
completionHandler(UNNotificationPresentationOptionBadge|UNNotificationPresentationOptionSound|UNNotificationPresentationOptionAlert);
}
如果要处理收到的通知(例如,点击通知跳转或者弹窗等)是在这个方法里写(如果你写了上边的那个处理方法,这个方法可以不用写,api是向下兼容的,如果不写下边这个,也是可以的),只有程序在后台或者杀死,才能收到系统的弹窗
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler {
#pragma mark -- 测试点击 --
NSString* alertStr = nil;
NSDictionary *dic = response.notification.request.content.userInfo;
NSDictionary *apsInfo = [dic objectForKey:@"aps"];
NSObject *alert = [apsInfo objectForKey:@"alert"];
if ([alert isKindOfClass:[NSString class]])
{
alertStr = (NSString*)alert;
} else if ([alert isKindOfClass:[NSDictionary class]])
{
NSDictionary* alertDict = (NSDictionary*)alert;
alertStr = [alertDict objectForKey:@"body"];
}
//这里,以跳转为例(这里,是程序在后台,但是没有杀死的情况)
TongzhiController *tongzhi = [[TongzhiController alloc] init];
UINavigationController *na = [[UINavigationController alloc] initWithRootViewController:tongzhi];
[self.window.rootViewController presentViewController:na animated:YES completion:nil];
NSLog(@"-------%@", response.notification.request.content.userInfo);
completionHandler();
}
如果程序已经被杀死,点开还想跳转目的界面,需要在delegete中启动的方法里写(这里需要注意一下,如果你已经在点击通知的那个方法已经写好了处理,即使程序被杀死,你的处理也会执行,下边这个方法,不写也没问题)
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//收到的远程推送内容
NSDictionary *dic = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
//这里以alert提示为例,你也可以写别的处理
if (dic) {
UIAlertView *textAlert = [[UIAlertView alloc] initWithTitle:@"kill" message:(dic[@"aps"])[@"alert"] delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确认", nil];
[textAlert show];
}
至此,注册通知,证书配置,消息处理,就搞定了,如果有什么错误的地方,还请大牛指正。🙂🙂