Tag: uiapplicationdelegate

检测是否应用:didReceiveRemoteNotification:fetchCompletionHandler:通过点击Notification Center中的通知来调用

application: didReceiveRemoteNotification: fetchCompletionHandler: 不同于 application: didReceiveRemoteNotification: 怎么样? 从文档: 与application:didReceiveRemoteNotification:方法不同,该方法仅在应用程序运行时调用,系统将调用此方法,而不pipe应用程序的状态如何。 如果您的应用程序被暂停或未运行,则在调用该方法之前,系统会唤醒或启动您的应用程序并将其置于后台运行状态。 如果用户从系统显示的警报中打开您的应用程序,则系统会再次调用此方法,以便您知道用户select了哪个通知。 我的努力是:我想知道用户是否通过点击通知中心的系统显示警报或者唤醒设备的静默推送通知来调用方法。 目前,据我所知,没有明显的区分办法。 – (BOOL)application: didFinishLaunchingWithOptions: 跟踪上述方法中的launchOptions不是一个解决scheme,因为只有当应用程序被挂起/不在后台运行时才被调用。 如果它在后台运行,它不会被调用。

ApplicationWillTerminate在iOS 4.0中

applicationWillTerminate委托方法没有在iOS 4.0中调用当我点击主页button,我看到applicationWillResignActive和applicationDidEnterBackground委托方法被调用。 – (void)applicationWillResignActive:(UIApplication *)application { NSLog(@"Application Did Resign Active"); } – (void)applicationDidEnterBackground:(UIApplication *)application { NSLog(@"Application Did Enter Background"); } 当我双击主页button,再次启动应用程序,我发现applicationWillEnterForeground和applicationDidBecomeActive委托方法被调用。 – (void)applicationWillEnterForeground:(UIApplication *)application { NSLog(@"Application Will Enter Foreground"); } – (void)applicationDidBecomeActive:(UIApplication *)application { NSLog(@"Application Did Become Active"); } 但是我想知道什么时候会调用applicationWillTerminate委托方法,在哪里做一些DB /文件备份例程。 – (void)applicationWillTerminate:(UIApplication *)application{ } 我甚至试图打减号,并删除在后台运行的应用程序,但它仍然没有调用任何委托方法。 有任何想法吗 ???

didReceiveRemoteNotification:fetchCompletionHandler:从图标与推送通知打开

