वर्तमान स्थान अनुमति संवाद बहुत जल्दी गायब हो जाता है


175

मेरा ऐप उपयोगकर्ता का स्थान लेता है, को-ऑर्डिनेट करता है, और अपने गंतव्य या मूल से या उससे दूरी प्रदान करता है। इन सभी संभावित गंतव्यों को तालिका दृश्य में दिखाया गया है, इसलिए मैं उपयोगकर्ताओं को तालिका को आबाद करने के साथ-साथ समन्वय कर रहा हूं। केवल एक चीज यह है कि उपयोगकर्ताओं के स्थान के बारे में पूछने वाला सतर्क दृश्य तब प्रकट होता है, इतनी जल्दी गायब हो जाता है कि इसे क्लिक करना असंभव है!

क्या ऐप को पहले लोड करने पर मैन्युअल रूप से यह अलर्ट पेश करने का कोई तरीका है? जब ऐप लोड करने की कोशिश करता है और अलर्ट दिखाने के लिए मजबूर करता है, तो मैंने उपयोगकर्ता का स्थान प्राप्त करने की कोशिश की, लेकिन यह काम नहीं किया।

जवाबों:


698

जबकि नीचे ट्रैक करना मुश्किल है, इसके लिए समाधान काफी सरल है।

बहुत परीक्षण और त्रुटि के माध्यम से मुझे पता चला कि जब आप पहली बार ऐप में किसी भी स्थान सेवाओं का उपयोग करने का प्रयास करते हैं तो लोकेशन एक्सेस डायलॉग पॉप अप होता है, यदि CLLocationManagerऑब्जेक्ट पहले रिलीज़ होता है , तो डायलॉग अपने आप ही गायब हो जाता है (बिना किसी उपयोगकर्ता इंटरैक्शन के) उपयोगकर्ता संवाद का जवाब देता है।

मैं CLLocationManagerअपने viewDidLoadतरीके से एक उदाहरण बना रहा था । चूँकि यह विधि के लिए एक स्थानीय उदाहरण था, ए.आर.सी द्वारा विधि को पूरा करने के बाद यह उदाहरण जारी किया गया था। जैसे ही उदाहरण जारी किया गया, संवाद गायब हो गया। समाधान सरल था। CLLocationManagerआवृत्ति को श्रेणी-स्तरीय आवृत्ति चर के रूप में विधि-स्तरीय चर से परिवर्तित करें । अब CLLocationManagerकक्षा खाली होने के बाद केवल उदाहरण जारी किया जाता है।


117
काश मैं आपको
कोडर

1
बस Xamarin.iOS के साथ एक ही समस्या मारा। CLLocationManager को क्लास स्कोप बनाओ और डायलॉग दिखाई देता है।
क्रुमेलुर

1
Yaaaaa .... यदि आप आगे बढ़ सकते हैं और अपने आप को एक वृद्धि दे सकते हैं, तो यह greeeeeaaaat होगा। (गंभीरता से, यह मेरे लिए भी एक बड़ी बचत है)
गार्फोन्जो

2
मुझे भी इस पार्टी में शामिल होना है। यहाँ, मुझसे एक इंटरनेट उच्च पाँच प्राप्त करें!
Matthieu Riegler

3
स्विफ्ट में यह समस्या रखने वाला कोई भी व्यक्ति यह सुनिश्चित करता है कि आप दृश्यमान के बाहर स्थान प्रबंधक की घोषणा को स्थानांतरित कर दें। चीयर्स!
केडी।

5

समान लक्षण, अलग-अलग कारण: एक पंक्ति में एक से अधिक बार कॉल न करेंstartUpdatingLocation

मेरे पास गलती से संरचित चीजें थीं जैसे कि कोड अनजाने startUpdatingLocationमें लगातार दो बार कॉल कर रहा था , जो स्पष्ट रूप से खराब है। यह कतार की पसंद के साथ भी कुछ हो सकता है क्योंकि मैं एक नेटवर्क अनुरोध का परिणाम लंबित अपडेट शुरू करने के लिए इंतजार कर रहा था, लेकिन मुझे इसे ठीक करने के लिए किसी भी जीसीडी जादू करने की ज़रूरत नहीं थी ... बस यह सुनिश्चित करने के लिए कि मुझे ज़रूरत है शुरुआत दोहराई नहीं।

