iOS17气压传感器失效的解决方法
原因
自iOS17.4开始,苹果永久性的更改了使用气压传感器的隐私权限,要求开启 运动与健身
权限。
解决方式
调用 CMMotionActivityManager 的查询方法:通过调用queryActivityStartingFromDate:toDate:toQueue:withHandler:方法来查询活动数据。尽管我们不需要运动数据,但这个调用会触发所需的授权提示。
在 info.plist
中声明 Privacy - Motion Usage Description
。
1
2
<key>NSMotionUsageDescription</key>
<string>应用需要使用运动数据来提供气压传感器功能。</string>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#import <CoreMotion/CoreMotion.h>
@interface AltitudeManager : NSObject
@property (strong, nonatomic) CMMotionActivityManager *activityManager;
@property (strong, nonatomic) CMAltimeter *altimeter;
@end
@implementation AltitudeManager
- (instancetype)init {
self = [super init];
if (self) {
self.activityManager = [[CMMotionActivityManager alloc] init];
self.altimeter = [[CMAltimeter alloc] init];
}
return self;
}
- (void)startAltitudeUpdatesViaMotionManager {
// 查询活动,确保授权提示会显示
[self.activityManager queryActivityStartingFromDate:[NSDate date]
toDate:[NSDate date]
toQueue:[NSOperationQueue mainQueue]
withHandler:^(NSArray<CMMotionActivity *> * _Nullable activities, NSError * _Nullable error) {
if (error) {
NSLog(@"活动查询错误: %@", error);
} else {
// 启动气压数据更新
[self.altimeter startRelativeAltitudeUpdatesToQueue:[NSOperationQueue mainQueue]
withHandler:^(CMAltitudeData * _Nullable altitudeData, NSError * _Nullable error) {
if (error) {
NSLog(@"气压更新错误: %@", error);
} else {
// 处理气压数据
NSLog(@"气压: %@, 海拔高度: %@", altitudeData.pressure, altitudeData.relativeAltitude);
}
}];
}
}];
}
@end
参考: