1.默认情况下,iOS设备在有网络连接的情况下都会和apple的APNs服务器建立一个长连接.
iOS系统会将当前应用的UDID + bundle id发送给APNs服务器,
APNs服务器会返回该设备的对应bundle id 对应的deviceToken
2.app会收集deviceToken发给服务器,服务器可以发送deviceToken给APNs服务器,由APNs服务器将消息推送给对应deviceToken的的设备的app.
3.制作证书,推送需要制作证书
1>先生成一个appID,这个appID是完整的不可以是模糊的
2>可以在证书里面配置证书,配置第一步生成的appID的推送证书(分为调试证书和上传证书),
也可以直接编辑appID配置证书
3>安装证书
4.实现以下代理方法:
1>注册远程推送:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
if ([UIDevice currentDevice].systemVersion.doubleValue <= 8.0) {
// 不是iOS8
UIRemoteNotificationType type = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert;
// 当用户第一次启动程序时就获取deviceToke
// 该方法在iOS8以及过期了
// 只要调用该方法, 系统就会自动发送UDID和当前程序的Bunle ID到苹果的APNs服务器
[application registerForRemoteNotificationTypes:type];
}else{
// iOS8
UIUserNotificationType type = UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIUserNotificationTypeSound;
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:type categories:nil];
// 注册通知类型
[application registerUserNotificationSettings:settings];
// 申请试用通知
[application registerForRemoteNotifications];
}
// 1.取出数据
NSDictionary *userInfo = launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey];
return YES;
}
2>取出deviceToken并发送给app的服务器:
/**
* 获取到用户对应当前应用程序的deviceToken时就会调用
*/
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
NSLog(@"%@", deviceToken);//将deviceToken上传
}
3>接收到远程通知的并处理的代理方法:
1.iOS7之前的处理方法:
/*
ios7以前苹果支持多任务, iOS7以前的多任务是假的多任务
而iOS7开始苹果才真正的推出了多任务
*/
// 接收到远程服务器推送过来的内容就会调用
// 注意: 只有应用程序是打开状态(前台/后台), 才会调用该方法
/// 如果应用程序是关闭状态会调用didFinishLaunchingWithOptions
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
/*
如果应用程序在后台 , 只有用户点击了通知之后才会调用
如果应用程序在前台, 会直接调用该方法
即便应用程序关闭也可以接收到远程通知
*/
NSLog(@"%@", userInfo);
}
2.iOS7之后:
//接收到远程服务器推送过来的内容就会调用
// ios7以后用这个处理后台任务接收到得远程通知
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
/*
UIBackgroundFetchResultNewData, 成功接收到数据
UIBackgroundFetchResultNoData, 没有;接收到数据
UIBackgroundFetchResultFailed 接收失败
*/
// NSLog(@"%s",__func__);
// NSLog(@"%@", userInfo);
NSNumber *contentid = userInfo[@"content-id"];
if (contentid) {
//注意: 在此方法中一定要调用这个调用block, 告诉系统是否处理成功.
// 以便于系统在后台更新UI等操作
completionHandler(UIBackgroundFetchResultNewData);
}else{
completionHandler(UIBackgroundFetchResultFailed);
}
}
4.极光推送:
创建应用并将推送证书的.p12文件上传给极光,集成SDK,在极光中进行推送
5.关于证书:
首先是为appID创建两个apns证书
apns证书创建好就行(绑定好appID即可)不需要什么手机说明文件
然后再次创建该appID的真机测试证书(经验证非开发者账号不可以测试apns)