一步一步教你如何做iOS推送客户端以及推送数据处理

作为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);
    }
}

以上代码就全部完成了推送的服务端,如果大家需要点击通知消息的信息,弹窗显示或者进入某个窗口的话,可以自己进行后续代码完善,如果有不懂得,欢迎留言哦~


你可能感兴趣的:(iOS)