【IOS开发】传感器 SensorKit

资源

官方文档 https://developer.apple.com/search/?q=motion graph\&type=Documentation

SensorKit 使应用程序能够访问选定的原始数据或系统从传感器处理的指标。

  • 步骤信息
  • 加速度计或旋转速率数据
  • 用户手腕上手表的配置
  • 物理环境中的环境光
  • 有关用户日常通勤或旅行的详细信息

环境信息

环境光

ambientLightSensor

The sample type for this sensor is SRAmbientLightSample.

您需要通过将 字典添加到信息属性列表中的 键来提供记录环境光的原因。SRSensorUsageAmbientLightSensorNSSensorKitUsageDetail

SRSensorUsageAmbientLightSensor

一组属性,解释您的应用程序需要观察用户环境中的光照水平。

c 复制代码
property list key Description
解释性字符串,详细说明您的研究使用传感器数据的方式。
必需的
property list key Required
一个布尔值,指示您的应用程序的研究是否依赖于该传感器。

SRAmbientLightSample:

https://developer.apple.com/documentation/sensorkit/srambientlightsample

c 复制代码
测量光强度
var chromaticity: SRAmbientLightSample.Chromaticity
描述样本的光亮度和色调的坐标对。
struct SRAmbientLightSample.Chromaticity
描述光亮度和色调的坐标对。
var lux: Measurement<UnitIlluminance>
描述样本光通量的对象。
var placement: SRAmbientLightSample.SensorPlacement
光相对于传感器的位置。
enum SRAmbientLightSample.SensorPlacement
描述光源相对于传感器的位置的方向值。

加速度计

iOS 设备都有一个三轴加速度计。加速度计报告的值以重力加速度的增量进行测量,值 表示给定方向上每秒 9.8 米(每秒)的加速度。加速度值可以是正值或负值,具体取决于加速度的方向。

使用 Core Motion 框架的类访问原始加速度计数据。具体来说, 类提供了用于启用加速计硬件的接口。启用硬件时,选择最适合您的应用程序的接口。您可以仅在需要时提取加速度计数据,也可以要求框架定期将更新推送到您的应用程序。每种技术都涉及不同的配置步骤并具有不同的用例。CMMotionManager

重要的提示:

如果您的应用依赖于加速度计硬件,请使用 文件的 键>

价值。有关此键含义的详细信息,请参阅信息属性列表键参考。UIRequiredDeviceCapabilitiesInfo.plistaccelerometer

具体信息: https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/

检查加速度计数据的可用性

Check the value of the is AccelerometerAvailable property of CMMotionManager and make sure it's true. If it's false, starting updates doesn't deliver any data to your app.

不连续获取加速度数据

对于按自己的时间表处理加速度计数据的应用(例如游戏),请使用 的 方法开始传送加速度计数据。当您调用此方法时,系统会启用加速计硬件并开始更新 对象的 属性。但是,系统在更新该属性时不会通知您。当您需要加速度计数据时,必须显式检查该属性的值。 startAccelerometerUpdates()CMMotionManageraccelerometerDataCMMotionManager

开始交付加速计更新之前,请通过向 属性分配值来指定更新频率。您可以请求更新的最大频率取决于硬件,但通常至少为 100 Hz。如果您请求的频率高于硬件支持的频率,Core Motion 会使用支持的最大值。accelerometerUpdateInterval

swift 复制代码
let motion = CMMotionManager()


func startAccelerometers() {
   // Make sure the accelerometer hardware is available. 
   if self.motion.isAccelerometerAvailable {
      self.motion.accelerometerUpdateInterval = 1.0 / 50.0  // 50 Hz
      self.motion.startAccelerometerUpdates()


      // Configure a timer to fetch the data.
      self.timer = Timer(fire: Date(), interval: (1.0/50.0), 
            repeats: true, block: { (timer) in
         // Get the accelerometer data.
         if let data = self.motion.accelerometerData {
            let x = data.acceleration.x
            let y = data.acceleration.y
            let z = data.acceleration.z
            // Use the accelerometer data in your app.
         }
      })

      // Add the timer to the current run loop.
      RunLoop.current.add(self.timer!, forMode: .defaultRunLoopMode)
   }
}

显示了一种将加速度计更新配置为每秒发生 50 次的方法。然后,该方法配置一个计时器以相同的频率获取这些更新并对数据执行某些操作。您可以将计时器配置为以较低的频率触发,但这样做会导致硬件生成比实际使用的更新更多的更新,从而浪费电量。

处理稳定的加速度计数据流

当您想要捕获所有传入的加速度计数据(也许可以分析其运动模式)时,请使用 方法 。此方法通过在指定队列上执行处理程序块,将每组新的加速度计值推送到您的应用程序。这些块的排队可确保您的应用接收所有加速计数据,即使您的应用变得繁忙并且短时间内无法处理更新。startAccelerometerUpdates(to:withHandler:)CMMotionManager

开始交付加速计更新之前,请通过向 属性分配值来指定更新频率。您可以请求更新的最大频率取决于硬件,但通常至少为 100 Hz。如果您请求的频率高于硬件支持的频率,Core Motion 将使用支持的最大值。 accelerometerUpdateInterval

