मैं ऐसे परिदृश्य को संभालने में असमर्थ रहा हूं जहां फ़ोन पहले से ही किसी क्षेत्र के अंदर है जब startMonitoringForRegion
कहा जाता है? अन्य प्रश्नों ने को didStartMonitoringForRegion
के अंदर कॉल करने का सुझाव दिया है, फिर यह विधि didDetermineState: forRegion:
पर कॉल करें। तो कोड इस तरह दिखता है:आईओएस जियोफ़ेंस, निगरानी के दौरान क्षेत्र के अंदर कब संभालना है?
- (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];
}
}
अब स्पष्ट रूप से विधि geofenceRegion अपने ही है और यह ठीक काम करता है, और वस्तुओं अक्षांश देशांतर और त्रिज्या तरह बातें शामिल हैं और यह कि सभी काम करता है ठीक रूप में अच्छी तरह ताकि नहीं है यहाँ समस्या
वैसे भी, उपर्युक्त कोड के साथ समस्या यह है कि यह तब काम करता है जब उपयोगकर्ता पहले से ही क्षेत्र में है जब यह क्षेत्र को उनके डिवाइस में जोड़ता है (यानी किया गया था। एंटररियन किया जाता है)।
स्थान प्रबंधक इस विधि जब भी किसी क्षेत्र के लिए सीमा संक्रमण है कहता है: हालांकि समस्या यह है कि विधि
didDetermineState: forRegion:
भी हर बार सीमा क्षेत्रों में से एक प्रति सेब डॉक्स के रूप में पार कर जाता है कहा जाता है। यह स्थान कॉल करने के अलावा इस विधि को कॉल करता है प्रबंधक: didEnterRegion: और locationManager: didExitRegion: विधियां। स्थान प्रबंधक अपने अनुरोध को कॉल के जवाब में इस विधि को भी कॉल करता हैस्टेटफोररियन: विधि, जो असीमित रूप से चलती है।
इस वजह से अब एक क्षेत्र में प्रवेश किया है, didEnterRegion
स्वचालित रूप से कहा जाता है, लेकिन फिर इसे फिर से क्योंकि didDetermineState: forRegion:
भी स्वतः प्रति सेब डॉक्स के रूप में कहा जाता है कहा जाता है और यह इतना क्षेत्र है फिर से बुलाया जा रहा है didEnterRegion
में जो परिणाम हर बार दो बार प्रवेश किया जब मैं केवल इसे एक बार दर्ज करना चाहता हूं। इससे कैसे बचा जा सकता है?
आपकी मदद के लिए धन्यवाद।
समाधान
समाधान वास्तव में बहुत आसान है मैं सिर्फ गलत तरीके से इसके बारे में जा रहा था है। मुझे या तो 2 विधियों didEnterRegion:
और didExitRegion
का उपयोग करना चुनना था या didDetermineState: forRegion
का उपयोग करना था और क्षेत्र में प्रवेश करने और बाहर निकलने के लिए अपनी खुद की विधियां बनाना, दोनों का उपयोग नहीं किया जाना चाहिए।
तो मैं केवल didDetermineState: forRegion
विधि का उपयोग करने के लिए चुना है और मेरे कोड अब इस तरह दिखता है:
कृपया ध्यान दें कि इस विधि से बाहर निकलने के क्षेत्र के साथ क्षेत्र नहीं तो अंदर के लिए कहा जाता है और किया जाएगा यदि, मेरी तरह, आप केवल एक प्रविष्टि के बाद बाहर निकलने के लिए बाहर निकलना चाहते हैं, आपको यह जांचने की विधि की आवश्यकता होगी कि क्या क्षेत्र पहले ही दर्ज हो चुका है (मैंने स्वयं कोर डेटा का उपयोग किया क्योंकि मैं पहले से ही क्षेत्रों के अन्य पहलुओं को स्टोर करने के लिए इसका उपयोग कर रहा था)। के रूप में locationManager सब पर,: didDetermineState: forRegion: 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
}
इस [मेटा पोस्ट] के अधीन रहते हुए (https://meta.stackoverflow.com/q/262806/5175709)। सवाल में जवाब शामिल करना बेहतर है। या तो एक अलग उत्तर लिखें या सिर्फ एक दिए गए उत्तर को स्वीकार करें या एक टिप्पणी लिखें। – Honey