आशा है कि कोई मेरे दर्द से लाभ उठा सके। :)


5

मैंने भी ऐसी ही स्थिति का सामना किया है। डिबगिंग के बाद मैंने पाया

let locationManager = CLLocationManager()

एक विधि क्षेत्र में कहा जाता है, लेकिन इसे विश्व स्तर पर कहा जाना चाहिए।

क्यों?

संक्षेप में, विधि के वापस आने के बाद स्थान प्रबंधक को छोड़ दिया गया है। लेकिन इसे तब तक जारी नहीं किया जाना चाहिए जब तक कि उपयोगकर्ता अनुमति नहीं देता या इनकार नहीं करता


4

मैं एक ही मुद्दे (लक्षणों से कम से कम) में आता हूं। मेरे मामले में समस्या - (void)applicationWillResignActive:(UIApplication *)application;विधि में थी, जहाँ मैं CLLocationManagerपृष्ठभूमि परिवर्तन के लिए तैयारी के हिस्से के रूप में अपना उदाहरण जारी कर रहा था । जब मैंने इसे हटा दिया और इसे छोड़ दिया तो केवल - (void)applicationDidEnterBackground:(UIApplication *)application;समस्या दूर हो गई।
मुश्किल हिस्सा यह है कि कोर लोकेशन अलर्ट आपके आवेदन को निलंबित कर देता है जबकि यह अभी भी अग्रभूमि में है।
आशा है कि यह आपकी मदद करेगा, मुझे उस कमीने को ढूंढने में बहुत समय लगा :)


4

मुझे पता है कि यह बहुत देर से जवाब है। लेकिन यह किसी की मदद कर सकता है। मैंने भी इसी समस्या का सामना किया और इस मुद्दे को पहचानने में एक घंटा बिताया। पहले तो मेरा कोड इस तरह था।

CLLocationManager *locationManager = [[CLLocationManager alloc] init];
[locationManager startUpdatingLocation];

CLLocation *location = locationManager.location;
//my stuff with the location

    [locationManager release];

अब स्थान अलर्ट जल्दी से गायब हो गया। जब मैं अंतिम लाइन को अनफिल्ट करता हूं तो यह सही तरीके से काम कर रहा है।

   // [locationManager release];

3
यह सच है। इस उत्तर के लिए मैं केवल यह कहूंगा कि जब आपकी परियोजना ARC सक्षम हो गई है, तो आपको अपने कोड में रिलीज़ स्टेटमेंट को शामिल करने की आवश्यकता नहीं है और आप अभी भी इस समस्या में भाग लेंगे। उस परिदृश्य में समस्या को हल करने का एकमात्र तरीका विधि-स्तर के बजाय चर वर्ग-स्तर बनाना है।
झोली

3

मैं इस समस्या में भी भाग गया, लेकिन मेरे मामले में समाधान स्वीकृत उत्तर की तुलना में पूरी तरह से अलग था।

मेरे ऐप में, मैं बुला रहा था stopUpdatingLocationसे applicationWillResignActive। यह एक समस्या थी क्योंकि applicationWillResignActiveअनुमति संवाद दिखाई देने पर कहा जाता है। इसके stopUpdatingLocationतुरंत बाद कारण बन रहा था startUpdatingLocation, यही कारण है कि संवाद तुरंत गायब हो जाएगा।

समाधान कॉल करने के लिए बस था stopUpdatingLocationसे applicationDidEnterBackgroundबजाय।


2

IOS सिम्युलेटर का उपयोग करते समय मेरे साथ ऐसा हो रहा था। मैंने निर्धारित किया कि यह हो रहा था क्योंकि मेरी रन स्कीम एक स्थान का अनुकरण कर रही थी। मुझे लगता है कि locationManager.startUpdatingLocation()लॉन्च में कॉलिंग के समान ही इसका प्रभाव है और इसलिए यह संवाद को बंद कर रहा है।

