বর্তমান অবস্থান অনুমতি ডায়ালগ খুব দ্রুত অদৃশ্য হয়ে যায়


175

আমার অ্যাপ্লিকেশনটি ব্যবহারকারীর অবস্থান নেয়, সমন্বয় সাধন করে এবং তাদের গন্তব্য বা উত্স থেকে বা তার থেকে দূরত্ব সরবরাহ করে। এই সমস্ত সম্ভাব্য গন্তব্যগুলি একটি সারণী দৃশ্যে দেখানো হয়েছে, সুতরাং আমি একই সময়ে সারণীকে জনসাধারণের সমবায় পেতে পারি। কেবলমাত্র, ব্যবহারকারীদের অবস্থানের জন্য জিজ্ঞাসা করা সতর্কতা উপস্থিতিটি এত তাড়াতাড়ি অদৃশ্য হয়ে যায় যা এটিকে ক্লিক করা অসম্ভব!

অ্যাপ্লিকেশনটি প্রথমবার লোড হওয়ার সাথে সাথে এই সতর্কতাটি ম্যানুয়ালি উপস্থাপন করার কোনও উপায় আছে কি? অ্যাপটি লোড হয়ে যাওয়ার সাথে সাথে সতর্কতাটি প্রদর্শন করার জন্য চাপ দেওয়ার সময় আমি ব্যবহারকারীর অবস্থান পাওয়ার চেষ্টা করেছি, কিন্তু এটি কার্যকর হয়নি।

উত্তর:


698

ট্র্যাক ডাউন করা কঠিন হলেও এর সমাধান বেশ সহজ।

অনেক পরীক্ষার এবং ত্রুটির মধ্য দিয়ে আমি জানতে পেরেছিলাম যে আপনি যখন অ্যাপটিতে প্রথমবারের জন্য কোনও অবস্থান পরিষেবাগুলিতে অ্যাক্সেস করার চেষ্টা করছেন তখন অবস্থান অ্যাক্সেস ডায়ালগটি পপ আপ হয়, তবে ডায়ালগটি তার নিজের (কোনও ব্যবহারকারীর ইন্টারঅ্যাকশন ছাড়াই) অদৃশ্য হয়ে গেলে CLLocationManagerঅবজেক্টটি আগে প্রকাশিত হয় ব্যবহারকারী ডায়ালগ সাড়া।

আমি CLLocationManagerআমার viewDidLoadপদ্ধতিতে একটি উদাহরণ তৈরি করছিলাম । যেহেতু এটি পদ্ধতির স্থানীয় উদাহরণ ছিল, পদ্ধতিটি সম্পাদন শেষ হওয়ার পরে উদাহরণটি এআরসি দ্বারা প্রকাশ করা হয়েছিল। উদাহরণটি প্রকাশের সাথে সাথেই ডায়ালগটি অদৃশ্য হয়ে গেল। সমাধান বরং সহজ ছিল। পরিবর্তন CLLocationManagerএকটি পদ্ধতি পর্যায়ের পরিবর্তনশীল একটি বর্গ পর্যায়ের উদাহরণস্বরূপ পরিবর্তনশীল হতে হওয়া থেকে উদাহরণস্বরূপ। CLLocationManagerক্লাসটি লোড হওয়ার পরে এখন কেবল উদাহরণটি প্রকাশ করা হবে।


117
আমি চাই আমি আপনাকে +100
কোডার

1
Xamarin.iOS এর সাথে একই সমস্যাটি চাপুন। সিএললোকেশনম্যানেজার শ্রেণির সুযোগ তৈরি করুন এবং ডায়ালগটি দৃশ্যমান থেকে যায়।
ক্রুমেলুর

1
ইয়াআআআআআআ .... যদি আপনি এগিয়ে গিয়ে নিজেকে উত্থাপন করতে পারতেন তবে গ্রিইআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআআহ এইসাফ যদি আপনি নিজেকে এগিয়ে দিতে পারে এবং গ্রেইয়াআআআআআআআত (সিরিয়াসলি, এটি আমার পক্ষেও বড় সঞ্চয়)
গারফোনজো

2
আমাকেও এই পার্টিতে যোগ দিতে হবে। এখানে, আমার কাছ থেকে একটি ইন্টারনেট হাই ফাইভ পান!
ম্যাথিউ রিগলার

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];

এখন লোকেশন সতর্কতা দ্রুত অদৃশ্য হয়ে গেল। আমি যখন শেষ লাইনটি uncomment করি তখন এটি সঠিকভাবে কাজ করছে।

   // [locationManager release];

3
এটা সত্য. আমি এই উত্তরে কেবলমাত্র সাবধানতাটি যুক্ত করব তা হল আপনার প্রকল্পটি যখন আরসি সক্ষম করেছে তখন আপনাকে আপনার কোডে প্রকাশের বিবৃতি অন্তর্ভুক্ত করার দরকার নেই এবং আপনি এখনও এই সমস্যার মধ্যে চলে যাবেন। সেই পরিস্থিতিতে সমস্যাটি সমাধানের একমাত্র উপায় হ'ল পদ্ধতি-স্তরের পরিবর্তে পরিবর্তনশীল শ্রেণি-স্তর তৈরি করা।
জুলি

3

আমিও এই সমস্যার মধ্যে পড়েছিলাম, তবে আমার ক্ষেত্রে সমাধানটি গৃহীত উত্তরের চেয়ে সম্পূর্ণ আলাদা to

