标签: core-motion

在iOS后台进行连续加速度计更新

在提出问题之前,我已经彻底研究了这个主题,但需要确保我得出了正确的结论,如果有的话,我希望尽可能有效地帮助实现这个问题.

这是必不可少的我的应用程序接收加速更新,每5秒左右,并且可以更迅速地在某些情况下,没有这个功能,它不是一个非常有用的应用程序.

那么,如何实现这一目标呢?基本策略是使用该方法:

[cmMotionManager startDeviceMotionUpdatesToQueue:...] 
Run Code Online (Sandbox Code Playgroud)

用一个合适的deviceMotionUpdateInterval,然后以某种方式'确保'你的应用程序永远不会被暂停,即.你必须实现一种背景模式(例如位置,背景音频,VOIP等)

这是应用程序商店中已有的许多应用程序使用的策略,如Sleep Cycle("录音"),Nike +和Pacer(声音播放).

(如果有另一种方法可以连续获取加速度计信息,请纠正我)

我的问题是我的应用程序不会录制声音,不需要VOIP等,并且不需要在iOS 7中使用任何新的后台提取/远程通知API.那么如何确保我保持活跃在背景?

好吧,因为我正在设计一个测量运动的应用程序,它不是一个很长的接收位置信息.我的问题是如何以最有效的方式实现位置更新,因为我确实不需要这些位置更新,同时确保我的应用程序永远不会被暂停?

这就是我现在在我的app委托中所拥有的:

self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.desiredAccuracy = kCLLocationAccuracyKilometer;

- (void)applicationWillResignActive:(UIApplication *)application
{
    [self.locationManager startUpdatingLocation];
}

- (void)applicationWillEnterForeground:(UIApplication *)application
{
    [self.locationManager stopUpdatingLocation];
}
Run Code Online (Sandbox Code Playgroud)

我注意到有时在我按下应用程序上的主页按钮后不久,我的应用程序就会被暂停 - 可能是因为Core Location试图获得一个位置修复程序以交付给应用程序.

我还想知道,一旦你被一个位置更新唤醒,如果新的位置更新没有到达,你在系统再次暂停之​​前有多长时间了?我是否必须尝试接收连续的位置更新(导航样式)以确保我永远不会被暂停?

请帮忙!

谢谢

accelerometer core-location ios core-motion

18
推荐指数
1
解决办法
6053
查看次数

SceneKit - 映射物理360度旋转

我很难将设备运动(传感器融合)映射到SceneKit节点旋转.问题的前提如下,

我有球体,并且相机定位在球体内部,使得球体的几何中心和相机节点的中心重合.我想要实现的是当我围绕一个点物理旋转时,运动也需要准确地映射到相机上.

实施细节如下:

我有一个节点,一个球体作为几何,并且是一个子节点.我正在使用传感器融合来获得姿态四元数,然后将它们转换为欧拉角.代码是:

- (SCNVector3)eulerAnglesFromCMQuaternion:(CMQuaternion) {
    GLKQuaternion gq1 =  GLKQuaternionMakeWithAngleAndAxis(GLKMathDegreesToRadians(90), 1, 0, 0);
    GLKQuaternion gq2 =  GLKQuaternionMake(q.x, q.y, q.z, q.w);
    GLKQuaternion qp  =  GLKQuaternionMultiply(gq1, gq2);
    CMQuaternion rq =   {.x = qp.x, .y = qp.y, .z = qp.z, .w = qp.w};
    CGFloat roll = atan2(-rq.x*rq.z - rq.w*rq.y, .5 - rq.y*rq.y - rq.z*rq.z);
    CGFloat pitch = asin(-2*(rq.y*rq.z + rq.w*rq.x));
    CGFloat yaw = atan2(rq.x*rq.y - rq.w*rq.z, .5 - rq.x*rq.x - rq.z*rq.z);
    return SCNVector3Make(roll, pitch, yaw);
}
Run Code Online (Sandbox Code Playgroud)

转换方程式来自 3D Math Primer for Graphics …

objective-c quaternions euler-angles core-motion scenekit