योजनाओं को संपादित करें संवाद में "लोकेशन सिमुलेशन की अनुमति दें" चेकबॉक्स को अनइंस्टॉल करें। एक बार जब आप यह चाहते हैं कि यह काम करता है और अनुमति निर्धारित है, तो आप स्थान सिमुलेशन को फिर से सक्षम कर सकते हैं और सिम्युलेटर तब से ठीक काम करेगा।


इसने मेरे लिए कुछ विस्तार का काम किया। कम से कम मुझे संवाद देखने को मिला
CppChase

2

स्विफ्ट 4 और आईओएस 11 :

सुनिश्चित करें कि आपकी फ़ाइल में गोपनीयता लाइनें ( हमेशा और कब दोनों ) जोड़ी.plist गई हैं और CoreLocationअपनी परियोजना में फ्रेमवर्क जोड़ें

जब मैंने बदला है तो स्थान अनुमति संवाद सही ढंग से दिखाई देता है:

locationManager.requestAlwaysAuthorization()

साथ में:

locationManager.requestWhenInUseAuthorization()

पुनश्च : मैंने सभी सलाह की कोशिश की है और सभी विफल रहता है ( स्थान के लिए प्राधिकरण का अनुरोध करें viewDidLoad, varबजाय letस्थान startUpdatingLocation()प्रबंधक के अनुरोध के बाद शुरू न करें..मुझे लगता है कि यह एक बग है और मुझे उम्मीद है कि वे इसे जल्द से जल्द हल कर लेंगे ..


मैंने सभी सलाह का पालन किया है, लेकिन मेरे पास हमेशा एक ही मुद्दा है। स्थान अनुमति संवाद संक्षेप में दिखाई देता है, फिर तुरंत गायब हो जाता है। तब मेरी अधिसूचना संवाद अनुमति प्रकट होती है (यह एक सामान्य है), जब मैं स्वीकार या अस्वीकार दबाता हूं, तो एक अन्य स्थान अनुमति प्रकट होती है (इस समय यह रहता है और मुझे स्वीकार या अस्वीकार करने देता है)।

@BitoQ हाँ, मेरे लिए भी। समान स्थिति लेकिन कम से कम हम इस संवाद को देख सकते हैं, मुझे उम्मीद है कि अगले iOS 11.1 के साथ वे इस बग को ठीक कर लेंगे ..
एलेसेंड्रो ओरानो

1

स्विफ्ट 4 @Zoli समाधान की तरह दिखेगा:

class WhateverViewController: UIViewController {
    let locationManager = CLLocationManager() // here is the point of the @Zoli answer

    // some code
    override func viewDidLoad() {
        super.viewDidLoad()

        // some other code
        locationManager.requestWhenInUseAuthorization()
        // some other code
    }
}

0

आप वैश्विक ऑब्जेक्ट के रूप में स्थान प्रबंधक संस्करण को सबसे अधिक परिभाषित करते हैं।

@interface ViewController : UIViewController
{
    CLLocationManager *locationManager;
}
@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    CLLocationManager *locationManager = [[CLLocationManager alloc] init];
    [locationManager startUpdatingLocation];
}

0

मैं आपकी उसी स्थिति से मिला।

  • मेरा समाधान स्थानीय चर से सदस्य उदाहरण में बदल दिया गया था।
  • कारण यह था कि विधि समाप्त होने के बाद स्थानीय; उदाहरण अमान्य था, जिसमें स्थानीय चर (मेरे स्थान का विस्तार करने वाला) शामिल है
  • मेरा Env .: Xcode9.3.1
#आयात 
@interface ViewController ()

@समाप्त

@ कार्यान्वयन दृश्य नियंत्रक
@synthesize locManager; // उपरांत
- (शून्य) दृश्यदालद {
    [सुपर व्यूडीडलड];
    // दृश्य लोड करने के बाद कोई भी अतिरिक्त सेटअप करें, आमतौर पर एक नीब से।

    // MyLocationService * locManager = [[BSNLocationService आवंटन] init: nil]; // इससे पहले। नियंत्रण रेखा। प्रतिनिधि ने काम नहीं किया क्योंकि इस विधि के बाद उदाहरण अमान्य हो गया।
    आत्म-> locManager = [[MyLocationService आवंटन] init: nil]; // उपरांत
    locManager.startService;
}

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.