使用最新iOS设备中的M7芯片,当用户使用CMMotionActivityManager从静止到跑步,步行等时,可以通过编程方式获得通知.当Stava和Runkeeper 检测到用户没有通过M7移动时,它们都使用它来自动暂停GPS轮询(关闭GPS天线),然后在再次移动时重新启用GPS更新.当应用程序处于后台状态时,它可以执行此操作,这是此处的关键.
我在复制此功能时遇到的问题是,如果我在我的应用程序处于后台时关闭GPS更新,我将停止接收活动更新,并且无法再检测用户何时通过M7再次移动以重新打开GPS.
如果我让GPS一直运行,我会在整个应用程序处于后台时继续从Core Motion获取移动更新.
我假设他们没有玩白噪声或其他一些廉价的技巧来保持活跃.他们是怎么做到的?
注意:此问题最初是在Apple在iOS SDK中引入运动检测硬件和相关API之前发布的.然而,这个问题的答案仍然有用.
我正在创建一个iPhone iOS应用程序,它涉及跟踪用户的跑步和/或步行.用户跑步和走路的记录结果保持诚实非常重要.我需要一种方法来捕捉可能在使用汽车时作弊(或意外地离开跟踪器)的用户.
要检查如果用户驾驶或乘坐一辆车我首先想到这两项检查,但也不能真正确定该用户是在汽车或没有(一个点).
使用以下方法检查用户的当前速度.如果用户的行进速度超过20-ahh MPH,那么我可以假设用户在车内:
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
CLLocation *recentLocation = [locations lastObject];
recentLocation.speed; //If speed is over 20 MPH, assume the user is not on their feet.
Run Code Online (Sandbox Code Playgroud)
但是,我不确定这是否真的是一个很好的检查,因为人们的记录比以前更快.这是一个很好的检查还是我应该使用其他东西?
使用Core Motion Framework提供的Accelerometer和Motion API确定用户加速的速度.如果用户加速超过一定的速率,那么我可以假设用户正在车辆中行驶.
这些假设是否正确?我想我真正的问题是:有没有更好的方法来检测用户是否在车内移动 - 如果是这样的话?.如果没有,那么这些检查是否适用于这种情况,或者这对那些实际上那么快的用户来说是否会烦恼?CoreMotion是适当的API吗?
编辑:新的iPhone 5S M7协处理器提供更准确的运动检测.任何人都可以解释如何使用新的M7 API吗?
我正在尝试检测三种动作:当用户开始步行,慢跑或跑步时.然后我想知道何时停止.我成功地检测到有人在走路,慢跑或跑步时使用以下代码:
- (void)update:(CMAccelerometerData *)accelData {
[(id) self setAcceleration:accelData.acceleration];
NSTimeInterval secondsSinceLastUpdate = -([self.lastUpdateTime timeIntervalSinceNow]);
if (labs(_acceleration.x) >= 0.10000) {
NSLog(@"walking: %f",_acceleration.x);
}
else if (labs(_acceleration.x) > 2.0) {
NSLog(@"jogging: %f",_acceleration.x);
}
else if (labs(_acceleration.x) > 4.0) {
NSLog(@"sprinting: %f",_acceleration.x);
}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是双重的:
1)每次有动作时都会多次调用更新,这可能是因为它经常检查当用户开始行走时(即_acceleration.x> = .1000)它再次调用更新时仍然> = .1000.
示例日志:
2014-02-22 12:14:20.728 myApp[5039:60b] walking: 1.029846
2014-02-22 12:14:20.748 myApp[5039:60b] walking: 1.071777
2014-02-22 12:14:20.768 myApp[5039:60b] walking: 1.067749
Run Code Online (Sandbox Code Playgroud)
2)我很难弄清楚如何检测用户何时停止.有没有人就如何实施"停止检测"提出建议
我正在编写一款需要iPhone 5S中的M7 Motion协处理器芯片的应用程序.由于该芯片不在任何其他iPhone中,该应用程序只能在iPhone 5S上正常运行.
Is there any way to require that a user has an iPhone 5S before downloading my app? Sort of like how you can make an app iPad specific?
I am looking for a way to select the iPhone hardware requirement. Not the iOS version requirement.
我一直在研究新的M7芯片CMMotionActivityManager
,用于确定设备的用户是在走路,跑步,在汽车等等(参见Apple文档).这似乎是尝试LocationManager
仅使用和加速计数据来确定此前一步的一大进步.
然而,我注意到CMMotionActivityManager
没有自行车活动,这是令人失望的,并且几乎是一个完全用作新活动经理的交易破坏者.有没有其他人找到一个方便的方式CMMotionActivityManager
与骑自行车一起使用,而不必重新加入CMLocationManager
+加速度计只是为了尝试测试骑自行车?
请注意,这也不包括像火车这样的东西的一般运输选项.例如,我每天在火车上上班一小时.汽车可以至少更加通用,类似于Move使用Transport的方式.
CMMotionActivity
仅具有以下定义的运动类型:
来自Apple代码的有用说明,不一定能解决问题,但有用:
CMMotionActivity
基于设备的运动估计用户的活动.
活动作为一组属性公开,属性不是互斥的.
例如,如果您在停车标志处停车时状态可能如下:固定=是,行走=否,运行=否,汽车=是
或移动车辆,静止=否,行走=否,运行=否,汽车=是
或者设备可以运动但不能行走或在车辆中.静止=否,行走=否,运行=否,汽车=否.请注意,在这种情况下,所有属性都是NO.
[直接来源:Apple iOS Framework,CoreMotion/CMMotionActivity.h @interface CMMotionActivity,内联代码注释]
试图找到一种检测M7存在的方法.
如果M7不存在,查询CMStepCounter或CMMotionActivity类是否毫无意义?我的猜测是,在拥有iOS 7.0的非M7型号上,这些类可以获得数据,但效率并不高,而且使用的电池更多.
粗暴的方式是:
struct utsname systemInfo;
uname(&systemInfo);
model = [[NSString alloc] initWithCString:systemInfo.machine
encoding:NSUTF8StringEncoding];
version = [[NSString alloc] initWithString:[[UIDevice currentDevice] systemVersion]];
if ([model compare:@"iPhone6,1"]) {
}
Run Code Online (Sandbox Code Playgroud) 有没有人用模拟器成功测试过任何新的CoreMotion API?似乎需要M7的那些不起作用.我试过在运行iOS 7的新模拟器上调用这些函数
(BOOL)isActivityAvailable
Run Code Online (Sandbox Code Playgroud)
和
(BOOL)isStepCountingAvailable
Run Code Online (Sandbox Code Playgroud)
但是两个函数调用都返回false.
我想知道是否有人可以向我展示如何实施CMStepCounter的示例.(我查看了文档,但仍然对如何实现有点困惑).
我想在每次采取步骤时更新我的视图上的UILabel.我也希望让应用程序在关闭时继续计算步数.
我对iOS比较新,任何帮助都会非常感激:)!
谢谢,瑞恩
我想知道是否有人能指出我在iPhone5S及以上版本中使用M7芯片的正确方向.
我想知道它是否只是在您使用通用核心运动API时自动使用,或者是否有一组特定的API可供使用?
最后我注意到在线阅读一些文章,它保留了一些历史运动数据,任何人都知道如何访问这个或任何人都可以指出我正确的方向?