আমার অ্যাপ্লিকেশানের, আমি ডাকছিলেন stopUpdatingLocationথেকে applicationWillResignActive। এটি একটি সমস্যা ছিল কারণ applicationWillResignActiveঅনুমতি ডায়ালগ প্রদর্শিত হবে তখন বলা হয়। এটি stopUpdatingLocationতত্ক্ষণাত্ ঘটায় startUpdatingLocation, তাই ডায়ালগটি ততক্ষনে অদৃশ্য হয়ে যাবে।

সমাধান কলে কেবল ছিল stopUpdatingLocationথেকে applicationDidEnterBackgroundপরিবর্তে।


2

আইওএস সিমুলেটার ব্যবহার করার সময় আমার সাথে এটি ঘটছিল। আমি স্থির করেছিলাম যে এটি ঘটছে কারণ আমার রান স্কিমটি কোনও অবস্থানের অনুকরণ করছে। আমি মনে করি locationManager.startUpdatingLocation()এটির প্রবর্তনে কল করার মতো একই প্রভাব রয়েছে এবং তাই এটি ডায়ালগটি বন্ধ করে দিচ্ছিল।

সম্পাদনা স্কিমস ডায়ালগের "লোকেশন সিমুলেশন অনুমোদন করুন" চেকবক্সটি আন-চেক করা সমস্যার সমাধান করেছে। এটি যখন আপনার যেমন ইচ্ছা তেমন কাজ করে এবং অনুমতিটি সেট হয়ে গেলে আপনি লোকেশন সিমুলেশনটি পুনরায় সক্ষম করতে পারবেন এবং সিমুলেটর তখন থেকে দুর্দান্ত কাজ করবে।


এটি আমার জন্য কিছুটা বাড়িয়ে দিয়েছে। সর্বনিম্ন আমি ডায়লগটি দেখতে পেয়েছি
CppChase

2

সুইফট 4 এবং আইওএস 11 :

আপনার ফাইলে প্রাইভেসি লাইনগুলি ( সর্বদা এবং যখনই ব্যবহার করা হবে ) .plistযোগ করেছেন CoreLocationএবং আপনার প্রকল্পে ফ্রেমওয়ার্ক যুক্ত করার বিষয়ে নিশ্চিত হন

আমি পরিবর্তন করেছি যখন অবস্থান অনুমতি ডায়ালগ সঠিকভাবে প্রদর্শিত হবে:

locationManager.requestAlwaysAuthorization()

সঙ্গে:

locationManager.requestWhenInUseAuthorization()

PS : আমি সমস্ত পরামর্শ এবং সমস্ত ব্যর্থতার চেষ্টা করেছি ( লোকেশন ম্যানেজারের পরিবর্তে অনুমোদনের জন্য অনুরোধ করুন viewDidLoad, অনুরোধের পরে আরম্ভ করবেন না ... আমি মনে করি এটি একটি বাগ এবং আমি আশা করি তারা যত তাড়াতাড়ি সম্ভব সমাধান করবেন ..varletstartUpdatingLocation()


আমি সমস্ত পরামর্শগুলিও অনুসরণ করেছি, তবে আমার সর্বদা একই সমস্যা রয়েছে। অবস্থান অনুমতি সংলাপ সংক্ষেপে প্রদর্শিত হবে, তারপরে অবিলম্বে অদৃশ্য হয়ে যাবে। তারপরে আমার বিজ্ঞপ্তি সংলাপের অনুমতিটি উপস্থিত হয় (এটি সাধারণ normal) আমি যখন চাপুন স্বীকার বা প্রত্যাখ্যান করি তখন অন্য কোনও অবস্থানের অনুমতি উপস্থিত হয় (এবার এটি স্থির থাকে এবং আমাকে গ্রহণ বা প্রত্যাখ্যান করতে দেয়)।

@ বিটকিউ হ্যাঁ, আমার জন্যও। একই পরিস্থিতি তবে কমপক্ষে আমরা এই ডায়লগটি দেখতে পাচ্ছি, আমি আশা করি পরবর্তী আইওএস 11.1 এর সাহায্যে তারা এই বাগটি সংশোধন করবে ..
অ্যালেসান্দ্রো ওর্নানো

1

সুইট 4 @ জোলি দ্রবণটি দেখতে পাবেন:

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

আমি আপনার একই পরিস্থিতি পূরণ।

  • আমার সমাধানটি স্থানীয় পরিবর্তনশীল থেকে সদস্যের উদাহরণে পরিবর্তিত হয়েছিল।
  • কারণটি ছিল যে পদ্ধতিটি শেষ হওয়ার পরে স্থানীয়? উদাহরণটি অবৈধ ছিল যার মধ্যে স্থানীয় ভেরিয়েবল (আমার অবস্থানের ব্যবস্থাপনার প্রসারিত) অন্তর্ভুক্ত রয়েছে
  • আমার এনভ .: এক্সকোড 9.3.1
#import 
@ আন্তঃফেস ভিউ কন্ট্রোলার ()

@শেষ

@ বাস্তবায়ন দেখুনকন্ট্রোলার
@ সেন্টসাইজড লোকম্যানেজার; // পরে
- (অকার্যকর) দেখুনডিডলোড {
    [সুপার ভিউডিডলড];
    // ভিউ লোড করার পরে অতিরিক্ত কোনও সেটআপ করুন, সাধারণত একটি নিব থেকে।

    // মাইলোকেশন সার্ভিস * লোকম্যানেজার = [[বিএসএনএল লোকেশনসোভারি বরাদ্দ] init: শূন্য]; // আগে. লোক। প্রতিনিধি কাজ করেন নি কারণ এই পদ্ধতির পরে উদাহরণটি অবৈধ হয়ে গেছে।
    স্ব-> লোকম্যানেজার = [[MyLocationService বরাদ্দ] init: শূন্য]; // পরে
    locManager.startService;
}

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.