iOS刚进入后台接受推送、打开推送调转到相应的界面

简介: 刚进入后台的时候消息处理时候我用了本地推送!可以看我前边写的博客,怎么处理刚进入后台接收推送的案例,链接/** 注释:打开推送的三种方式:-peter 1、apns的时候,结束进程退出后台:启动的时候可在 didFinishLaunchingWithOptions的launchOptions中...

刚进入后台的时候消息处理时候我用了本地推送!可以看我前边写的博客,怎么处理刚进入后台接收推送的案例,链接

/**

 注释:打开推送的三种方式:-peter

 1、apns的时候,结束进程退出后台:启动的时候可在 didFinishLaunchingWithOptions的launchOptions中处理;

获取字典 launchOptions 中的 UIApplicationLaunchOptionsRemoteNotificationKey的key

   NSDictionary *optionsRemoteNotificationKey = [launchOptions dictionaryValueForKey:@"UIApplicationLaunchOptionsRemoteNotificationKey"];

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

{

    /**二次启动获得推送点击信息,本地储存二次启动的内容 仿qq点击推送栏启动 by peter***/

   NSDictionary *optionsRemoteNotificationKey = [launchOptions dictionaryValueForKey:@"UIApplicationLaunchOptionsRemoteNotificationKey"];

    [[NSUserDefaults standardUserDefaults] setObject:optionsRemoteNotificationKey forKey:kSavePushMessage];

    /**为了验证第一次启动的时候不能截获启动信息,加啊alert**/

    /**

    NSString * str = [NSString stringWithFormat:@"%@",launchOptions];

 

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

        UIAlertView *art = [[UIAlertView alloc]initWithTitle:nil message:str delegate:self cancelButtonTitle:@"取消" otherButtonTitles: nil];

        [art show];

 

    });

    **/

    return YES;

}

 2、apns的时候,结束进程未退出后台:启动的时候可在 didReceiveRemoteNotification的userInfo中处理;

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo

{

    NSString *  appData = [userInfo stringValueForKey:@"appData"];

    

    NSData *jsonData = [appData dataUsingEncoding:NSUTF8StringEncoding];

    NSError *err;

    NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData

                                                        options:NSJSONReadingMutableContainers

                                                          error:&err];

    

    if(err)

    {

        NSLog(@"json解析失败:%@",err);

    }else{

        NSString * positionIdString = [NSString stringWithFormat:@"%@",[dic numberValueForKey:@"positionId"]] ;

        if ([dic numberValueForKey:@"positionId"] !=0) {

            [[NSNotificationCenter defaultCenter] postNotificationName:kString_DispantData object:positionIdString];

        }

    }

}

 3、本地推送,未结束进程未退出后台(此方达为了解决消息刚进入后台时候没有通知的情况):启动的时候可在 didReceiveLocalNotification的notification中处理;

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification{

    NSDictionary *dic = notification.userInfo;

    NSString * positionIdString = [dic stringValueForKey:@"positionId"];

    if (![positionIdString isEqualToString:@""]) {

        [[NSNotificationCenter defaultCenter] postNotificationName:kString_DispantData object:positionIdString];

    }

 

}

 **/

 

二、处理页面跳转功能

说明:由于情况1都代表app已经结束需要重新启动,只能做本地存储,然后到tabbar页面的时候取出该存储值的对应id然后进行跳转。情况2、3  ,App的tabbar页面已经存在可以注册一个通知在2、3的情况时候发送通知!

1、存储调转

在tabbar的viewDidAppear方法

- (void)viewDidAppear:(BOOL)animated

{

    [super viewDidAppear:animated];

    

    NSDictionary *optionsRemoteNotificationKey = [[NSUserDefaults standardUserDefaults] objectForKey:kSavePushMessage];

    NSString *appDataString = [optionsRemoteNotificationKey stringValueForKey:@"appData"];

    if (appDataString&&![appDataString isEqualToString:@""]) {

        [[NSUserDefaults standardUserDefaults] setObject:nil forKey:kSavePushMessage];

    }

}

2、通知跳转

注册监听tabbar的viewDidLoad方法里边

- (void)viewDidLoad

{

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(pushDispanchPositionDetail:) name:kString_DispantData object:nil];

}

 方法接收

#pragma mark observer Notification

-(void)pushDispanchPositionDetail:(NSNotification *)notify

{

    if (notify.object&&![notify.object isEqualToString:@""]) {

        [self pushData:notify.object];

    }

}

 

