您的位置:首页 > 移动开发 > IOS开发

一步一步教你如何做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是否注册成功,不成功则继续注册,如果注册成功,则判断向服务器发送是否成功,不成功则继续发送

- (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);
}
}


以上代码就全部完成了推送的服务端,如果大家需要点击通知消息的信息,弹窗显示或者进入某个窗口的话,可以自己进行后续代码完善,如果有不懂得,欢迎留言哦~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