18
推荐指数
2
解决办法
5922
查看次数

iPhone在后台收集CoreMotion数据.(超过10分钟)

我试图在后台收集coreMotion加速数据超过10分钟.这一定是可能的,因为像Sleep Cycle这样的应用程序会这样做

我只是想确保这是允许的,因为它似乎不是其中之一:

Apps that play audible content to the user while in the background, such as a music player app
Apps that record audio content while in the background.
Apps that keep users informed of their location at all times, such as a navigation app
Apps that support Voice over Internet Protocol (VoIP)
Apps that need to download and process new content regularly
Apps that receive regular updates from external accessories
Apps that implement these services must declare the …
Run Code Online (Sandbox Code Playgroud)

iphone ios core-motion ios7

17
推荐指数
1
解决办法
7672
查看次数

技术世界跟踪性能受资源限制的影响

在启用世界跟踪的情况下运行ARKit会话时,Xcode控制台会显示关于(我假设:减少)跟踪性能的日志消息,即使

  • AR Session处于Normal跟踪状态,

  • 我在光线充足的办公室里使用该设备,有很多"功能"来检测,和

  • 设备只是巧妙地移动.

TLDR:我想了解可能导致它们的原因,它们有什么影响,以及如何防止它们,或者在它们发生时(重新)对它们采取行动 - 注意.不是简单地隐藏错误.

[Technique] World tracking performance is being affected by resource constraints [0]
[Technique] World tracking performance is being affected by resource constraints [1]
Run Code Online (Sandbox Code Playgroud)

控制台应用程序显示这些来自库ARKit并属于日志记录类别技术.虽然它们听起来像是警告,但Console应用程序会将其类型显示为错误.

正如预期的那样,在使用世界跟踪时,控制台应用程序确实会CoreMotion在错误发生时显示大量日志,但这些行似乎不包含任何错误,警告或其他有助于我诊断正在发生的事情的信息.

当错误出现在日志中时,没有委托回调,但最终(5秒或50秒之间的任何事情)屏幕将冻结,回调会话失败:

Error Domain=com.apple.arkit.error Code=200 "World tracking failed." UserInfo={NSLocalizedDescription=World tracking failed., NSLocalizedFailureReason=World tracking cannot determine the device's position.}
Run Code Online (Sandbox Code Playgroud)

ARKit源代码/ 文档没有提供关于"资源限制"可能导致无法确定设备位置的任何提示,它只是读取:

世界跟踪遇到致命错误.

我已经尝试(没有成功)阻止警告出现:

  • 重置会话跟踪:仍然是错误,

  • 通过删除所有ARAnchors:仍然错误重置会话,

  • 禁用平面检测(一旦不再需要):仍然是错误,

暂停AR会话会使警告静音(有意义,因为这意味着设备会在暂停时停止跟踪其移动),但在恢复会话时,警告会返回.

当关闭会话并重新创建它(即关闭VC并重新创建)时,虽然没有移动相机(或更改了照明),但问题并不总是重新出现.

我最好的猜测是,在Apple 解释世界跟踪如何工作的 …

ios core-motion ios11 xcode9-beta arkit

17
推荐指数
2
解决办法
6589
查看次数

如何最好地给落球真实世界的引力

我是一个相当新的应用程序开发人员,也是Sprite Kit的新手.我正在创造一个游戏,我想要一个球总是向下坠落,好像它是在重力.这只是一个2D应用程序,所以我想要的是当球落下时,当你向左倾斜手机时,球向下移动并离开屏幕,如果你向右倾斜手机,球会向下移动并向右移动.为了更好地了解我想要的东西,我在photoshop中制作了一个快速图表:

球落图

我想就一些最简单,最好的方法做一些意见.我的第一个想法是记录偏航并用它来决定球向左或向右移动的距离.这需要一些计算才能使球完全落在90度,虽然听起来对我来说,但我不确定它是否真的可能.

有人认为这是做到这一点的方式还是有更好的方法呢?

我尝试第一个想法时遇到的一个问题是当我倾斜手机时,球左右移动(没有任何正确的计算,所以这是完全不准确的),我会将手机向左倾斜(例如)我进一步倾斜它,它变得越不敏感,所以球将向左移动更少.这会阻止我的想法工作,我不确定是否有办法绕过它.

我遇到的一个更大的问题是当我在座位上转身时,偏航也会发生变化!我认为这与指南针有关,因为滚动或音高都没有像我这样改变.我确信可以做些什么来纠正这个问题,因为我玩游戏时使用陀螺仪从来没有这个问题.如果有人能指出我正确的方向,我会很感激,或者我可能只是在一个单独的新问题中提出这个问题.下面是我在photoshop中快速绘制的另一个图表,以帮助解释问题.图1是我希望能够倾斜手机的方式,但当你转身时(图2),球会向左或向右移动,具体取决于你转动的距离.(是的,这是指在图2中持有电话的人)

手机倾斜图

非常感谢帮助!

objective-c game-physics ios core-motion sprite-kit

16
推荐指数
1
解决办法
3072
查看次数

CoreMotion的主线程检查器警告仅出现在2018年型号的iPhone上

以下是该问题的极为简化的版本:

import UIKit
import CoreMotion

class ViewController: UIViewController {
    private let manager = CMMotionManager()
    private let interval = 0.01

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        startUpdates()
    }

    private func startUpdates() {
        let queue = OperationQueue()
        queue.name = "com.demo.motion"
        queue.qualityOfService = .userInteractive
        queue.maxConcurrentOperationCount = 1
        manager.accelerometerUpdateInterval = interval
        manager.startAccelerometerUpdates(to: queue) { _, _ in }
    }
}
Run Code Online (Sandbox Code Playgroud)

