一步一步教你如何做iOS推送客户端以及推送数据处理
2014-01-27 13:18
465 查看
作为iOS开发人员,一般稍微大一点的公司,都会有专门的服务端人员,所以我们是不需要写推送服务端的,我们要做的就是如何将当前的苹果设备的Token以及使用App的用户信息一起发送给APP服务端就好了,只要推送服务器需要的数据我们全部提交成功,那么当有指定信息要发到当前设备的时候,服务器就会将信息发到苹果的apns,再由苹果服务器转到我们对应得设备上,我们就可以收到消息了。
为了确保我们能够成功请求苹果服务端,注册token,也为了我们能够将token值以及当前用户信息成功发送到我们的推送服务端,避免请求失败等各种因素的影响,我们需要在设备每次打开的时候都去判断token是否存在,如果token注册成功,我们可以将token存入NSUserDefaults,通过判断NSUserDefaults中token的值是否存在来判断token是否注册成功,如果token注册成功,我们接着判断token信息以及用户信息是否发送服务器成功,如果也发送成功,那么我们的前期工作就做完了。
//每次打开App都判断token是否注册成功,不成功则继续注册,如果注册成功,则判断向服务器发送是否成功,不成功则继续发送
//注册设备token以及通知形式
//向服务器申请发送token判断事前有没有发送过
注册成功会调用此方法,返回的token一半都带有尖括号,如果不需要则需要进行处理,然后将token保存在NSUserDefaults中
/** 接收从苹果服务器返回的唯一的设备token,该token需要发送回推送服务器*/
//注册失败会调用此方法
/** 接收注册推送通知功能时出现的错误,并做相关处理*/
//发送设备token以及用户信息到服务器,以下为socket请求
//程序退出后进入会调用此方法,我们根据launchOptions的值是否存在,可以判断用户是从通知中心进入还是直接进入
//程序处于启动状态,或者在后台运行时,会接收到推送消息,解析处理
以上代码就全部完成了推送的服务端,如果大家需要点击通知消息的信息,弹窗显示或者进入某个窗口的话,可以自己进行后续代码完善,如果有不懂得,欢迎留言哦~
为了确保我们能够成功请求苹果服务端,注册token,也为了我们能够将token值以及当前用户信息成功发送到我们的推送服务端,避免请求失败等各种因素的影响,我们需要在设备每次打开的时候都去判断token是否存在,如果token注册成功,我们可以将token存入NSUserDefaults,通过判断NSUserDefaults中token的值是否存在来判断token是否注册成功,如果token注册成功,我们接着判断token信息以及用户信息是否发送服务器成功,如果也发送成功,那么我们的前期工作就做完了。
//每次打开App都判断token是否注册成功,不成功则继续注册,如果注册成功,则判断向服务器发送是否成功,不成功则继续发送
- (void)applicationDidBecomeActive:(UIApplication *)application{ //每次醒来都需要去判断是否得到device token if (![[NSUserDefaults standardUserDefaults] objectForKey:@"token"]) //如果没有注册到令牌 则重新发送注册请求 { [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(registerForRemoteNotificationToGetToken) userInfo:nil repeats:NO]; } //如果设备token以及当前用户信息发送不成功,并且token以及注册成功,并且用户已登录,则继续向服务器发送 if (![[NSUserDefaults standardUserDefaults] boolForKey:@"isSend"] && [[NSUserDefaults standardUserDefaults] objectForKey:@"token"] && [[NSUserDefaults standardUserDefaults] boolForKey:@"isLogin"] ) { [self sendDevice]; } }
//注册设备token以及通知形式
//向服务器申请发送token判断事前有没有发送过
- (void)registerForRemoteNotificationToGetToken { //注册Device Token, 需要注册remote notification //如果没有注册到令牌 则重新发送注册请求 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ [[UIApplication sharedApplication] registerForRemoteNotificationTypes: (UIRemoteNotificationTypeNewsstandContentAvailability | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)]; }); }
注册成功会调用此方法,返回的token一半都带有尖括号,如果不需要则需要进行处理,然后将token保存在NSUserDefaults中
/** 接收从苹果服务器返回的唯一的设备token,该token需要发送回推送服务器*/
- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { //token字符串 NSString* tokenStr = [NSString stringWithFormat:@"%@",deviceToken]; //去掉左右尖括号 NSRange range; range.location= 1; range.length= tokenStr.length - 2; //处理好的token NSString *token = [tokenStr substringWithRange:range]; //将设备信息存到NSUserDefaults [[NSUserDefaults standardUserDefaults] setObject:token forKey:@"token"]; [[NSUserDefaults standardUserDefaults] synchronize]; }
//注册失败会调用此方法
/** 接收注册推送通知功能时出现的错误,并做相关处理*/
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error NS_AVAILABLE_IOS(3_0){ NSLog(@"apns -> 注册推送功能时发生错误, 错误信息:\n %@", error); }
//发送设备token以及用户信息到服务器,以下为socket请求
#pragma mark - #pragma mark 发送设备信息到服务器 - (void)sendDevice{ //创建请求 SecondHouseAgentPb_Builder *builder = [SecondHouseAgentPb builder]; //配置BussinessType参数 [builder setBussinessType:SecondHouseAgentPb_BussinessTypeIosDevice]; //配置IOSDevice参数 SecondHouseAgentPb_IOSDevice_Builder *IOSDevicebuilder = [SecondHouseAgentPb_IOSDevice builder]; //配置UserInfo参数 SecondHouseAgentPb_UserInfo_Builder *userinfobuilder = [SecondHouseAgentPb_UserInfo builder]; //添加用户ID到配置 [userinfobuilder setUserId:g_pMyUserInfo.userId]; //添加用户sessionKey配置 [userinfobuilder setSessionKey:g_pMyUserInfo.session]; //将mineInfo加入IOSDevice [IOSDevicebuilder setUserInfo:[userinfobuilder build]]; //将设备Token加入IOSDevice [IOSDevicebuilder setToken:[[NSUserDefaults standardUserDefaults] objectForKey:@"token"]]; //将IOSDevice加入请求 [builder setIosDevice:[IOSDevicebuilder build]]; //参数配置完成,开始请求 NSData *data = [[builder build] data]; LNetWorkEngine *netWork= [[LNetWorkEngine alloc]initWithReqTag:100 delegate:self]; [netWork setWriteData:data]; [netWork start]; }soket请求代理方法
#pragma mark - #pragma mark LNetWorkEngineDelegate - (void)NetWorkEngineRequestFinished:(LNetWorkEngine *)netEngine { if (netEngine && netEngine.responseData) { SecondHouseAgentPb *pb = [SecondHouseAgentPb parseFromData:netEngine.responseData]; if([pb.responseStatus.code isEqualToString:kEngineSuccessTag]) { [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"isSend"]; [[NSUserDefaults standardUserDefaults] synchronize]; }else{ [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"isSend"]; [[NSUserDefaults standardUserDefaults] synchronize]; } } } - (void)NetWorkEngineRequestFailed:(LNetWorkEngine *)netEngine { } - (void)NetWorkEngineNotNet { }
//程序退出后进入会调用此方法,我们根据launchOptions的值是否存在,可以判断用户是从通知中心进入还是直接进入
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [[GrayReleaseManager manager] beginRequestServerInfo]; // Override point for customization after application launch. self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; self.window.backgroundColor = [UIColor blackColor]; //程序关闭推送执行代码================================================================= //推送的形式:标记,声音,提示 [[UIApplication sharedApplication] registerForRemoteNotificationTypes: UIRemoteNotificationTypeBadge |UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert]; //判断程序是不是由推送服务完成的 if ([launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey] != nil) { //创建一个字典 tuisongDic = [[NSMutableDictionary alloc] init]; if (tuisongDic.count != 0) { [tuisongDic removeAllObjects]; } [tuisongDic setDictionary:(NSDictionary *)[launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]]; } //推送================================================================= [self initRootViewController]; //更新自己的信息 [[self mineInfo]updateInfo]; [self.window makeKeyAndVisible]; return YES; }
//程序处于启动状态,或者在后台运行时,会接收到推送消息,解析处理
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{ if ([[userInfo objectForKey:@"aps"] objectForKey:@"alert"]!=NULL) { UINavigationController *nav = (UINavigationController *)self.window.rootViewController; [nav popToRootViewControllerAnimated:NO]; ESFHomePageViewController *maincon = [[nav viewControllers]objectAtIndex:0]; maincon.isPush = YES; maincon.tuisongDic = userInfo; NSLog(@"userInfo:%@",userInfo); [maincon viewDidLoad]; NSLog(@"%@ 3=========",userInfo); } }
以上代码就全部完成了推送的服务端,如果大家需要点击通知消息的信息,弹窗显示或者进入某个窗口的话,可以自己进行后续代码完善,如果有不懂得,欢迎留言哦~
相关文章推荐
- ios客户端向服务器端发送数据以及接收数据要如何实现?
- 手把手教你iOS如何调用React Native,即是iOS与RN的交互,将推送数据传递RN
- volist时,如何上传N个字段一样的数据以及如何在数据里再次处理
- DB2数据库HANG住的时候应该收集什么数据以及如何处理
- iOS 推送,当接到推送消息时如何处理?
- xhr的send方法以及node如何处理get和post数据
- Android 消息推送 -- Xinge Push[客户端数据接收处理]
- javascript大量推送数据如何快速处理?
- 表单向后台提交数据,get和post的两种方式的根本区别以及如何处理乱码?
- 使用PHP处理数据库数据如何将数据返回客户端并显示当前状态
- ios-如果一次性向数据库中插入大量数据,应该如何处理
- iOS开发中如何对数据与数据模型进行处理
- iOS 演示 Modal Segue 的使用,包括参数如何从呈现者传递到 ModalView 以及数据如何从 ModalView 传回呈现者(利用委托对象)
- 如何处理数据库中海量数据,以及处理数据库海量数据的经验和技巧
- iOS之如何处理TableView cell内容不一致以及cell复用重叠的问题
- hive的数据导入与数据导出:(本地,云hdfs,hbase),列分隔符的设置,以及hdfs上传给pig如何处理
- Miko Android自学之路 WifiDirect中文最强详解,如何传输数据,如何设置GroupOwener,如何设置客户端以及服务器端
- iOS根视图切换,释放内存,以及推送界面跳转(iOS多语言切换语言处理,也请看此处)
- IOS 推送-客户端处理推送消息
- asp.net的服务器控件客户端空件的区别以及如何刷新页面不靠数据库数据停留在页面