有没有办法在后台让我的应用在 CMMotionActivity 更改时得到通知?

Posted

技术标签:

【中文标题】有没有办法在后台让我的应用在 CMMotionActivity 更改时得到通知?【英文标题】:Is there a way, in background, to get my app notified when the CMMotionActivity changes? 【发布时间】:2015-01-03 08:34:19 【问题描述】:

我想知道如果 CMMotionActivity 发生变化,系统是否可以在后台唤醒应用程序,例如,如果用户在坐下后开始走路/跑步,我想能够执行一些代码和计划本地通知。

有没有办法让系统为此在后台唤醒我的应用?

编辑:通过查看reference,这似乎是不可能的(“[...] 并且在您的应用暂停时不会提供更新。”),但也许还有其他方法?

【问题讨论】:

您发现了另一种方法吗? @ChristopherMarkieta 不,也许唯一的方法是让应用程序在后台持续运行,但这需要它做一些非常具体的事情,比如播放音乐、进行 VoIP 或 GPS。 @ChristopherMarkieta (当然,它可能对电池造成不必要的伤害……) 有一种方法总是在后台使用位置,通过询问位置更新,您可以在后台获取动态更新。 【参考方案1】:

我解决了这个问题,创建了一个后台计时器并在选择器调用方法中检查活动类型。只需查看代码,以防它对您有用。我接受对此的建议、更正和建议。

#define k_timer_time 10.0f
@property NSTimer *timer;

- (void) createBackGroundTimerToCheckMotion
// create new uiBackgroundTask
__block UIBackgroundTaskIdentifier bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^
    [[UIApplication sharedApplication]  endBackgroundTask:bgTask];
    bgTask = UIBackgroundTaskInvalid;
];

__weak __typeof(self) weakSelf = self;

// and create new timer with async call:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
    weakSelf.timer = [NSTimer scheduledTimerWithTimeInterval:k_timer_time target:self selector:@selector(onTick:) userInfo:nil repeats:YES];
    weakSelf.timer.tolerance = 5;
    [[NSRunLoop currentRunLoop] addTimer:weakSelf.timer forMode:NSDefaultRunLoopMode];
    [[NSRunLoop currentRunLoop] run];
);

- (void) onTick:(NStimer*)timer
if([CMMotionActivityManager isActivityAvailable])

    __weak __typeof(self) weakSelf = self;

    CMMotionActivityManager *cm = [[CMMotionActivityManager alloc] init];

    CMPedometer *sc = [[CMPedometer alloc] init];

    NSDate *now = [NSDate date];

    NSDate *last30Sec = [now dateByAddingTimeInterval:-30];

    [cm queryActivityStartingFromDate:last30Sec toDate:now toQueue:[NSOperationQueue mainQueue] withHandler:^(NSArray *activities, NSError *error)
     
         [activities enumerateObjectsUsingBlock:^(CMMotionActivity *a, NSUInteger idx, BOOL * _Nonnull stop) 
              //Your stuff here

         ];
     ];

else

    NSLog(@"Error accessing Motion data");

【讨论】:

以上是关于有没有办法在后台让我的应用在 CMMotionActivity 更改时得到通知?的主要内容,如果未能解决你的问题,请参考以下文章

如何让我的应用程序超过 10 分钟。在后台?

来自调试器的消息:由于信号 9 而终止 - 有没有办法运行后台操作?

如果没有 IOS 中的 VOIP,我如何让我的应用程序永远活着?

发生中断时如何让我的音频应用程序在后台保持活动状态?

如何在 Flutter 中创建服务以使应用始终在后台运行?

如何让我的应用在后台运行 NSTimer?