2015-05-17 4 views
8

मैं ऐसे परिदृश्य को संभालने में असमर्थ रहा हूं जहां फ़ोन पहले से ही किसी क्षेत्र के अंदर है जब 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 
} 
+0

इस [मेटा पोस्ट] के अधीन रहते हुए (https://meta.stackoverflow.com/q/262806/5175709)। सवाल में जवाब शामिल करना बेहतर है। या तो एक अलग उत्तर लिखें या सिर्फ एक दिए गए उत्तर को स्वीकार करें या एक टिप्पणी लिखें। – Honey

उत्तर

4

बस locationManager का उपयोग नहीं करते आप सभी की जानकारी आपको ऑन-प्रविष्टि कोड, गति प्रदान करने के लिए आवश्यक होते हैं जो, वैसे , स्थान नहीं होना चाहिए प्रबंधक: didEnterRegion:, अपने स्वयं के चयनकर्ता का उपयोग करें, जो CLLocationManagerDelegate प्रोटोकॉल का हिस्सा नहीं है।

एक और दृष्टिकोण एक क्षेत्र की निगरानी करने के लिए एक क्षेत्र के स्थान के लिए परीक्षण करना है।यह समाधान यह हालांकि लग रहा है के रूप में है कि तुच्छ नहीं है: आप, पहले startUpdatingLocation फोन करके वर्तमान स्थान अपडेट करने के लिए सिर्फ locationManager के स्थान संपत्ति पढ़ने शायद आप बासी या बहुत गलत रीडिंग दे देंगे के रूप में की जरूरत है।

+0

क्या एपीआई का मुद्दा है अगर मुझे इसे खुद ट्रैक करना है? यह बिल्कुल तार्किक प्रतीत नहीं होता है? –

+0

एपीआई विवरण स्पष्ट रूप से बताता है कि यह प्रवेश और निकास घटनाओं पर नज़र रखता है। आप एपीआई से अधिक प्राप्त करना चाहते हैं, अर्थात् एक क्षेत्र के अंदर से निगरानी शुरू करते समय एंट्री इवेंट फायरिंग करना। उस के लिए निचला स्तर एपीआई कॉलबैक है, स्थान प्रबंधक: didDetermineState: forRegion: और आप इसका उपयोग कर सकते हैं, लेकिन इसे उच्च स्तर की सामग्री के साथ संयोजित करने का प्रयास करना एक परेशानी के लिए पूछ रहा है। –

+0

लेकिन जैसा कि मैंने अपने प्रश्न में उल्लेख किया है, डीडर्मिनस्टेट भी तब ट्रिगर होता है जब कोई क्षेत्र प्रवेश या बाहर निकलता है। तो अपने क्या कह रहे हैं मैं स्वयं वर्तमान स्थान प्राप्त करने के लिए जब मैं एक क्षेत्र की निगरानी शुरू कर दिया है, और अगर यह वर्तमान स्थान क्षेत्र के भीतर है मैं इसे अपने आप को संभाल है। अनुरोध को अनदेखा करनाStorForRegion ?. मैं spose मैं सिर्फ सोच भी नहीं सकते और क्या करता है, तो क्षेत्र की निगरानी –

संबंधित मुद्दे