2015-05-17 10 views
8

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ı).

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

bir bölge, 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 
} 
+0

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

cevap

4

Sadece locationManager kullanmayan size on-girişi kodunu tetiklemek için gereken tüm bilgi verir bu arada hangi locationManager: didEnterRegion: olmamalıdır, CLLocationManagerDelegate protokolünün bir parçası olmayan kendi seçicinizi kullanın. Başka bir yaklaşım, bir bölgeyi izlemeye başladığınızda bir bölge içinde test etmektir.Bu çözüm, şu şekilde göründüğü kadar önemsiz değildir: sadece locationManager'ın konum özelliğinin okunması muhtemelen eski veya aşırı derecede hatalı okuma vereceği için, startUpdatingLocation numaralı telefonu arayarak geçerli konumunuzu güncellemeniz gerekir.

+0

Eğer izlemem gerekiyorsa API'nın amacı nedir? Bu sadece mantıklı görünmüyor mu? –

+0

API tanımı, giriş ve çıkış olaylarını izlediğini açıkça belirtir. API’den daha fazlasını elde etmek istersiniz, yani bir bölgedeki izleme işlemine başlarken giriş olayını tetikler. Bunun için daha düşük seviyeli bir API geri çağrısı var, locationManager: didDetermineState: forRegion: ve onu kullanabilirsiniz, ancak daha yüksek seviyeli bir şeyle birleştirmeye çalışmak bir sorun istiyor. –

+0

Ancak, bir bölgeye girildiğinde veya çıkıldığında, didetineState de sorgumda belirtildiği gibi tetiklenir. Yani, bir bölgeyi izlemeye başladığımda bulunduğum yeri elimden almak zorunda olduğumu söylüyorsunuz ve bu mevcut konum bölgedeyse, kendim hallediyorum. RequestStateForRegion yoksayılıyor? Yalnızca, bölgeyi izleme özelliğini kullanmıyorken requestStateForRegion'u başka hangi amaçla kullanacağınızı düşünemiyorum –

İlgili konular