Objective c CMP计步器作为属性,错误代码103
我正在构建一个step manager类,在我的.m文件中,我添加了CMPedometer作为属性:Objective c CMP计步器作为属性,错误代码103,objective-c,core-motion,Objective C,Core Motion,我正在构建一个step manager类,在我的.m文件中,我添加了CMPedometer作为属性: @interface WDStepTrackerManager () @property (nonatomic, strong) CMPedometer *pedometer; @end 然后,我在init方法中实例化它(我也尝试过惰性实例化——没有效果): 最后,我试着像这样使用计步器: - (void)stepsForTodayWithCompletion:(void(^)(int ste
@interface WDStepTrackerManager ()
@property (nonatomic, strong) CMPedometer *pedometer;
@end
然后,我在init方法中实例化它(我也尝试过惰性实例化——没有效果):
最后,我试着像这样使用计步器:
- (void)stepsForTodayWithCompletion:(void(^)(int steps))completion
{
[self.pedometer queryPedometerDataFromDate:[[NSDate date] midnight] toDate:[NSDate date] withHandler:^(CMPedometerData *pedometerData, NSError *error) {
dispatch_async(dispatch_get_main_queue(), ^{
if (pedometerData) {
completion([pedometerData.numberOfSteps intValue]);
}
});
}];
}
然而,每次,尽管批准访问数据,我都会收到一个103错误,pedometerData
为nil
。(如果你想知道NSDate
上的midnight
选择器,据我所知,它来自于我构建的一个类别,它有大量的单元测试,并且工作正常。)其他问题说,将CMPedometer
作为类的属性应该可以阻止这种情况发生,但我仍然收到了错误,尽管我确实这样做了
我做错了什么?如何更改(非常简单的)代码以获得步骤?我也有同样的问题,但我没有将其作为属性,而是将其作为实例变量,因此请尝试此方法
@implementation WDStepTrackerManager
CMPedometer *pedometer;
- (instancetype)init
{
self = [super init];
if (self)
{
pedometer = [[CMPedometer alloc]init];
}
return self;
}
像这样使用它
- (void)stepsForTodayWithCompletion:(void(^)(int steps))completion
{
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *startOfDate =[calendar startOfDayForDate:[NSDate date]];
[pedometer queryPedometerDataFromDate:startOfDate toDate:[NSDate date] withHandler:^(CMPedometerData *pedometerData, NSError *error) {
if (pedometerData) {
completion([pedometerData.numberOfSteps intValue]);
}
});
}];
}
问题是,尽管有一个指向我的
CMPedometer
实例的强指针,但我没有指向我的WDStepTrackerManager
包装类的强指针。实例化该类并将其存储在强属性中解决了我的问题。您使用的是什么设备?@SkylerLauren,iPhone 6.-1编译器也为属性生成一个实例变量。所以不管怎样,它都是一个实例变量。这不是问题所在。
- (void)stepsForTodayWithCompletion:(void(^)(int steps))completion
{
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *startOfDate =[calendar startOfDayForDate:[NSDate date]];
[pedometer queryPedometerDataFromDate:startOfDate toDate:[NSDate date] withHandler:^(CMPedometerData *pedometerData, NSError *error) {
if (pedometerData) {
completion([pedometerData.numberOfSteps intValue]);
}
});
}];
}