- (void)pushData:(NSString *)positionId{

    [self setSelectedIndex:MainTabBarIndex_User];

    RootNavigationController* selNavi = [self.viewControllers objectAtIndex:MainTabBarIndex_User];

    HHPositionDetailC *vc = [[HHPositionDetailC alloc] init];

    vc.positionId = [positionId longLongValue];

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.25 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

        selNavi.toolbar.hidden = YES;

        [selNavi pushViewController:vc animated:YES];

        HDMyPositionViewController *myPositionVC = [[HDMyPositionViewController alloc]init];

        NSMutableArray *mutArray = [NSMutableArray arrayWithArray:selNavi.viewControllers];

        [mutArray insertObject:myPositionVC atIndex:1];

        selNavi.viewControllers = [mutArray copy];

    });

}

详细解释跳转代码

    [self setSelectedIndex:MainTabBarIndex_User];

    RootNavigationController* selNavi = [self.viewControllers objectAtIndex:MainTabBarIndex_User];

    HHPositionDetailC *vc = [[HHPositionDetailC alloc] init];

    vc.positionId = [positionId longLongValue];

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.25 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

        selNavi.toolbar.hidden = YES;

        [selNavi pushViewController:vc animated:YES];

        HDMyPositionViewController *myPositionVC = [[HDMyPositionViewController alloc]init];

        NSMutableArray *mutArray = [NSMutableArray arrayWithArray:selNavi.viewControllers];

        [mutArray insertObject:myPositionVC atIndex:1];

        selNavi.viewControllers = [mutArray copy];

    });

1、找到所进入的viewController的根导航Navigation;然后进行选中(self代表tabbar)  [self setSelectedIndex:MainTabBarIndex_User];

2、然后延迟调转,由于初始化tababr的原因不延迟跳转会出现调转不进去的情况;所以做延迟跳转处理。

   [selNavi pushViewController:vc animated:YES];

3、找到当前的viewControllers数组,创建需要返回的二级页面加入栈中!

 

这样就能点推送进入C,返回B,在返回所需要的tabbar的某个界面。

 

相关文章
|
5月前
|
编解码 安全 Android开发
探索iOS与Android开发的差异:从界面到性能
【6月更文挑战第10天】在移动应用开发的广阔天地中,iOS和Android两大平台各占山头,它们在设计理念、用户体验、性能优化等方面展现出独特的魅力。本文将深入探讨这两大系统在开发过程中的主要差异,从用户界面设计到性能调优,揭示各自背后的技术逻辑与创新策略,为开发者提供全面的视角和实用的开发指南。
|
6月前
|
Android开发 iOS开发
ios后台播放声音的三种实现方式
ios后台播放声音的三种实现方式
522 1
|
6月前
|
安全 Swift iOS开发
【Swift 开发专栏】Swift 与 UIKit:构建 iOS 应用界面
【4月更文挑战第30天】本文探讨了Swift和UIKit在构建iOS应用界面的关键技术和实践方法。Swift的简洁语法、类型安全和高效编程模型,加上与UIKit的紧密集成,使开发者能便捷地创建用户界面。UIKit提供视图、控制器、布局、动画和事件处理等功能,支持灵活的界面设计。实践中,遵循设计原则,合理组织视图层次,运用布局和动画,以及实现响应式设计,能提升界面质量和用户体验。文章通过登录、列表和详情界面的实际案例展示了Swift与UIKit的结合应用。
298 1
|
6月前
|
iOS开发
iOS中如何显示后台返回的带有html标签的富文本字符串
iOS中如何显示后台返回的带有html标签的富文本字符串
62 0
|
6月前
|
定位技术 开发工具 iOS开发
ios9定位服务的app进入后台三分钟收不到经纬度,应用被挂起问题及解决方案
ios9定位服务的app进入后台三分钟收不到经纬度,应用被挂起问题及解决方案
61 0
|
6月前
|
存储 移动开发 JavaScript
【原生】sd.js帮助您简化繁重的获取数据、存储数据(CRUD)骚操作(吐槽~在安卓9.0以下或者IOS10.X以下手机端H5页面不支持,在这两种情况下的系统只能使用ajax或者原生js请求后台数据)
【原生】sd.js帮助您简化繁重的获取数据、存储数据(CRUD)骚操作(吐槽~在安卓9.0以下或者IOS10.X以下手机端H5页面不支持,在这两种情况下的系统只能使用ajax或者原生js请求后台数据)
|
Web App开发 Android开发 iOS开发
iOS 后台程序
iOS 后台程序
174 0
|
iOS开发
ios调用系统应用界面显示如何显示中文
在iOS里面,跳转到系统相簿界面,通讯录界面等后标题显示的英文,关键是手机已经设置显示中文了。
71 0
|
Swift
iOS12 切换到后台请求丢失的问题
iOS12版本后,AFNetworking请求过程中,app返回后台,会出现以下错误,并且网络请求中断(只在真机中出现,模拟器不会复现)
225 0