用户从任务切换器

时间:2015-08-11 13:55:21

标签: ios iphone notifications ios-lifecycle

我希望在我的应用终止时向用户显示(本地)通知,无论是iOS本身还是用户通过任务切换器。

当iOS因内存压力而杀死应用程序时,applicationWillTerminate上会调用AppDelegate函数,因此我可以在这种情况下安排本地通知。

但是,当用户通过在应用程序切换器中将其滑动到顶部来杀死应用程序时,不会调用applicationWillTerminate功能(如Apple文档中所述,以及SO上的各种答案)。 然而,在这种情况下,有些应用程序仍能成功向用户显示(本地)通知(特别是健身追踪应用程序,例如Human),要求用户重新启动应用程序跟踪可以继续。

我可以想到一些(大多数是尴尬的,或者至少是消耗电池的)方法来完成这项工作,但是否有一种向用户显示此类通知的好方法?特别是在应用程序被用户杀死后几乎立即这样做,这排除了很多可能的解决方法,在后台每隔n秒安排和取消本地通知......

2 个答案:

答案 0 :(得分:1)

发现它......显然,显示通知的应用程序就像我要显示的那样通过使用后台位置更新(重新)安排本地通知来实现它,因此它永远不会显示,并且一旦它们被杀死用户通知保持活动并触发。

听起来不太好,但除了定期从服务器ping应用程序之外,它可能是唯一的方法。

有一种更体面(和节能)的方式来做这件事会很好,例如通过在应用程序终止之前始终有时间做某事,无论终止的原因。

答案 1 :(得分:0)

我试过这样:

  • 必须启用后台模式(蓝牙,voip,位置服务)
  • didFinishLaunchingWithOptions中添加此代码:

    [self addLocalNotification];
    [NSTimer scheduledTimerWithTimeInterval:9.0f
                                         target:self
                                   selector:@selector(addLocalNotification)
                                       userInfo:nil
                                        repeats:YES];
    
  • addLocalNotification

    - (void) addLocalNotification{
    NSDate * theDate = [[NSDate date] dateByAddingTimeInterval:10]; // set a localnotificaiton for 10 seconds
    
    UIApplication* app = [UIApplication sharedApplication];
    NSArray*    oldNotifications = [app scheduledLocalNotifications];
    
    
    // Clear out the old notification before scheduling a new one.
    if ([oldNotifications count] > 0)
        [app cancelAllLocalNotifications];
    
    // Create a new notification.
    UILocalNotification* alarm = [[UILocalNotification alloc] init];
    if (alarm)
    {
        alarm.fireDate = theDate;
        alarm.timeZone = [NSTimeZone defaultTimeZone];
        alarm.repeatInterval = 0;
        alarm.alertBody =@"App must run" ;
    
        [app scheduleLocalNotification:alarm];
    }}
    

它对我有用。只要app run / background,addLocalNotification就会运行。一旦终止已经安排,本地通知将按时触发。我们可以根据自己的兴趣改变时间间隔。