stepstead-client/native/pedometer-ios/pedometer.mm
jts 6a1706051d İlk commit: Stepstead Godot istemci (4.6 Mobile)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-11 11:31:35 +03:00

85 lines
2.2 KiB
Text
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Stepstead — iOS Pedometer plugin (CMPedometer) implementasyonu.
#import "pedometer.h"
#import <CoreMotion/CoreMotion.h>
#import <Foundation/Foundation.h>
// Objective-C tarafı: CMPedometer'ı tutar, adım sayısını günceller.
@interface StepsteadPedometer : NSObject
@property(nonatomic, strong) CMPedometer *pedometer;
@property(nonatomic, assign) int stepCount;
@property(nonatomic, strong) NSDate *sessionStart;
@property(nonatomic, assign) BOOL running;
@end
@implementation StepsteadPedometer
@end
static StepsteadPedometer *_ped = nil;
Pedometer *Pedometer::instance = nullptr;
void Pedometer::_bind_methods() {
ClassDB::bind_method(D_METHOD("is_available"), &Pedometer::is_available);
ClassDB::bind_method(D_METHOD("start"), &Pedometer::start);
ClassDB::bind_method(D_METHOD("stop"), &Pedometer::stop);
ClassDB::bind_method(D_METHOD("get_step_count"), &Pedometer::get_step_count);
}
bool Pedometer::is_available() {
// Not: iOS Simulator'da daima false döner — gerçek cihaz gerekir.
return [CMPedometer isStepCountingAvailable] ? true : false;
}
void Pedometer::start() {
if (![CMPedometer isStepCountingAvailable]) {
return;
}
if (_ped == nil) {
_ped = [[StepsteadPedometer alloc] init];
_ped.pedometer = [[CMPedometer alloc] init];
_ped.stepCount = 0;
}
if (_ped.running) {
return;
}
_ped.running = YES;
_ped.sessionStart = [NSDate date];
_ped.stepCount = 0;
// Uygulama açıkken canlı güncelleme. numberOfSteps = sessionStart'tan beri.
[_ped.pedometer startPedometerUpdatesFromDate:_ped.sessionStart
withHandler:^(CMPedometerData *_Nullable data, NSError *_Nullable error) {
if (data != nil && error == nil) {
_ped.stepCount = [data.numberOfSteps intValue];
}
}];
}
void Pedometer::stop() {
if (_ped != nil && _ped.running) {
[_ped.pedometer stopPedometerUpdates];
_ped.running = NO;
}
}
int Pedometer::get_step_count() {
return _ped != nil ? _ped.stepCount : 0;
}
Pedometer *Pedometer::get_singleton() {
return instance;
}
Pedometer::Pedometer() {
ERR_FAIL_COND(instance != nullptr);
instance = this;
}
Pedometer::~Pedometer() {
if (_ped != nil) {
[_ped.pedometer stopPedometerUpdates];
_ped = nil;
}
instance = nullptr;
}