startMonitoringForRegion
çağrıldığında telefonun bir bölgenin içinde bulunduğu bir senaryonun nasıl ele alınacağını çözemedim? Diğer sorular, didStartMonitoringForRegion
'un içinde requestStateForRegion
'u çağırmayı önerdi. Bu, didDetermineState: forRegion:
yöntemini çağırır. Yani kod şöyle görünür:iOS Geofence, izleme başladığında bölge içinde nasıl ele alınır?
- (void)viewDidLoad {
//location manager set up etc...
for (Object *object in allObjects){
CLRegion *region = [self geofenceRegion:object];
[locationManager startMonitoringForRegion:region];
}
}
- (void)locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region {
[self.locationManager requestStateForRegion:region];
[self.locationManager performSelector:@selector(requestStateForRegion:) withObject:region afterDelay:5];
}
- (void)locationManager:(CLLocationManager *)manager
didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region {
if (state == CLRegionStateInside){
[self locationManager:locationManager didEnterRegion:region];
}
}
Şimdi açıkçası yöntem geofenceRegion benim ve gayet iyi çalışıyor, ve nesneler lat uzun ve yarıçapı gibi şeyler içerir ve tüm ince yanı çalıştığından emin değildir bu yüzden sorun burada. Her neyse, yukarıdaki kodla ilgili sorun, kullanıcının bölgeyi cihazına eklediğinde zaten bölgedeyse çalışmasıdır (yani, didntnterRegion yapıldı).
bir bölge,konum yöneticisi bir bölge için bir sınır geçiş olduğunda bu yöntemi çağırır: Sorun yöntemi
didDetermineState: forRegion:
da sınır bölgelerinden biri elma dokümanlar göre geçilen her zaman denir olmasıdır Ancak. LocationManager: didEnterRegion: ve locationManager: didExitRegion: methodlarını çağırmanın yanı sıra bu yöntemi çağırır. Konum yöneticisi, bu yöntemi, eşzamansız olarak çalışan requestStateForRegion: yöntemine yapılan bir çağrıya yanıt olarak da çağırır. bu nedenle Şimdi
didEnterRegion
otomatik olarak çağrılır girilir ama sonra
didDetermineState: forRegion:
da otomatik elma docs göre adlandırılır çünkü tekrar denir ve bu bölge böylece tekrar çağrılan
didEnterRegion
sonuçlanır her zaman sadece bir kez girilmesini istediğimde iki kez girildi. Bundan nasıl kurtulabilirim?
Yardımlarınız için teşekkürler.
ÇÖZÜM
çözüm gerçekten ben sadece yanlış yol bu konuda gidiyordu o kadar basittir. didEnterRegion:
ve didExitRegion
2 yöntemlerini kullanmayı ya da didDetermineState: forRegion
kullanın ve bölgeye giriş ve çıkış için kendi yöntemlerimi oluşturmam gerekiyordu, her ikisi de kullanılmamalıdır.
Yani ben sadece didDetermineState: forRegion
yöntemi kullanmayı seçtiniz ve benim kod artık şöyle görünür:
bu yöntem çıkış bölgeyle o değilse içeride bölge için çağırdı ve edilecektir Lütfen dikkat, benim gibi, sadece bir girişin gerçekleşmesinden sonra gerçekleşmesini istiyorsanız, bölgenin önceden girilmiş olup olmadığını kontrol etmeniz için bir çeşit yönteme ihtiyaç duyacaksınız (zaten bölgelerin diğer yönlerini saklamak için kullandığım için çekirdek verileri kullandım). didDetermineState: forRegion: locationManager olarak, hiç: didEnterRegion:
- (void)viewDidLoad {
//location manager set up etc...
for (Object *object in allObjects){
CLRegion *region = [self geofenceRegion:object];
[locationManager startMonitoringForRegion:region];
}
}
- (void)locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region {
[self.locationManager performSelector:@selector(requestStateForRegion:) withObject:region afterDelay:5];
}
- (void)locationManager:(CLLocationManager *)manager
didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region {
if (state == CLRegionStateInside){
[self enterGeofence:region];
} else if (state == CLRegionStateOutside){
[self exitGeofence:region];
} else if (state == CLRegionStateUnknown){
NSLog(@"Unknown state for geofence: %@", region);
return;
}
}
- (void)enterGeofence:(CLRegion *)geofence {
//whatever is required when entered
}
- (void)exitGeofence:(CLRegion *)geofence {
//whatever is required when exit
}
Bu [meta] alanına konu (https://meta.stackoverflow.com/q/262806/5175709). Cevabın kendisinin içinde yer almaması daha iyidir. Ya ayrı bir cevap yazın ya da sadece belirli bir cevabı kabul edin veya bir yorum yazın. – Honey