• 推送的 代码实战写法


    推送的设置

    /*

     launchOptions   为NSDictionary类型的对象,里面存储有此程序启动的原因

    1.若用户直接启动,lauchOptions内无数据;

    2.若由其他应用程序通过openURL:启动,则UIApplicationLaunchOptionsURLKey对应的对象为启动URL(NSURL,UIApplicationLaunchOptionsSourceApplicationKey对应启动的源应用程序的bundle ID (NSString);

    3.若由本地通知启动,则UIApplicationLaunchOptionsLocalNotificationKey对应的是为启动应用程序的的本地通知对象(UILocalNotification);

    4.若由远程通知启动,则UIApplicationLaunchOptionsRemoteNotificationKey对应的是启动应用程序的的远程通知信息userInfo(NSDictionary);

    其他key还有UIApplicationLaunchOptionsAnnotationKey,UIApplicationLaunchOptionsLocationKey,

     UIApplicationLaunchOptionsNewsstandDownloadsKey。

     若要使用远程推送,满足两个条件:

     一、用户需 要调用注册用户推送registerUserNotificationSettings;

     二、在info.plist文件中UIBackgroundModes必须包含远程通知。

     当App进入到后台时,可以有一段时间做处理工作。对于长时间运行的任务,需要在Info.plist添加一行,键为UIBackgroundModes,值为一个数组

     */

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    {

          _pushArray = [[NSMutableArray alloc] init];  //接受远程推送消息的列表

          if (launchOptions != nil)

        {

            DLog(@"LUN:%@", launchOptions);

            // UIApplicationLaunchOptionsRemoteNotificationKey 这个key值就是push的信息

            NSDictionary *dic = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];

            DLog(@"LUN:%@", dic);

            // 为了复用代码,统一到下面这个处理方法中handlePushNotify.

            

            if([dic objectForKey:@"pushType"] != nil)

            {

                if ([[dic objectForKey:@"pushType"]intValue] ==1 || [[dic objectForKey:@"pushType"]intValue] == 2)

                {

                    [WCAlertView showAlertWithTitle:@"标题"

                                            message:[[dic objectForKey:@"aps"] objectForKey:@"alert"]

                                 customizationBlock:^(WCAlertView *alertView) {

                                     

                                 } completionBlock:^(NSUInteger buttonIndex, WCAlertView *alertView) {

                                     

                                 } cancelButtonTitle:@"确定" otherButtonTitles: nil];

                }else

                {

                    [[YFGlobalVariables sharedInstance].pushMesArray addObject:dic];

                    [_pushArray addObject:dic];

                }

            }

        }

    /*

         iOS8拥有了全新的通知中心,有全新的通知机制

         

         当屏幕顶部收到推送时只需要往下拉,就能看到快速操作界面,并不需要进入该应用才能操作。在锁屏界面,对于推送项目也可以快速处理。

         基本上就是让用户尽量在不离开当前页面的前提下处理推送信息,再次提高处理效率。

         能够进行直接互动的短信、邮件、日历、提醒,第三方应用,可以让你不用进入程序就能进行快捷操作,并专注于手中正在做的事情。

         */

        

        /*

         我们需要注意这个UIUserNotificationActionContextDefault,如果我们使用这个,我们会得到这个推送行为,Maybe和Accept

         我们还可以使用UIUserNotificationActionContextMinimal得到的是Decline和Accept行为

         */

           

        if ([getSystemVersion() floatValue] >= 8.0) {

            //这里主要是针对iOS 8.0,相应的8.1,8.2等版本各程序员可自行发挥,如果苹果以后推出更高版本还不会使用这个注册方式就不得而知了……

            UIMutableUserNotificationAction *action = [[UIMutableUserNotificationAction alloc] init];

            action.identifier = @"action";//按钮的标示

            action.title=@"Accept";//按钮的标题

            action.activationMode = UIUserNotificationActivationModeForeground;//当点击的时候启动程序

            //    action.authenticationRequired = YES;

            //    action.destructive = YES;

            

            UIMutableUserNotificationAction *action2 = [[UIMutableUserNotificationAction alloc] init];

            action2.identifier = @"action2";

            action2.title=@"Reject";

            action2.activationMode = UIUserNotificationActivationModeBackground;//当点击的时候不启动程序,在后台处理

            

            action.authenticationRequired = YES;//需要解锁才能处理,如果action.activationMode = UIUserNotificationActivationModeForeground;则这个属性被忽略;

            action.destructive = YES;

            

            //2.创建动作(按钮)的类别集合

            UIMutableUserNotificationCategory *categorys = [[UIMutableUserNotificationCategory alloc] init];

            categorys.identifier = @"alert";//这组动作的唯一标示,推送通知的时候也是根据这个来区分

            [categorys setActions:@[action,action2] forContext:(UIUserNotificationActionContextMinimal)];

            

            //3.创建UIUserNotificationSettings,并设置消息的显示类类型

            /*+ (instancetype)settingsForTypes:(UIUserNotificationType)types   categories:(NSSet *)categories;

             * 1.参数:推送类型

             * 2.参数:推送 categories 集合

             */

            UIUserNotificationSettings *notiSettings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge |

                                                                                                     UIUserNotificationTypeAlert |

                                                                                                     UIRemoteNotificationTypeSound)

                                                                                         categories:[NSSet setWithObjects:categorys, nil]];

            [application registerUserNotificationSettings:notiSettings];

        }else

        {

            UIRemoteNotificationType types =(UIRemoteNotificationTypeBadge

                                             |UIRemoteNotificationTypeSound

                                             |UIRemoteNotificationTypeAlert);

            [[UIApplication sharedApplication]  registerForRemoteNotificationTypes:types];

        }

        //消息推送支持的类型,注册消息推送

    }

    - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url

      sourceApplication:(NSString *)sourceApplication annotation:(id)annotation

    {

        if ([sourceApplication isEqualToString:@"com.meiYa.shineTour"])

        {

            

            return YES;

        }

        else

            return NO;

    }

    - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url

    {

        if (!url)

        {

            return NO;

        }

        

        return YES;

    }

    #pragma mark --处理推送

    -(void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings

    {

        //成功注册registerUserNotificationSettings:后,回调的方法 iOS8

        [application registerForRemoteNotifications];

    }

    //这里输出的DeviceToken为尖括号括起来的一串数字,是NSData类型。

    - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken

    {

        DLog(@"获取DeviceToken成功: {%@}",deviceToken);

        NSString *token = [NSString stringWithFormat:@"%@", deviceToken];

    #if 1

        [YFGlobalVariables sharedInstance].deviceID = [[token substringWithRange:NSMakeRange(1, token.length-2)]

                                                       stringByReplacingOccurrencesOfString:@" "

                                                       withString:@""];

    #elif 0

         [YFGlobalVariables sharedInstance].deviceID = [[[[token description]

                                 stringByReplacingOccurrencesOfString:@"<" withString:@""]

                                stringByReplacingOccurrencesOfString:@">" withString:@""]

                               stringByReplacingOccurrencesOfString:@" " withString:@""] ;

    #endif

    }

    - (void)application:(UIApplication *)application

    didFailToRegisterForRemoteNotificationsWithError:(NSError *)error

    {

        DLog(@"注册消息推送失败,Register Remote Notifications error:{%@}",[error localizedDescription]);

    }

    - (void)application:(UIApplication *)application

    didReceiveRemoteNotification:(NSDictionary *)userInfo

    {

        // 处理推送消息

        DLog(@"处理收到的远程消息推送,userinfo:%@",userInfo);

        DLog(@"收到推送消息:%@",[[userInfo objectForKey:@"aps"] objectForKey:@"alert"]);

        

        if ([[userInfo objectForKey:@"pushType"]intValue] ==1 || [[userInfo objectForKey:@"pushType"]intValue] == 2)

        {

            [[YFGlobalVariables sharedInstance].pushMesArray addObject:userInfo];

            

            [_pushArray addObject:userInfo];

            

            [WCAlertView showAlertWithTitle:@"标题"

                                    message:[[userInfo objectForKey:@"aps"] objectForKey:@"alert"]

                         customizationBlock:^(WCAlertView *alertView) {

                             

                         } completionBlock:^(NSUInteger buttonIndex, WCAlertView *alertView) {

                             if (buttonIndex == 1) {

                                 [self checkNotificationMessage];

                             }

                             else

                             {

                                 [self.pushArray removeLastObject];

                             }

                             

                         } cancelButtonTitle:@"取消" otherButtonTitles:@"查看", nil];

            

        }

        else

        {

            [WCAlertView showAlertWithTitle:@"标题"

                                    message:[[userInfo objectForKey:@"aps"] objectForKey:@"alert"]

                         customizationBlock:^(WCAlertView *alertView) {

                             

                         } completionBlock:^(NSUInteger buttonIndex, WCAlertView *alertView) {

                             

                         } cancelButtonTitle:@"确定" otherButtonTitles: nil];

        }

        

        

    }

    #pragma mark - 推送消息的规则判断

    // 根据 信息 跳转到 对应的界面 中  YFIndexViewController为首页的界面 视图控制器

    /*

    */

    - (void)checkNotificationMessage

    {

        YFIndexViewController *viewControllers =  [[self.tabbarController viewControllers] objectAtIndex:0];

        [viewControllers pushNotficationViewController];

    }

    //YFIndexViewController中的方法 pushNotficationViewController

    //#define kAppDelegate        ((YFAppDelegate *)[UIApplication sharedApplication].delegate)

    -(void)pushNotficationViewController

    {

        if (kAppDelegate.pushArray.count > 0) {

            if ([NSString emptyOrNull:[YFGlobalVariables sharedInstance].userInfoModel.userID]) {

                [self showLoginView];

            }

            else

            {

                [self pushMessageCheck];

            }

        }

    }

    - (void)pushMessageCheck

    {

        if (kAppDelegate.pushArray.count > 0) {

            

            NSMutableDictionary *userDictionary = [YFFileManager readUserLoginDefaultWithName:@"userLogin"];

            

            NSDictionary *dic = [kAppDelegate.pushArray lastObject];

            NSString *userName =[dic objectForKey:@"userName"];

            if ([userName isEqualToString:[userDictionary objectForKey:@"userName"]]) {

                

                if ([[[getAppDelegate().pushArray lastObject] objectForKey:@"pushType"]intValue]==2)

                {

                    [YFGlobalVariables sharedInstance].isLowPricePush = YES;

                    [self getCurrentUserInfo];

                    

                }else

                {

                    if (getAppDelegate().pushArray.count != 0)

                    {

                        NSDictionary *dictionary =[[NSDictionary alloc] initWithDictionary:[getAppDelegate().pushArray lastObject]];

                        [self lookForOrderDetail:[dictionary objectForKey:@"orderNo"] orderType:[[dictionary objectForKey:@"orderType"] integerValue]];

                    }

                }

            }

            else

            {

                [kAppDelegate.tabbarController selectTabAtItem:YFTabBarIndexItem];

                [YFUtil accoutLogout];

                NSMutableDictionary *loginDic = [[NSMutableDictionary alloc] init];

                [loginDic setObject:userName forKey:@"userName"];

                [loginDic setObject:@"" forKey:@"userPassword"];

                [loginDic setObject:[NSNumber numberWithBool:NO] forKey:@"isAutoLogin"];

                [YFFileManager saveUserLoginDefaultsDataWithName:@"userLogin" saveObject:loginDic];

                 [self showLoginView];

            }

        }

    }

    //审批推送时的跳转

    -(void)lookForOrderDetail:(NSString*)orderString orderType:(NSInteger)orderType;

    {

        //[self showLoadWaitView];

        

        if (orderType == 1) {

            YFAirOrderDetailViewController *airOrderController = [[YFAirOrderDetailViewController alloc] initWithOrderNo:orderString];

            [self.navigationController pushViewController:airOrderController animated:YES];

        }

        else if(orderType == 2)

        {

            YFChangeOrderDetailViewController *changeDetailController = [[YFChangeOrderDetailViewController alloc] initWithOrderInfo:orderString];

            [self.navigationController pushViewController:changeDetailController animated:YES];

        }

        else if(orderType == 3)

        {

            YFReturnOrderDetailViewController *returnOrderController = [[YFReturnOrderDetailViewController alloc] initWithOrderInfo:orderString];

            [self.navigationController pushViewController:returnOrderController animated:YES];

        }

        else if(orderType == 5)

        {

            YFHotelOrderDetailViewController *hotelViewController = [[YFHotelOrderDetailViewController alloc] init];

            hotelViewController.orderNo = orderString;

            [self.navigationController pushViewController:hotelViewController animated:YES];

        }

        else if(orderType == 70)

        {

            YFTrainOrderDetailViewController *orderDetailController = [[YFTrainOrderDetailViewController alloc] init];

            orderDetailController.orderNo = orderString;

            [self.navigationController pushViewController:orderDetailController animated:YES];

            

        }else if(orderType == 80)

        {

            YFTrainReturnTicketViewController *returnOrderDetailController  = [[YFTrainReturnTicketViewController alloc] init];

            returnOrderDetailController.orderNo = orderString;

            [self.navigationController pushViewController:returnOrderDetailController animated:YES];

        }

        

    }

    最后 :手把手教你 iOS推送 

    http://www.cocoachina.com/industry/20130321/5862.html

  • 相关阅读:
    ubuntu 完全干净的卸载docker
    thinkphp5 助手函数input的常用方法
    thinkphp6
    docker编排
    Linux下的tar压缩解压缩命令详解
    scp拷贝命令
    一行命令搞定node.js 版本升级
    git 设置文件大小写敏感
    ubuntu1804php安装
    关于权限表的基本设计
  • 原文地址:https://www.cnblogs.com/PengFei-N/p/4786537.html
Copyright © 2020-2023  润新知