watchOS 2:后台触觉反馈

15

我认为我已经知道了这个问题的答案,但我想问一下以便全面。

考虑苹果手表内置的地图应用程序。当您使用逐步转向指示时,当需要左转或右转时,即使屏幕关闭且应用程序处于后台,手表也会播放自定义触觉模式。另一个例子是在进行锻炼时 - 如果您设置了目标,即使此时未查看手表(屏幕关闭,应用程序在后台),当达到50%和100%时,您的手腕会轻轻震动。

在watchOS 2中,我们第三方开发者是否有办法让应用程序在屏幕关闭和应用程序在后台时播放特定的触觉模式?我知道playHaptic:方法可以在应用程序活动时让您播放几种不同的触觉模式,而且我知道在应用程序处于非活动状态时,您可以收到通知 - 但通知只能播放“通知”触觉感觉,无法选择。


苹果公司已经解决了这个问题吗?我的应用@ChronicTimer将会从中受益匪浅。我有一个训练课程,但仍然无法提供此功能。 - Ace Green
不会的,我怀疑在明年可能的WWDC 2016之前不会有任何改变。通常情况下,只有当最新的主要操作系统版本仍处于测试版(通常在6月至9月之间)时,苹果才会提供新的API。 - UberJason
3个回答

2

只有在应用程序处于活动状态时才能运行自定义代码。所以我很抱歉,您无法这样做。


我也是这么想的,谢谢。不过那个 HealthKit 真的很有趣,我之前并不知道……我们正在考虑开发一个内部公司应用(不在 App Store 上),所以我们可以假装是一个健身应用程序,并且丢弃心率数据。你知道心率数据更新的频率吗?还有其他框架可以定期回调并运行代码吗? - UberJason
1
您将每3-5秒获得一次心率样本。目前我所知道的没有其他框架。 - Philip
你是否在查看 HKWorkoutSessionDelegate workoutSession:didChangeToState:fromState:? 文档中提到:“如果您的应用程序被挂起,委托将在应用程序恢复后接收此调用。这意味着您可能会在状态更改后很长时间收到通知。检查日期参数以确定状态更改实际发生的时间。” https://developer.apple.com/library/prerelease/watchos/documentation/HealthKit/Reference/HKWorkoutSessionDelegate_ProtocolReference/index.html#//apple_ref/occ/intfm/HKWorkoutSessionDelegate/workoutSession:didChangeToState:fromState:date: - UberJason
4
当手表屏幕关闭时,HealthKit查询流会延迟传递结果。当应用程序重新唤醒时,您将同时获得所有结果,因此即使对于运动应用程序,这种方法也不起作用。苹果可能之所以这样设计是因为播放触觉会暂时停止心率传感器收集数据。https://developer.apple.com/library/prerelease/watchos/documentation/WatchKit/Reference/WKInterfaceDevice_class/index.html#//apple_ref/occ/instm/WKInterfaceDevice/playHaptic: - lehn0058
我处于类似的情况,希望当配对的iPhone触发事件时,Apple Watch应用程序能够唤醒。我的应用程序停用得太快了,我无法将来自iPhone的新数据推送到手表上。听起来目前除了在苹果应用程序或声称执行其他操作(如健康或地图应用)的应用程序中,这似乎是不可能的。 :-( - jamey

1

仅仅是对于自己的问题进行更新,几年后 - 在watchOS 3中,训练应用程序被授予后台执行权限,但没有触觉(我想)。

在watchOS 4中,训练应用程序、音频记录应用程序和导航应用程序都可以在后台执行;导航应用程序可以在后台发送触觉。此外,“最前面的应用程序”(如果手腕在2分钟内被举起,则仍然会出现的上次使用的应用程序,如果启用了扩展的前置时间,则为8分钟)在WatchConnectivity或NSURLSession数据传输结束时发送触觉,或者当通知到达时也会有一些特权。详见文档。


1
这是我在后台播放触觉反馈的方法,首先需要在WatchExtension的功能设置中启用后台模式,并启用:Workout Processing和Audio、Airplay。同时,还需要为WatchExtension启用HealthKit。
#import < HealthKit/HealthKit.h > 添加HKWorkoutSessionDelegate。
-(void)awakeWithContext:(id)context{

[super awakeWithContext:context];
HKHealthStore *cwHealthStore = [[HKHealthStore alloc] init];
cwConfiguration = [[HKWorkoutConfiguration alloc] init];
cwConfiguration.activityType = HKWorkoutActivityTypeOther;
NSError *error;
HKWorkoutSession *cwSession = [[HKWorkoutSession alloc] initWithConfiguration:cwConfiguration error:&error];
[cwSession setDelegate:self];
if (!error) {
    [cwHealthStore startWorkoutSession:cwSession];
}
    [self test];
 }


#pragma mark WorkoutSession Delegates

- (void)workoutSession:(HKWorkoutSession *)workoutSession
  didChangeToState:(HKWorkoutSessionState)toState
         fromState:(HKWorkoutSessionState)fromState
              date:(NSDate *)date{
NSLog(@"------>%ld", (long)toState);
}

 - (void)workoutSession:(HKWorkoutSession *)workoutSession didFailWithError:(NSError *)error{
NSLog(@"%@", error);
}

现在您可以在后台播放触觉反馈。
  -(void)test{
    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerTrick:) userInfo:nil repeats:true];


 }

- (void)timerTrick:(NSTimer *)time {

        [[WKInterfaceDevice currentDevice] playHaptic:WKHapticTypeStart];

}

离开控制器后不要忘记停止训练会话:

     [cwHealthStore endWorkoutSession:cwSession];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接