清单 2 显示了 MotionGraphs 示例代码项目中的方法,您可以检查该方法以了解更多信息语境。该应用程序显示加速度计数据的实时图表。用户使用滑块配置加速度计的更新频率,更改该频率会导致调用示例中所示的 方法。此方法以新频率重新启动加速度计更新。每次收到新样本时,指定的块都会在主线程上排队。该块使用新的加速度计值更新应用程序的图形视图和标签。 startUpdatesWithSliderValue:

c 复制代码
static const NSTimeInterval accelerometerMin = 0.01;
- (void)startUpdatesWithSliderValue:(int)sliderValue {
    // Determine the update interval.
    NSTimeInterval delta = 0.005;
    NSTimeInterval updateInterval = accelerometerMin + delta * sliderValue;
    // Create a CMMotionManager object.
    CMMotionManager *mManager = [(APLAppDelegate *)
            [[UIApplication sharedApplication] delegate] sharedManager];
    APLAccelerometerGraphViewController * __weak weakSelf = self;
    // Check whether the accelerometer is available.
    if ([mManager isAccelerometerAvailable] == YES) {
        // Assign the update interval to the motion manager.
        [mManager setAccelerometerUpdateInterval:updateInterval];
        [mManager startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue]
               withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) {
        [weakSelf.graphView addX:accelerometerData.acceleration.x 
                  y:accelerometerData.acceleration.y 
                  z:accelerometerData.acceleration.z];
        [weakSelf setLabelValueX:accelerometerData.acceleration.x 
                  y:accelerometerData.acceleration.y 
                  z:accelerometerData.acceleration.z];
      }];
   }
   self.updateIntervalLabel.text = [NSString stringWithFormat:@"%f", updateInterval];
}
- (void)stopUpdates {
   CMMotionManager *mManager = [(APLAppDelegate *)
            [[UIApplication sharedApplication] delegate] sharedManager];
   if ([mManager isAccelerometerActive] == YES) {
      [mManager stopAccelerometerUpdates];
   }
}

CMRecordedAccelerometerData

class CMRecordedAccelerometerData : CMAccelerometerData

设备记录的单条加速度计数据。使用CMSensorRecorder 对象从系统中检索已记录的数据。

c 复制代码
var startDate: Date
记录传感器样本时的挂钟时间。
var identifier: UInt64
加速度计数据的唯一标识符。

class CMSensorDataList : NSObject

系统记录的加速度计数据列表

https://developer.apple.com/documentation/coremotion/cmsensordatalist

使用传感器数据列表对象来枚举加速度计数据

c 复制代码
-(void)processSamplesFromDate:(NSDate*)start toDate:(NSDate)end {
   CMSensorRecorder* recorder = [[CMSensorRecorder alloc] init];
   CMSensorDataList* list = [recorder accelerometerDataFrom:start to:end];
 
   for (CMRecordedAccelerometerData* data in list) {
      // Process the data.
      NSLog(@"Sample: (%f, %f, %f)", data.acceleration.x,
              data.acceleration.y, data.acceleration.z);
   }
}

class CMSensorRecorder : NSObject

提供加速度运动数据的传感器。使用传感器记录器启动加速度计数据的收集。稍后,使用传感器记录器获取记录的数据,以便您可以对其进行分析。您可以使用记录的数据来评估特定类型的运动并将结果合并到您的应用程序中。

要使用传感器记录器,请创建此类的实例并调用 方法来开始记录数据。您不需要明确停止录制过程。当指定时间到期且没有其他应用延长录音时间时,系统自动停止录音。 清单 1 显示了如何记录 20 分钟的加速度计数据。 recordAccelerometer(forDuration:)

static let accelerometer: SRSensor: https://developer.apple.com/documentation/sensorkit/srsensor/3377672-accelerometer

c 复制代码
if CMSensorRecorder.isAccelerometerRecordingAvailable() {
    let recorder = CMSensorRecorder()
    recorder.recordAccelerometerForDuration(20 * 60)  // Record for 20 minutes
}

static let odometer: SRSensor

提供有关速度和坡度信息的传感器。h

ttps://developer.apple.com/documentation/sensorkit/srsensor/4173050-odometer

class CMAccelerometerData : CMLogItem

来自设备的三个加速计的数据样本。

c 复制代码
访问加速度计数据
var acceleration: CMAcceleration
由加速度计测量的加速度。
struct CMAcceleration
包含 3 轴加速度值的结构类型。
相关推荐
刘小哈哈哈36 分钟前
实现一个iOS晃动动画
ios
__zhangheng9 小时前
Info.plist contained no UIScene configuration dictionary (looking for configura
macos·ios·objective-c·cocoa·swift
iOS民工14 小时前
iOS SSZipArchive 解压后 中文文件名乱码问题
ios
缘友一世15 小时前
macos安装maven以及.bash_profile文件优化
macos·maven·bash
阿7_QuQ18 小时前
mac远程控制另一台mac怎么操作?
运维·服务器·macos
皮蛋很白19 小时前
IOS safari 播放 mp4 遇到的坎儿
前端·ios·safari·video.js
缘友一世21 小时前
MacOS安装Xcode(非App Store)
ide·macos·xcode
缘友一世1 天前
将现有Web 网页封装为macOS应用
前端·macos·策略模式
Hacker_LaoYi1 天前
API安全学习笔记
macos·objective-c·cocoa
江上清风山间明月1 天前
Flutter DragTarget拖拽控件详解
android·flutter·ios·拖拽·dragtarget