CMPedometer 作为属性,错误代码 103
Posted
技术标签:
【中文标题】CMPedometer 作为属性,错误代码 103【英文标题】:CMPedometer as property, Error code 103 【发布时间】:2015-02-12 20:25:50 【问题描述】:我正在构建一个步骤管理器类,并在我的 .m 文件中添加了 CMPedometer 作为属性:
@interface WDStepTrackerManager ()
@property (nonatomic, strong) CMPedometer *pedometer;
@end
然后我在我的 init 方法中实例化它(我也尝试过惰性实例化——没有效果):
- (instancetype)init
self = [super init];
if (self)
self.pedometer = [[CMPedometer alloc] init];
return self;
最后,我尝试像这样使用计步器:
- (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
成为您的班级的财产应该阻止这种情况发生,但是尽管这样做了,我仍然收到错误。
我做错了什么?如何更改我的(非常简单的)代码以获取步骤?
【问题讨论】:
你用的是什么设备? @SkylerLauren,一部 iPhone 6。 【参考方案1】:问题是,尽管有一个指向我的CMPedometer
实例的强指针,但我没有指向我的WDStepTrackerManager
包装类的强指针。实例化这个类并将其存储在一个强属性中解决了我的问题。
【讨论】:
【参考方案2】:我也遇到了同样的问题,但是我没有把它变成一个属性,而是把它变成了一个实例变量,所以试试这个
@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]);
);
];
【讨论】:
-1 编译器也会为属性生成一个实例变量。所以无论哪种方式,它都是一个实例变量。这不是问题。以上是关于CMPedometer 作为属性,错误代码 103的主要内容,如果未能解决你的问题,请参考以下文章
我可以在后台收听 CMPedometer 并在不同情况下发送本地推送通知吗?