当应用程序从后台唤醒并且您希望它准备好处于活动状态时,哪个是正确的代理?
applicationWillEnterForeground vs applicationDidBecomeActive - 有什么区别?
当应用程序进入休眠状态并且您想要准备它以清理和保存数据时,哪个是适当的委托?
applicationWillResignActive与applicationDidEnterBackground - 有什么区别?
此外,我注意到当传入的SMS或呼叫进入时,应用程序会调用applicationWillResignActive,但用户选择单击"确定"并继续.我不希望我的应用程序在这些情况下采取任何行动.我只是希望它继续运行而不进行任何中间清理,因为用户没有退出应用程序.所以,我认为在applicationDidEnterBackground中进行清理工作更有意义.
我将非常感谢您对最佳实践的意见,以便选择哪些代表实现唤醒和睡眠以及考虑被SMS /呼叫中断等事件.
谢谢
我想检查应用程序是否在后台运行.
在:
locationManagerDidUpdateLocation {
if(app is runing in background){
do this
}
}
Run Code Online (Sandbox Code Playgroud) objective-c uiapplicationdelegate application-lifecycle ios ios-background-mode
我UIApplicationDelegate在我的主AppDelegate.m类中有协议,applicationDidBecomeActive定义了方法.
我想在应用程序从后台返回时调用方法,但该方法在另一个视图控制器中.如何检查applicationDidBecomeActive方法中当前显示的视图控制器,然后调用该控制器中的方法?
是否可以知道应用程序是否通过推送通知启动/打开?
我猜这个发布活动可以在这里找到:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
if (launchOptions != nil) {
// Launched from push notification
NSDictionary *notification = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当应用程序处于后台时,如何检测到它是从推送通知中打开的?
push-notification apple-push-notifications uiapplicationdelegate ios ios6
这是CLLocationManager文档中描述使用startMonitoringSignificantLocationChanges的应用程序行为的部分:
如果您启动此服务并且您的应用程序随后终止,则系统会在新事件到达时自动将应用程序重新启动到后台.在这种情况下,传递给应用程序的选项字典:didFinishLaunchingWithOptions:应用程序委托的方法包含密钥UIApplicationLaunchOptionsLocationKey,以指示您的应用程序是由于位置事件而启动的.重新启动后,您仍必须配置位置管理器对象并调用此方法以继续接收位置事件.重新启动位置服务时,会立即将当前事件传递给您的代理.此外,即使在启动位置服务之前,也会使用最新的位置对象填充位置管理器对象的位置属性.
所以我的理解是,如果你的应用程序终止(并假设你没有从applicationWillTerminate调用stopMonitoringSignificantLocationChanges),你将会被应用程序唤醒UIApplicationLaunchOptionsLocationKey参数:didFinishLaunchingWithOptions.此时,您将创建CLLocationManager,调用startMonitoringSignificantLocationChanges并在有限时间内执行后台位置处理.这一点我很好.
前一段只谈到应用程序终止时会发生什么,它不会建议您在应用程序暂停时执行的操作.didFinishLaunchingWithOptions的文档说:
该应用程序在后台跟踪位置更新,已被清除,现在已重新启动.在这种情况下,字典包含一个键,表示由于新的位置事件导致应用程序重新启动.
建议您在终止后启动应用程序(因为位置更改)时才会收到此呼叫.
但是," 位置感知规划指南"中关于重大变更服务的段落如下:
如果您使此服务保持运行并且您的应用程序随后被暂停或终止,则服务会在新位置数据到达时自动唤醒您的应用程序.在唤醒时,您的应用程序将被置于后台并给予少量时间来处理位置数据.由于您的应用程序位于后台,因此应该执行最少的工作并避免任何可能阻止其在分配的时间到期之前返回的任务(例如查询网络).如果没有,您的申请可能会被终止.
这表明如果您的应用已被暂停,您会被位置数据唤醒,但未提及您是如何被唤醒的:
在写这篇文章的过程中,我想我可能刚刚回答了我自己的问题,但是如果有更多知识渊博的人对我的理解得到证实,那就太棒了.
我有一个设置有工作登录和主视图控制器的故事板,后者是用户在登录成功时导航到的视图控制器.我的目标是在验证(存储在钥匙串中)成功时立即显示主视图控制器,如果验证失败则显示登录视图控制器.基本上,我想在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
}
Run Code Online (Sandbox Code Playgroud)
我知道方法performSegueWithIdentifier:但是这个方法是UIViewController的实例方法,所以不能从AppDelegate中调用.如何使用我现有的故事板来做到这一点?
编辑:
故事板的初始视图控制器现在是一个没有连接任何东西的导航控制器.我使用setRootViewController:区别因为MainIdentifier是一个UITabBarController.那么这就是我的线条:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
BOOL isLoggedIn = ...; // got from server response
NSString *segueId = isLoggedIn ? @"MainIdentifier" : @"LoginIdentifier";
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Storyboard" bundle:nil];
UIViewController *initViewController = [storyboard instantiateViewControllerWithIdentifier:segueId];
if (isLoggedIn) { …Run Code Online (Sandbox Code Playgroud) Objective C的iPhone开发中的"委托"是什么?
当应用程序在后台时,人们如何处理预定的NSTimer?
假设我每小时在我的应用中更新一些内容.
updateTimer = [NSTimer scheduledTimerWithTimeInterval:60.0*60.0
target:self
selector:@selector(updateStuff)
userInfo:nil
repeats:YES];
Run Code Online (Sandbox Code Playgroud)
在后台时,此计时器显然不会触发(?).当用户回到应用程序时应该怎么办?计时器是否仍然在运行,同一时间?
如果用户在一小时内回来,会发生什么.它会在错过的所有时间触发,还是等到下一次更新时间?
我想要它做的是在应用程序进入前台后立即更新,如果它应该触发的日期是过去的.那可能吗?
我正在尝试实现后台推送通知处理,但是我在确定用户是否从发送的推送通知中打开应用程序时遇到了问题,而不是从图标打开它.
- (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
}
completionHandler(UIBackgroundFetchResultNewData);
}
Run Code Online (Sandbox Code Playgroud)
使用此代码,无论用户如何打开应用程序,应用程序都会打开MPOOpenViewController.我怎样才能使视图控制器只有在他们通过刷通知打开应用程序时才会被推送?
使用相同的代码,这适用于iOS 6,但使用新的iOS 7方法,它的行为并不像我想要的那样.
编辑:我正在尝试在iOS 7上运行应用程序,我们不支持iOS 7之前的任何版本.我在方法的iOS 6版本中使用了相同的确切代码(没有完成处理程序)并且它表现得很好我希望它的方式.你要刷通知,这将被调用.如果从图标打开,则永远不会调用该方法.
push-notification apple-push-notifications uiapplicationdelegate ios ios7
application: didReceiveRemoteNotification: fetchCompletionHandler:
Run Code Online (Sandbox Code Playgroud)
不同于
application: didReceiveRemoteNotification:
Run Code Online (Sandbox Code Playgroud)
怎么样?来自文档:
与应用程序:didReceiveRemoteNotification:方法不同,只有在应用程序运行时才会调用该方法,系统会调用此方法,而不管应用程序的状态如何.如果您的应用暂停或未运行,系统会在调用该方法之前唤醒或启动您的应用并将其置于后台运行状态.如果用户从系统显示的警报中打开您的应用程序,系统将再次调用此方法,以便您知道用户选择了哪个通知.
我的斗争是:我想知道用户是否通过从通知中心点击系统显示的警报或从唤醒设备的静默推送通知来调用该方法.目前,据我所知,没有明显的区分方法.
- (BOOL)application: didFinishLaunchingWithOptions:
Run Code Online (Sandbox Code Playgroud)
跟踪上述方法中的launchOptions不是一个解决方案,因为只有在应用程序暂停/未在后台运行时才会调用它.如果它在后台运行则不会被调用.
cocoa-touch apple-push-notifications uiapplicationdelegate ios
ios ×9
iphone ×4
objective-c ×4
cocoa-touch ×1
delegates ×1
ios4 ×1
ios6 ×1
ios7 ×1
multitasking ×1
nstimer ×1
segue ×1
storyboard ×1