我试图实现后台推送通知处理,但我有问题,以确定是否用户打开从推送通知,而不是从图标打开它的推送通知的应用程序。 – (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { //************************************************************ // I only want this called if the user opened from swiping the push notification. // Otherwise I just want to update the local model //************************************************************ if(applicationState != UIApplicationStateActive) { MPOOpenViewController *openVc = [[MPOOpenViewController alloc] init]; [self.navigationController pushViewController:openVc animated:NO]; } else { ///Update local model […]

重大更改位置API在终止/暂停时的行为?

这是CLLocationManager文档中用startMonitoringSignificantLocationChanges描述应用行为的部分 : 如果您启动此服务,并且您的应用程序随后终止,则系统会在新事件到达时自动将应用程序重新启动到后台。 在这种情况下,传递给应用程序委托的应用程序:didFinishLaunchingWithOptions:方法的选项字典包含UIApplicationLaunchOptionsLocationKey键,以指示您的应用程序是由于位置事件而启动的。 重新启动后,您仍然必须configuration位置pipe理器对象,并调用此方法继续接收位置事件。 当您重新启动位置服务时,当前事件会立即传送到您的委托。 另外,即使在启动位置服务之前,您的位置pipe理器对象的位置属性也会填入最近的位置对象。 所以我的理解是,如果你的应用程序终止(我假设如果你不从applicationWillTerminate调用stopMonitoringSignificantLocationChanges ),你会被唤醒一个UIApplicationLaunchOptionsLocationKey参数应用程序:didFinishLaunchingWithOptions 。 在这一点上,你创build你的CLLocationManager ,调用startMonitoringSignificantLocationChanges并在有限的时间内做你的后台定位处理。 所以我很好,这一点。 前面的段落只是说明应用程序终止时会发生什么,而不会提示应用程序暂停时的操作。 didFinishLaunchingWithOptions的文档说: 应用程序在后台跟踪位置更新,被清除,现在已经重新启动。 在这种情况下,字典中包含一个键,指示应用程序由于新的位置事件而重新启动。 build议您只有在您的应用程序启动后(由于位置更改)才会收到此通知。 然而, 位置感知编程指南中 重要变更服务的段落如下: 如果您退出此服务并且您的应用程序随后被暂停或终止,则服务会在新的位置数据到达时自动唤醒您的应用程序。 在起床时,您的应用程序将被放入后台,并给予less量时间来处理位置数据。 因为你的应用程序在后台,所以它应该做最less的工作,并避免任何可能阻止它在分配的时间到期之前返回的任务(例如查询networking)。 如果没有,您的申请可能会被终止。 这表明,如果您的应用已被暂停,您将被位置数据唤醒,但未能提及您是如何被唤醒的: UIApplicationDelegate是否得到一个callback告诉我,我正在从挂起状态恢复到后台状态? 位置pipe理器(当应用程序被暂停时被冻结)开始接收locationManager:didUpdateToLocation:fromLocationcallback? 我是否只需要在我的didUpdateToLocation消息中实现代码来检查应用程序状态,并在后台模式下进行最less的处理? 在写这篇文章的过程中,我想我可能只是回答了我自己的问题,但如果我对这个问题有更深入的了解,我的理解会很棒。

检测应用程序是否从推送通知启动/打开

是否有可能知道应用程序是否从推送通知启动/打开? 我猜这个启动事件可以在这里抓到: – (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { if (launchOptions != nil) { // Launched from push notification NSDictionary *notification = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]; } } 但是,当应用程序在后台时,如何才能检测到它是从推送通知中打开的?

iPhone GPS在后台暂停后不会恢复

我的应用程序需要跟踪用户在后台的位置变化,只要用户移动,就可以正常工作。 当用户停止并且CLLocationManager在10-20分钟左右之后暂停时。 这是通知: -(void)locationManagerDidPauseLocationUpdates:(CLLocationManager *)manager{} 这对我也很好。 太好了,我省了一些电池等等 问题是,当用户开始再次移动时, CLLocationManager永远不会被唤醒, 直到我将应用程序放到前台 (获取活动状态) 之前 ,下面的委托方法才会被触发 : //Never called back after CLLocationManager pauses: -(void)locationManagerDidResumeLocationUpdates:(CLLocationManager *)manager{} -(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{} 为什么在设备重新开始移动之后, locationManagerDidResumeLocationUpdates从来不会被调用? GPS不应该自动恢复(自动暂停)? 有没有用户的交互恢复GPS的方法? 应用程序在Info.plist文件中声明如下: 我的CLLocationManager设置是: locationManager = [[CLLocationManager alloc] init]; locationManager.delegate = self; [locationManager setActivityType:CLActivityTypeFitness]; //I WANT pauses to save some battery, etc… That is why following line […]

目标C iPhone开发中的“委托”是什么?

目标C iPhone开发中的“委托”是什么?

有条件地从AppDelegate的故事板中的不同位置开始

我有一个设置了工作login和主视图控制器的故事板,后者是login成功时用户导航到的视图控制器。 我的目标是显示主视图控制器立即如果authentication(存储在keychain)成功,并显示login视图控制器,如果authentication失败。 基本上,我想在我的AppDelegate中做到这一点: // url request & response work fine, assume success is a BOOL here // that indicates whether login was successful or not if (success) { // 'push' main view controller } else { // 'push' login view controller } 我知道方法performSegueWithIdentifier:但是这个方法是UIViewController的一个实例方法,所以不能从AppDelegate中调用。 我如何使用我现有的故事板做到这一点? 编辑: 故事板的初始视图控制器现在是一个没有连接任何东西的导航控制器。 我使用了setRootViewController:区别,因为MainIdentifier是一个UITabBarController。 那么这就是我的线条样子: – (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { BOOL […]

计划NSTimer当应用程序在后台?

当应用程序在后台时,人们如何处理预定的NSTimer? 比方说,我每隔一小时在应用程序中更新一些东西。 updateTimer = [NSTimer scheduledTimerWithTimeInterval:60.0*60.0 target:self selector:@selector(updateStuff) userInfo:nil repeats:YES]; 在后台,这个计时器显然不会触发(?)。 当用户回到应用程序时会发生什么? 计时器是否仍在运行,时间相同? 如果用户在一个小时内回来,会发生什么。 它会触发所有错过的时间,还是等到下一次更新时间? 我想要做的是在应用程序进入前台后立即更新,如果应该发布的date是过去的。 那可能吗?

处理applicationDidBecomeActive – “视图控制器如何响应应用程序变为活动?

我有我的主AppDelegate.m类中的UIApplicationDelegate协议,并定义了applicationDidBecomeActive方法。 我想调用一个方法,当应用程序从后台返回,但方法是在另一个视图控制器。 我怎样才能检查哪个视图控制器当前显示在applicationDidBecomeActive方法,然后调用该控制器内的方法?