当我在iPhone XR上运行此程序时,我将收到以下消息:

主线程检查器:在后台线程上调用的UI API:-[UIApplication applicationState] PID:1237,TID:147763,线程名称:com.apple.CoreMotion.MotionThread,队列名称:com.apple.root.default-qos.overcommit ,QoS:0

  • 我的设备正在运行12.3,这是当前最新的iOS版本
  • 在各种iPad(2018年之前),iPhone 8,iPhone 6S和其他较旧型号上运行此程序时,不会出现此问题。
  • 更改qualityOfService对此没有影响(我的首选是使用utility
  • 出于好奇,我将整个startUpdates()功能包装在主调度程序周围,但没有成功

根据队列名称和发生的时间,我认为这是内部的东西,与较旧的设备相比,XR中速度更快的处理器才暴露出来。

iphone xcode ios core-motion

16
推荐指数
1
解决办法
2932
查看次数

iOS - 在设置>隐私>动作活动中启用动作活动

如果应用需要访问Motion Activity数据,则会在安装时询问用户.但是,如果用户意外回答"否",则该应用程序将无法运行.

我正在寻找一种方法来检查运动活动是否已启用,以便我可以提示用户启用,如果没有.

有人可以指出我正确的方向代码吗?


根据Doc(谢谢)提供的信息,似乎Apple没有提供直接的方法来检查Motion Activity隐私状态.通过了解错误,我能够找到答案: -

[stepCounter queryStepCountStartingFrom:[NSDate date]
                                     to:[NSDate date]
                                toQueue:[NSOperationQueue mainQueue]
                            withHandler:^(NSInteger numberOfSteps, NSError *error) {
                                if (error != nil && error.code == CMErrorMotionActivityNotAuthorized) {
                                    // The app isn't authorized to use motion activity support.
}
Run Code Online (Sandbox Code Playgroud)

ios core-motion

15
推荐指数
2
解决办法
1万
查看次数

CoreMotion崩溃(仅限iPad)调用stopDeviceMotionUpdates

我们的应用程序中有一个CMMotionManager实例,我们用它来获取频率为5Hz的传感器更新.以下是我们用于启动动画更新的代码:

[self.motionManager
startDeviceMotionUpdatesUsingReferenceFrame:
CMAttitudeReferenceFrameXMagneticNorthZVertical
toQueue:operationQueue
withHandler:^(CMDeviceMotion *motion, NSError *error) {
if (!error) { 
   [self doSomethingWithMotion:motion];
} else { ... }
Run Code Online (Sandbox Code Playgroud)

始终在主线程上调用上述方法.

现在,一旦完成了我们的任务,我们再次在主线程上调用以下方法来停止动作更新:

- (void)stopMotionUpdates {
    // This might get called on concurrent threads.
    // So better using sync block + make it idempotent
    @synchronized(self) {
        if (_motionManager.deviceMotionActive) {
            [_motionManager stopDeviceMotionUpdates];
            _prevPoint = nil;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我们面临的问题是stopMotionUpdates崩溃,这也只是在iPad中崩溃.我们已经在具有不同操作系统版本的iPhone和iPad上进行了广泛的测试,我们只能在iOS7和iOS8的iPad(迷你1,2和视网膜/非视网膜)上进行崩溃.此外,我们无法在我们用于测试的所有iPad上重现崩溃,但只有少数.以下是main和崩溃线程的崩溃日志:

Thread : com.apple.main-thread
0  libsystem_kernel.dylib         0x00000001935f1cdc semaphore_wait_trap + 8
1  libdispatch.dylib              0x00000001934fbb3c _dispatch_semaphore_wait_slow + 252
2  CoreMotion                     0x0000000186bf67d4 (null)
3  CoreMotion                     0x0000000186be3698 (null) …
Run Code Online (Sandbox Code Playgroud)

multithreading objective-c ipad ios core-motion

15
推荐指数
1
解决办法
921
查看次数

我的应用程序可以要求iPhone 5S吗?

我正在编写一款需要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.

iphone ios core-motion apple-m7

14
推荐指数
1
解决办法
3136
查看次数

设备运动更新的实际频率低于预期,但随设置增加

我正在移植我最初使用IOS 3加速度计编写的应用程序,以整合新的IOS 4运动功能.

在捕获动作时,应用程序几乎没有其他功能 - 例如,没有图形更新.

我正在做以下操作来设置动作更新,以替代我之前使用的加速度计.我确实意识到我可以使用NSTimer或其他东西来重建我自己的民意调查,并且可能会继续这样做.

[motionManager setDeviceMotionUpdateInterval:updateInterval];
CMDeviceMotionHandler motionHandler = ^(CMDeviceMotion *motion, NSError *error) {
[self processMotion:motion withError:error];
};

[motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue currentQueue] withHandler:motionHandler];

这样可行,但更新间隔的行为不符合预期.我已经删除了processMotion方法中的所有执行代码,除了保存时间戳以查看真实的动作更新速率.我已经测试了这个足以证明它是可重复的,甚至是1/40的奇怪结果.下表显示了我所看到的内容:

updateInterval  actual events per second
1.0/20.0        13
1.0/30.0        27
1.0/40.0        27
1.0/50.0        34
1.0/60.0        40
1.0/70.0        57
1.0/90.0        60
1.0/100.0      74

一些注意事项:
1.我确定更新间隔设置正确,并在设置确认后进行了检查.

2.我确信我正在跟踪每次调用processMotion,没有任何使用nil CMDeviceMotion或其他奇怪的调用

3.我没有做任何阻止事情的重要处理,只是等待运动事件并录制它们.作为加速度计

4的代表,这一切都非常好. 运动数据很好,很少更新:)

5.这是在ipod touch第4代

6 上使用ios 4.2 .我尽力搜索,避风港没有看到解释,虽然我已经看到一些人在申请60hz时看到50hz更新频率的报告,这可能是相关的.

我将尝试的下一件事是为处理而不是使用当前队列设置专用队列,但我确实想看看这是否是已知行为.我可以理解更新速率是否会以某种方式出现瓶颈,但不确定为什么它仍然可以扩展,如果是这样的话.

同样,我想我可以重建使用NSTimer并进行自己的轮询,但我想了解为什么我会看到这个,以防我从根本上误解Core Motion框架.

iphone cocoa-touch intervals core-motion

12
推荐指数
1
解决办法
3805
查看次数