অবস্থান পরিষেবাদি আইওএস 8 এ কাজ করছে না


608

আমার অ্যাপ্লিকেশন যা আইওএস 7 এ দুর্দান্ত কাজ করেছে আইওএস 8 এসডিকে নিয়ে কাজ করে না।

CLLocationManagerকোনও অবস্থান ফিরে আসে না এবং আমি সেটিংস -> অবস্থান পরিষেবাদিগুলির অধীনে আমার অ্যাপ্লিকেশনটি দেখতে পাচ্ছি না । আমি ইস্যুতে গুগল অনুসন্ধান করেছি, কিন্তু কিছুই সামনে আসে নি। ভুল হতে পারে?



19
আমি আইওএস 8-তে লোকেশন ম্যানেজারের কিছু পরিবর্তন সম্পর্কে এখানে পোস্ট করেছি: nevan.net/2014/09/core-location-manager-changes-in-ios-8
নেভান কিং

2
আপনি এই লাইব্রেরি যা কোর অবস্থান APIs সরলীকৃত এবং একটি সুন্দর ব্লক ভিত্তিক ইন্টারফেস অনাবৃত ব্যবহার চেষ্টা করে দেখতে পারেন, এবং বিভিন্ন আইওএস সংস্করণের মধ্যে সমস্ত পার্থক্য normalises (সম্পূর্ণ প্রকাশ: আমি লেখক নই): github.com/lmirosevic/GBLocation
LMS

আমি এখানে কিছু তথ্যসূত্র পেয়েছি datacalculation.blogspot.in/2014/11/…
আইওএস টেস্ট

2
@ নতুন আপনি স্যার! একটি মুকুট প্রয়োজন! পরিবর্তনের পর থেকে আমি এই সমস্যার সাথে লড়াই করে এসেছি এবং কীভাবে এটি ঠিক করতে হবে তার একটি "গাইড" খুঁজে পাইনি, এটি ছিল বন্ধুত্বপূর্ণ বন্ধুত্বপূর্ণ .. আপনার গাইড আমার মতো বোকা বানিয়েছিলেন, সমস্যাটি আমার নিজের মতো করে নিন। এই লিঙ্কটির জন্য আপনাকে অনেক ধন্যবাদ।
প্যাট্রিক আর

উত্তর:


1086

আমি আমার নিজের সমস্যার সমাধান করেছি।

স্পষ্টতই আইওএস 8 এসডিকে, requestAlwaysAuthorization(পটভূমির অবস্থানের জন্য) বা requestWhenInUseAuthorization(অবস্থানের অগ্রভাগের সময় কেবলমাত্র) CLLocationManagerঅবস্থানের আপডেটগুলি শুরু করার আগে কল প্রয়োজন।

প্রম্পটে প্রদর্শিত হওয়ার জন্য একটি বার্তা সহ থাকা NSLocationAlwaysUsageDescriptionবা NSLocationWhenInUseUsageDescriptionকী থাকা Info.plistদরকার। এগুলি যুক্ত করা আমার সমস্যার সমাধান করে।

এখানে চিত্র বর্ণনা লিখুন

আশা করি এটি অন্য কাউকে সাহায্য করবে।

সম্পাদনা: আরও বিস্তৃত তথ্যের জন্য, একবার দেখুন: মূল-অবস্থান-পরিচালক-আইওএস -8-এ পরিবর্তনগুলি


6
আপনি তথ্য.প্লেস্টে আপডেট হওয়া সঠিক ভ্যালুরটি ভাগ করতে পারেন? আমি আমার তথ্য.পিস্টে সেই কীটি দেখতে সক্ষম নই। আমি এটি যুক্ত করেছি এবং এখনও এটি কাজ করে বলে মনে হচ্ছে না। আমি সুইফট, আইওএস 8 এবং এক্সকোড 6 বিটা 4 ব্যবহার করছি
বিজয় কুমার এবি

4
@ বিজয় - আপনাকে একটি সম্পাদকীয়তে তথ্য.পলিট ফাইলটি সম্পাদনা করতে হবে, এক্স কীডে (কী বিটা 6 হিসাবে) কীগুলি সেট করতে পারবেন না।
কেন্ডল হেলস্টেটার জেলনার

11
কেবলমাত্র একটি অনুস্মারক, যদি আপনি ব্যবহারকারীর কাছে কাস্টম ব্যাখ্যা দেখাতে না চান, কেবল এই কীটি খালি স্ট্রিংয়ে সেট করুন।
ননামেলাইভ

7
এটিকে কাজ করতে আপনাকে আপনার লোকেশন ম্যানেজারটি ধরে রাখতে হবে। সুতরাং আপনার সিএলএকশন ম্যানেজারটিকে একটি শক্তিশালী সম্পত্তি হিসাবে তৈরি করুন
ভ্যাসিলি

273
আমি 'ভালবাসি' যে আপনি কোনও ত্রুটি, কোনও সতর্কতা, কোনও লগ বার্তা না পেয়ে আপনি যদি প্লিস্ট এন্ট্রি ছেড়ে দেন তবে কিছুই নয়। মূলত অ্যাপল একটি এপিআই কল তৈরি করেছে যা আপনার কাছে যথাযথ প্লাস্ট এন্ট্রি না থাকলে কিছুই করে না। এটি জানার জন্য @ অর্টউইনজেন্টজকে ধন্যবাদ।
মোবাইলভিট

314

আমি একই সমস্যা নিয়ে আমার চুলগুলি টানছিলাম। এক্সকোড আপনাকে ত্রুটি দেয়:

MapKitঅবস্থান অনুমোদনের জন্য অনুরোধ না করে অবস্থান আপডেটগুলি শুরু করার চেষ্টা করছেন । অবশ্যই ফোন করুন -[CLLocationManager requestWhenInUseAuthorization]বা -[CLLocationManager requestAlwaysAuthorization]প্রথমে।

তবে আপনি উপরের যে কোনও একটি পদ্ধতি বাস্তবায়ন করলেও, তথ্য.প্লেস্টে NSLocationAlwaysUsageDescriptionবা এর জন্য এন্ট্রি না থাকলে এটি ব্যবহারকারীকে প্রম্পট করবে না NSLocationWhenInUseUsageDescription

নিম্নলিখিত তথ্যগুলি আপনার তথ্য.পুলিস্টে যুক্ত করুন যেখানে স্ট্রিংয়ের মানগুলি আপনাকে ব্যবহারকারীর অবস্থান অ্যাক্সেস করার প্রয়োজনীয় কারণে প্রতিনিধিত্ব করে

<key>NSLocationWhenInUseUsageDescription</key>
<string>This application requires location services to work</string>

<key>NSLocationAlwaysUsageDescription</key>
<string>This application requires location services to work</string>

আমি মনে করি Xcode 5 এ এই প্রকল্পটি শুরু করার পর থেকে এই এন্ট্রিগুলি অনুপস্থিত হতে পারে। আমি অনুমান করছি এক্সকোড 6 এই কীগুলির জন্য ডিফল্ট এন্ট্রি যুক্ত করতে পারে তবে নিশ্চিত হয়নি।

আপনি এই দুটি সেটিংস আরো তথ্য পেতে পারেন এখানে


13
এক্সকোড 6 ডিফল্টরূপে এই কীগুলি যুক্ত করে না, আপনি যদি CLLocationManager বাস্তবায়ন করতে চান তবে তাদের অবশ্যই ম্যানুয়ালি যুক্ত করতে হবে
ওয়েসলি স্মিথ

1
আমি নিজেও এগুলি যোগ করতে হয়েছিল, এক্সকোড 6 এ তথ্য.পলিটকের RawValues ​​ভিউয়ের মাধ্যমে যোগ করতে পারিনি!
কেন্ডল হেলস্টেটার জেলনার

1
আমি চিরকাল এর জন্য চেয়েছিলাম আমার [CLLLocationManager অনুমোদনের স্ট্যাটাস] বার্তাটি কেবল <nil> এর মান প্রত্যাবর্তন করছে। উপরের কীগুলি যুক্ত করার পরে এটি বার্তাগুলির আউটপুটটির জন্য সংশ্লিষ্ট গণনাগুলি ফিরিয়ে দেওয়া শুরু করে। আইভি যা পেয়েছিল তা থেকে এটি একটি পরিচিত আইওএস 8 বাগ যা বয়সের জন্য আমার প্রসঙ্গে কিছুই খুঁজে পায় নি। ধন্যবাদ মিল!
MrOli3000

4
আমি আপনার স্ট্রিংয়ের মানটি পছন্দ করি
ক্রিস চেন

1
বার্তাটি সতর্কতার সাব-ম্যাসেজ হিসাবে উপস্থিত হবে যা ব্যবহারকারী তাদের অবস্থান ভাগ করতে চান কিনা তা জিজ্ঞাসা করে। এই হিসাবে, খালি (ফাঁকা) খালি থাকা আমার অ্যাপ্লিকেশনটির সর্বাধিক অর্থ বোধ করে। আপনি কেন অবস্থান ব্যবহার করতে চান তার একটি ব্যাখ্যাও তাৎপর্যযুক্ত হবে। যাইহোক, এনএসলোকেশনওয়েনইন ইউজেজেজ বিবরণ আমার জন্য প্রত্যাশিতভাবে আচরণ করে নি (অর্থাত্ ফেরতের মান সঠিক হলেও সেক্ষেত্রে অনুমতি পেতে অস্বীকার করা অবিরত ছিল)। NSLocationAlwaysUsageDescript ভাল কাজ করেছে।
আর্কেডি বব

104

এটি iOS 7 এর সাথে পিছনে সামঞ্জস্যপূর্ণ তা নিশ্চিত করার জন্য, ব্যবহারকারীটি আইওএস 8 বা আইওএস 7 চালাচ্ছেন কিনা তা আপনার পরীক্ষা করা উচিত উদাহরণস্বরূপ:

#define IS_OS_8_OR_LATER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)

//In ViewDidLoad
if(IS_OS_8_OR_LATER) {
   [self.locationManager requestAlwaysAuthorization];
}

[self.locationManager startUpdatingLocation];

164
সংস্করণ যাচাই করার চেয়ে আরও ভাল উপায় হ'ল বস্তুর সেই নির্বাচক রয়েছে কিনা তা পরীক্ষা করে দেখুন: if ([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) { ...
প্রগ্রেমার

1
এক্সকোড 5 এ নির্মাণের সময় আমি কেবলমাত্র @ প্রোগ্রামার সমাধানটি প্রয়োগ করতে সমস্যা পেয়েছি, যেহেতু এটি requestAlwaysAuthorizationপদ্ধতিটি কী তা জানে না । আমার অতিরিক্ত দ্রবণে এই লাইন ব্যবহার করতে ছিল ifএকটি স্বাভাবিক পদ্ধতি কল পরিবর্তে বিবৃতি: [self.locationManager performSelector:@selector(requestAlwaysAuthorization)];। সম্ভবত এটি অন্য লোকের কাছে সুস্পষ্ট, তবে এটি বের করতে আমার কিছুটা সময় লেগেছে। আমি মনে করি চূড়ান্ত এক্সকোড 6 প্রকাশ না হওয়া পর্যন্ত এটি সঠিক সমাধান।
ভিন্সফায়ার

2
সঠিক সমাধানটি হল এক্সকোড with. দিয়ে তৈরি করা যদি আপনি এক্সকোড ৫ দিয়ে বিল্ডিং করে থাকেন তবে আপনাকে অনুমোদনের জন্য অনুরোধ করার দরকার নেই, এটি স্বয়ংক্রিয়।
অগ্রগতি

আপনার একটি বিষয় হতে পারে। আমার উদ্বেগটি ছিল যে আমি আমার কোডটি Xcode 5 এ সংকলিত করতে চেয়েছিলাম (যদিও এটি আইওএস 8 তে কাজ করবে না যদিও Xcode 6 তে সংকলন করা হয়েছে) আমার দলটি Xcode 6 এ রূপান্তরিত করার সময় তবে সম্ভবত কোডটি লেখার পক্ষে এটি আরও ভাল ওয়ার্কফ্লো এবং আমরা এক্সকোড 6 এ না যাওয়া পর্যন্ত এটিকে মার্জ করবেন না .. ধন্যবাদ।
ভিন্সফায়ার

@VinceFior প্রস্তাবিত পদ্ধতির শর্তসাপেক্ষে SDK এর সংজ্ঞায়িত ম্যাক্রো ব্যবহার কম্পাইল হয় __IPHONE_OS_VERSION_MAX_ALLOWED( #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000)
স্টিভেন Kramer,

50
- (void)startLocationManager
{
    locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate = self;
    locationManager.distanceFilter = kCLDistanceFilterNone; //whenever we move
    locationManager.desiredAccuracy = kCLLocationAccuracyBest;

    [locationManager startUpdatingLocation];
    [locationManager requestWhenInUseAuthorization]; // Add This Line


}

এবং আপনার info.plist ফাইল এখানে চিত্র বর্ণনা লিখুন



2
@ হেম্যাং: অ্যাপল দেব ডকুমেন্টেশন অনুসারে: আপনার অ্যাপ্লিকেশনটির অনুমোদনের স্থিতি নির্ধারণের আগে অবস্থান পরিষেবাগুলি শুরু করা নিরাপদ। যদিও আপনি অবস্থান পরিষেবাগুলি শুরু করতে পারেন, ততক্ষণ সে পরিষেবাগুলি কোনও তথ্য সরবরাহ করে না যতক্ষণ না কেসিএলরাইজেশন স্ট্যাটাস অনুমোদনপ্রাপ্ত অলওয়েজ বা কেসিএলঅরাইজেশন স্ট্যাটাসঅর্টিভাইজডভেনআইএনউজে কোনও পরিবর্তন করে না।
অ্যান্ড্রু

কিছুটা দেরি হলেও আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি আপনার প্লাস্ট ফাইলের অপ্রাসঙ্গিক অংশগুলি বিশেষত ফেসবুক অ্যাপিডের লুকিয়ে রাখুন
প্রেজেমিসউ র্রাজেসিস্কি

ধন্যবাদ তবে মাত্র একটি ডামি নমুনা :)
নিও ডি 1

এটিও গুরুত্বপূর্ণ যে প্রকল্পটি সঠিক তথ্য.পুলিস্টকে নির্দেশ করছে (কীটি এখানে সংজ্ঞায়িত করা হয়েছে)। এটি তথ্য.পালিস্ট ফাইলের আওতায় প্রকল্পের বিল্ড সেটিংসে নির্ধারিত।
পরিষ্কার

30

অ্যাপল ডক্স অনুসারে:

আইওএস 8-র হিসাবে, আপনার অ্যাপ্লিকেশনটির তথ্য.পিস্টলিস্ট ফাইলটিতে একটি NSLocationWhenInUseUsageDescriptionবা কোনও NSLocationAlwaysUsageDescriptionমূল্যের উপস্থিতি প্রয়োজন। এর পরে অবস্থানের আপডেটের জন্য নিবন্ধকরণের আগে, ফোন করে [self.myLocationManager requestWhenInUseAuthorization]বা [self.myLocationManager requestAlwaysAuthorization]আপনার প্রয়োজনের উপর নির্ভর করে ব্যবহারকারীর কাছ থেকে অনুমতি চাওয়ার দরকার পড়ে। আপনি তথ্য.পালিস্টে প্রবেশ করানো স্ট্রিংটি পরবর্তী ডায়ালগটিতে প্রদর্শিত হবে।

যদি ব্যবহারকারী অনুমতি দেয় তবে এটি যথারীতি ব্যবসায়। যদি তারা অনুমতি অস্বীকার করে, তবে প্রতিনিধিটিকে অবস্থানের আপডেট সম্পর্কে অবহিত করা হয় না।



28
- (void)viewDidLoad
{

    [super viewDidLoad];
    self.locationManager = [[CLLocationManager alloc] init];

    self.locationManager.delegate = self;
    if([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]){
        NSUInteger code = [CLLocationManager authorizationStatus];
        if (code == kCLAuthorizationStatusNotDetermined && ([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)] || [self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)])) {
            // choose one request according to your business.
            if([[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSLocationAlwaysUsageDescription"]){
                [self.locationManager requestAlwaysAuthorization];
            } else if([[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSLocationWhenInUseUsageDescription"]) {
                [self.locationManager  requestWhenInUseAuthorization];
            } else {
                NSLog(@"Info.plist does not contain NSLocationAlwaysUsageDescription or NSLocationWhenInUseUsageDescription");
            }
        }
    }
    [self.locationManager startUpdatingLocation];
}

>  #pragma mark - CLLocationManagerDelegate

    - (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
    {
        NSLog(@"didFailWithError: %@", error);
        UIAlertView *errorAlert = [[UIAlertView alloc]
                                   initWithTitle:@"Error" message:@"Failed to Get Your Location" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [errorAlert show];
    }

    - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
    {
        NSLog(@"didUpdateToLocation: %@", newLocation);
        CLLocation *currentLocation = newLocation;

        if (currentLocation != nil) {
            longitudeLabel.text = [NSString stringWithFormat:@"%.8f", currentLocation.coordinate.longitude];
            latitudeLabel.text = [NSString stringWithFormat:@"%.8f", currentLocation.coordinate.latitude];
        }
    }

আইওএস 8-এ আপনার অবস্থানের কাজ করতে দুটি অতিরিক্ত জিনিস করা দরকার: আপনার তথ্য.প্লেস্টে একটি কী যুক্ত করুন এবং লোকেশন ম্যানেজারের কাছ থেকে এটি শুরু করার অনুরোধের জন্য অনুমোদনের জন্য অনুরোধ করুন। নতুন অবস্থান অনুমোদনের জন্য দুটি তথ্য.পল্লিস্ট কী রয়েছে। এই বা উভয় কীগুলির প্রয়োজন। যদি কোনও কী না থাকে তবে আপনি স্টার্টআপডেটিং লোকেশনটি কল করতে পারেন তবে অবস্থান পরিচালকটি আরম্ভ করবেন না won't এটি ডেলিগেটকে একটি ব্যর্থতার বার্তা প্রেরণ করবে না (যেহেতু এটি কখনই শুরু হয়নি, এটি ব্যর্থ হতে পারে না)। আপনি যদি একটি বা উভয় কী যুক্ত করেন তবে স্পষ্টভাবে অনুমোদনের জন্য অনুরোধ করতে ভুলে গেলে এটি ব্যর্থও হবে। সুতরাং আপনাকে প্রথমে যা করতে হবে তা হ'ল নিম্নলিখিত তথ্যগুলির মধ্যে একটি বা আপনার উভয় তথ্য.পল্লিস্ট ফাইল যুক্ত করুন:

  • NSLocationWhenInUseUsageDescription
  • NSLocationAlwaysUsageDescription

এই উভয় কী একটি স্ট্রিং নেয়

যা আপনাকে কেন পরিষেবা পরিষেবা প্রয়োজন তার বিবরণ। আপনি "আপনি কোথায় আছেন তা সন্ধানের জন্য প্রয়োজনীয় অবস্থান" এর মতো একটি স্ট্রিং প্রবেশ করতে পারেন যা আইওএস 7 এর মতো, ইনফোলিস্ট.স্ট্রিংস ফাইলে স্থানীয় করা যেতে পারে।

এখানে চিত্র বর্ণনা লিখুন


19

আমার সমাধান যা এক্সকোড 5 এ সংকলিত হতে পারে:

#ifdef __IPHONE_8_0
    NSUInteger code = [CLLocationManager authorizationStatus];
    if (code == kCLAuthorizationStatusNotDetermined && ([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)] || [self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)])) {
        // choose one request according to your business.
        if([[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSLocationAlwaysUsageDescription"]){
            [self.locationManager requestAlwaysAuthorization];
        } else if([[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSLocationWhenInUseUsageDescription"]) {
            [self.locationManager  requestWhenInUseAuthorization];
        } else {
            NSLog(@"Info.plist does not contain NSLocationAlwaysUsageDescription or NSLocationWhenInUseUsageDescription");
        }
    }
#endif
    [self.locationManager startUpdatingLocation];

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

এক্সকোড 7.২ তেও কাজ করেছেন।
টোটোরো

17

অবস্থান জিজ্ঞাসার জন্য পুরানো কোড আইওএস 8 এ কাজ করবে না 8. আপনি অবস্থান অনুমোদনের জন্য এই পদ্ধতিটি ব্যবহার করতে পারেন:

- (void)requestAlwaysAuthorization
{
    CLAuthorizationStatus status = [CLLocationManager authorizationStatus];

    // If the status is denied or only granted for when in use, display an alert
    if (status == kCLAuthorizationStatusAuthorizedWhenInUse || status ==        kCLAuthorizationStatusDenied) {
        NSString *title;
        title = (status == kCLAuthorizationStatusDenied) ? @"Location services are off" :   @"Background location is not enabled";
        NSString *message = @"To use background location you must turn on 'Always' in the Location Services Settings";

        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:title
                                                            message:message
                                                           delegate:self
                                                  cancelButtonTitle:@"Cancel"
                                                  otherButtonTitles:@"Settings", nil];
        [alertView show];
    }
    // The user has not enabled any location services. Request background authorization.
    else if (status == kCLAuthorizationStatusNotDetermined) {
        [self.locationManager requestAlwaysAuthorization];
    }
}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if (buttonIndex == 1) {
        // Send the user to the Settings for this app
        NSURL *settingsURL = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
        [[UIApplication sharedApplication] openURL:settingsURL];
    }
}

ইউআইএলআর্টভিউ অবহিত করা হয়েছে। পরিবর্তে আপনার ইউআইএলআরএল্টকন্ট্রোলার ব্যবহার করা উচিত।
পাসান প্রেমরত্ন

হ্যাঁ আমি এটির অবহিত জানি তবে এটি কাজ করবে। তবে হ্যাঁ আইওএস 8-এর জন্য আরও ভাল ইউআইএএলআরএল্টকন্ট্রোলার ব্যবহার করুন।
Nits007ak

12

আইওএস 8-এ আপনার অবস্থানের কাজ করতে দুটি অতিরিক্ত জিনিস করা দরকার: আপনার তথ্য.প্লেস্টে একটি কী যুক্ত করুন এবং লোকেশন ম্যানেজারের কাছ থেকে অনুমোদনের জন্য এটি শুরু করার অনুরোধ করুন

info.plist:

<key>NSLocationUsageDescription</key>
<string>I need location</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>I need location</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>I need location</string>

এটি আপনার কোডে যুক্ত করুন

if (IS_OS_8_OR_LATER)
{
    [locationmanager requestWhenInUseAuthorization];

    [locationmanager requestAlwaysAuthorization];
}

1
এটি যদি আপনার সিউডোকোড একটি প্রিপ্রসেসর কল বা একটি নিয়মিত কল হয় তা পরিষ্কার নয়
এল ডুড

1
এটি আপনার কনস্ট্যান্টস h। বা .pch ফাইলে যুক্ত করুন: # নির্ধারণ করা IS_OS_8_OR_LATER ([[ইউআইডি ডিভাইস বর্তমান ডিভাইস]। সিস্টেম ভার্সন ফ্ল্যাটভ্যালু]> = 8.0))
অক্সেনবক্সেন

আপনি উভয়কেই কেন অনুরোধ করবেন, আপনার আবেদনের প্রয়োজনের উপর নির্ভর করে কেবল একটি বা অন্যটি ব্যবহার করার জন্য আপনাকে একটি মন্তব্য যুক্ত করা উচিত
powerj1984

ইউটিটি 3 ডি তে তথ্য.পলিট অংশটি যথেষ্ট সহজ, তবে আমি ইউনিটি 3 ডি ব্যবহার করে কোড অংশটি কীভাবে যুক্ত করব? কোথায় ?
চথুলহুজন

11

সুইফট বিকাশকারীদের জন্য একটি সাধারণ ত্রুটি:

প্রথমে নিশ্চিত হয়ে নিন যে আপনি উভয়ের জন্য প্লাস্টে একটি মান যুক্ত করেছেন NSLocationWhenInUseUsageDescriptionবা NSLocationAlwaysUsageDescription

আপনি যদি এখনও উইন্ডোটি অনুমোদনের জন্য জিজ্ঞাসা করছেন না, আপনি var locationManager = CLLocationManager()নিজের কন্ট্রোলারের viewDidLoadপদ্ধতিতে লাইনটি রাখছেন কিনা তা দেখুন । যদি আপনি তা করেন, তবে আপনি কল করলেও locationManager.requestWhenInUseAuthorization()কিছুই প্রদর্শিত হবে না। এর কারণ ভিউডিডলড কার্যকর করার পরে লোকেশনম্যানেজার ভেরিয়েবলটি ডিলোক্যাট (ক্লিয়ার আউট) হয়ে গেছে।

সমাধানটি var locationManager = CLLocationManager()ক্লাস পদ্ধতির শীর্ষে লাইনটি সনাক্ত করা ।


9

এর আগে [locationManager startUpdatingLocation];, একটি iOS8 অবস্থান পরিষেবাদির অনুরোধ যুক্ত করুন:

if([locationManager respondsToSelector:@selector(requestAlwaysAuthorization)])
    [locationManager requestAlwaysAuthorization];

আপনার অ্যাপ্লিকেশনটির সম্পাদনা করুন Info.plistএবং NSLocationAlwaysUsageDescriptionব্যবহারকারীকে প্রদর্শিত হবে এমন স্ট্রিং মান সহ কী যুক্ত করুন (উদাহরণস্বরূপ, We do our best to preserve your battery life.)

যদি আপনার অ্যাপ্লিকেশনটির কেবল অ্যাপ্লিকেশনটি খোলা থাকার সময় লোকেশন পরিষেবাদির প্রয়োজন হয় তবে প্রতিস্থাপন করুন:

requestAlwaysAuthorizationসাথে requestWhenInUseAuthorizationএবং

NSLocationAlwaysUsageDescriptionসঙ্গে NSLocationWhenInUseUsageDescription


9

আমি এমন একটি অ্যাপে কাজ করছি যা আইওএস 8 এ উন্নীত হয়েছিল এবং অবস্থান পরিষেবাগুলি কাজ বন্ধ করে দিয়েছে। আপনি সম্ভবত এর মতো ডিবাগ অঞ্চলে ত্রুটি পাবেন:

Trying to start MapKit location updates without prompting for location authorization. Must call -[CLLocationManager requestWhenInUseAuthorization] or -[CLLocationManager requestAlwaysAuthorization] first.

আমি অন্তত অন্তর্নিহিত পদ্ধতিটি করেছি। প্রথমে NSLocationAlwaysUsageDescriptionআপনার তথ্য.পলিতে প্রবেশ করুন :

এখানে চিত্র বিবরণ লিখুন

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

পরবর্তী আমি আইওএস 8 এর জন্য একটি শর্তসাপেক্ষ তৈরি করেছি:

if ([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
    [_locationManager requestAlwaysAuthorization];
}

এর পরে locationManager:didChangeAuthorizationStatus:পদ্ধতিটি কল করা হয়:

- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:  (CLAuthorizationStatus)status
{
    [self gotoCurrenLocation];
}

এবং এখন সবকিছু ঠিকঠাক কাজ করে। সর্বদা হিসাবে, ডকুমেন্টেশন চেক আউট ।


7

পিছনের সামঞ্জস্যের সাথে সমাধান:

SEL requestSelector = NSSelectorFromString(@"requestWhenInUseAuthorization");
if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined &&
    [self.locationManager respondsToSelector:requestSelector]) {
    [self.locationManager performSelector:requestSelector withObject:NULL];
} else {
    [self.locationManager startUpdatingLocation];
}

আপনার তথ্য.পিস্টে NSLocationWhenInUseUsageDescript কী সেটআপ করুন


2
এটি সঠিক নয়, কেসিএলঅরাইজেশন স্ট্যাটাসডিনিড কেসের কী হবে? এটি অন্যটিতে যায় এবং লোকেশন আপডেট করা শুরু করে যা সঠিক নয়!
ইলেক্ট্রনিক্স

@ বেনমার্টেন আমার মনে হয় না এটির বিষয়টি বিবেচিত হওয়া উচিত। আপনার নিজের সাথে এটি পরিচালনা করা উচিত locationManager: (CLLocationManager *)manager didFailWithError: (NSError *)error। তবে, তিনি যদি বিবৃতিতে স্টার্টআপডেটিং অবস্থান যুক্ত করতে ভুলে যান তবে তারা এটিকে গ্রহণ বা অস্বীকার করার পরে, এটি আসলে স্টার্টআপডেট লোকেশন বলে না।
ক্রিস

6

পিছনের সামঞ্জস্যের সাথে সমাধান যা এক্সকোড সতর্কতা তৈরি করে না:

SEL requestSelector = NSSelectorFromString(@"requestWhenInUseAuthorization");
if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined &&
  [self.locationManager respondsToSelector:requestSelector]) {
((void (*)(id, SEL))[self.locationManager methodForSelector:requestSelector])(self.locationManager, requestSelector);
  [self.locationManager startUpdatingLocation];
} else {
  [self.locationManager startUpdatingLocation];
}

আপনার সেটআপ NSLocationWhenInUseUsageDescriptionকী Info.plist

আইওএস সংস্করণ 11.0+ এর জন্য : NSLocationAlwaysAndWhenInUseUsageDescriptionআপনার মধ্যে সেটআপ কী Info.plist। অন্যান্য 2 কী সহ।


এটি সঠিক নয়, কেসিএলঅরাইজেশন স্ট্যাটাসডিনিড কেসের কী হবে? এটি অন্যটিতে যায় এবং লোকেশন আপডেট করা শুরু করে যা সঠিক নয়!
ইলেক্ট্রনিক্স

এটি বেশ আশ্চর্যজনক, এটি উভয়কে অনুমতি দেওয়া এবং না দেওয়ার সাথে পুরোপুরি সূক্ষ্ম নয় আমার পক্ষে এটি কাজ করে। জ্যাকব সমাধানটি সঠিক দেখায় তবে আমার পক্ষে কাজ করে না। আজব কিন্তু কাজ !!!
জোশ

অনুরোধের ঠিক পরে [স্ব.লোকেশনম্যানেজার স্টার্টআপডেটিং লোকেশন] কল করাও যখনইনউসঅর অনুমোদনের কোনও অর্থ নেই
কোস্টিয়া কিম

5

এটি আইওএস 8 এর সাথে ইস্যু হয় এটি আপনার কোডে যুক্ত করুন

if (IS_OS_8_OR_LATER)
{
    [locationmanager requestWhenInUseAuthorization];

    [locationmanager requestAlwaysAuthorization];
}

এবং info.plist- তে

 <key>NSLocationUsageDescription</key>
 <string>I need location</string>
 <key>NSLocationAlwaysUsageDescription</key>
 <string>I need location</string>
 <key>NSLocationWhenInUseUsageDescription</key>
 <string>I need location</string>

NSLocationUsageDescriptionআইওএস 8 +
কার্লোস রিকার্ডো

4

আইওএস 8 এ ব্যবহারকারীর অবস্থান অ্যাক্সেস করতে আপনাকে যুক্ত করতে হবে,

NSLocationAlwaysUsageDescription in the Info.plist 

এটি ব্যবহারকারীর কাছে তাদের বর্তমান অবস্থানটি পেতে অনুমতি চাইবে।


4

উদ্দেশ্য-সি পদ্ধতি নীচের নির্দেশাবলী অনুসরণ করুন:

আইওএস -11 এর জন্য আইওএস 11 এর উত্তরটি একবার দেখুন:আইওএস 11 অবস্থানের অ্যাক্সেস

প্লাস্টে দুটি কী যুক্ত করতে হবে এবং নীচের চিত্রের মতো বার্তা সরবরাহ করতে হবে:

 1. NSLocationAlwaysAndWhenInUseUsageDescription 
 2. NSLocationWhenInUseUsageDescription
 3. NSLocationAlwaysUsageDescription

এখানে চিত্র বর্ণনা লিখুন আইওএস -10 এবং নীচের জন্য:

NSLocationWhenInUseUsageDescription

এখানে চিত্র বর্ণনা লিখুন

locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers;
if([locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]){
    [locationManager requestWhenInUseAuthorization];
}else{
    [locationManager startUpdatingLocation];
} 

প্রতিনিধি পদ্ধতি

#pragma mark - Lolcation Update 
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
    NSLog(@"didFailWithError: %@", error);
    UIAlertView *errorAlert = [[UIAlertView alloc]
                               initWithTitle:@"Error" message:@"Failed to Get Your Location" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [errorAlert show];
}
-(void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
{
    switch (status) {
        case kCLAuthorizationStatusNotDetermined:
        case kCLAuthorizationStatusRestricted:
        case kCLAuthorizationStatusDenied:
        {
            // do some error handling
        }
            break;
        default:{
            [locationManager startUpdatingLocation];
        }
            break;
    }
}
- (void)locationManager:(CLLocationManager *)manager
     didUpdateLocations:(NSArray *)locations
{
    CLLocation *location = [locations lastObject];
    userLatitude =  [NSString stringWithFormat:@"%f", location.coordinate.latitude] ;
    userLongitude =  [NSString stringWithFormat:@"%f",location.coordinate.longitude];
    [locationManager stopUpdatingLocation];
}

সুইফ্ট পদ্ধতি

নীচের নির্দেশাবলী অনুসরণ করুন:

আইওএস -11 এর জন্য আইওএস 11 এর উত্তরটি দেখুন: আইওএস 11 অবস্থানের অ্যাক্সেস

প্লাস্টে দুটি কী যুক্ত করতে হবে এবং নীচের চিত্রের মতো বার্তা সরবরাহ করতে হবে:

 1. NSLocationAlwaysAndWhenInUseUsageDescription 
 2. NSLocationWhenInUseUsageDescription
 3. NSLocationAlwaysUsageDescription

এখানে চিত্র বর্ণনা লিখুন আইওএস -10 এবং নীচের জন্য:

এখানে চিত্র বর্ণনা লিখুন

import CoreLocation
class ViewController: UIViewController ,CLLocationManagerDelegate {
var locationManager = CLLocationManager()

//MARK- Update Location 
func updateMyLocation(){
    locationManager.delegate = self;
    locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers;
    if locationManager.respondsToSelector(#selector(CLLocationManager.requestWhenInUseAuthorization)){
       locationManager.requestWhenInUseAuthorization()
    }
    else{
        locationManager.startUpdatingLocation()
    }
}

প্রতিনিধি পদ্ধতি

//MARK: Location Update
func locationManager(manager: CLLocationManager, didFailWithError error: NSError) {
    NSLog("Error to update location :%@",error)
}
func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
    switch status {
    case .NotDetermined: break
    case .Restricted: break
    case .Denied:
            NSLog("do some error handling")
        break
    default:
        locationManager.startUpdatingLocation()
    }
}
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
     let location = locations.last! as CLLocation
    var latitude = location.coordinate.latitude
    var longitude = location.coordinate.longitude

}

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

আপনার বার্তাটি তথ্যপূর্ণ হওয়া উচিত অন্যথায় অ্যাপল পুনর্বিবেচনার সময় অ্যাপ্লিকেশনটিকে প্রত্যাখ্যান করবে।
অলোক

3

জামারিন ব্যবহারকারীদের জন্য , আমি NSLocationWhenInUseUsageDescriptionনিজেই তথ্য.প্লেস্টে কীটি যুক্ত করতে হয়েছিল যেহেতু এটি জ্যামারিন 5.5.3 বিল্ড 6 বা এক্সকোড 6.1 এর কোনওটিতেই ড্রপডাউনগুলিতে উপলভ্য ছিল না - কেবলমাত্র NSLocationUsageDescriptionতালিকায় ছিল, এবং এটি কারণ CLLocationManagerঅবিরত রাখতে পেরেছিল চুপচাপ ব্যর্থ।


2
        // ** Don't forget to add NSLocationWhenInUseUsageDescription in MyApp-Info.plist and give it a string

        self.locationManager = [[CLLocationManager alloc] init];
        self.locationManager.delegate = self;
        // Check for iOS 8. Without this guard the code will crash with "unknown selector" on iOS 7.
        if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
            [self.locationManager requestWhenInUseAuthorization];
        }
        [self.locationManager startUpdatingLocation];


    // Location Manager Delegate Methods    
    - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
    {
        NSLog(@"%@", [locations lastObject]);

}

2

আপনার সকলের জন্য একাধিক তথ্য.পল্লিস্ট ফাইল রয়েছে এমন একটি ছোট সহায়ক ...

find . -name Info.plist | xargs -I {} /usr/libexec/PlistBuddy -c 'Add NSLocationWhenInUseUsageDescription string' {} 

এটি বর্তমান ডিরেক্টরি (এবং সাবফোল্ডার) এর সমস্ত তথ্য.প্লেস্ট ফাইলগুলিতে প্রয়োজনীয় ট্যাগ যুক্ত করবে।

আরেকটি হ'ল:

find . -name Info.plist | xargs -I {} /usr/libexec/PlistBuddy -c 'Set NSLocationWhenInUseUsageDescription $YOURDESCRIPTION' {} 

এটি আপনার বিবরণটি সমস্ত ফাইলে যুক্ত করবে।



2

আমি আইওএস 9 তে একই ধরণের ত্রুটি পেয়েছি (এক্সকোড 7 এবং সুইফট 2 এর সাথে কাজ করা): অবস্থান অনুমোদনের অনুরোধ না করে মানচিত্রের অবস্থান আপডেটগুলি শুরু করার চেষ্টা করছি। অবশ্যই কল করতে হবে - [CLLocationManager অনুরোধWhenInUseAuthorization] বা - - [প্রথমে CLLocationManager অনুরোধ ALwaysAuthorization]। আমি একটি টিউটোরিয়াল অনুসরণ করছিলাম তবে টিউটরটি iOS8 এবং সুইফট 1.2 ব্যবহার করছিল। এক্সকোড 7 এবং সুইফট 2-তে কিছু পরিবর্তন রয়েছে, আমি এই কোডটি পেয়েছি এবং এটি আমার পক্ষে ভাল কাজ করে (যদি কারও সাহায্যের প্রয়োজন হয়):

import UIKit
import MapKit
import CoreLocation

class MapViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate {

    // MARK: Properties
    @IBOutlet weak var mapView: MKMapView!

    let locationManager = CLLocationManager()

    override func viewDidLoad() {
        super.viewDidLoad()

        self.locationManager.delegate = self
        self.locationManager.desiredAccuracy = kCLLocationAccuracyBest
        self.locationManager.requestWhenInUseAuthorization()
        self.locationManager.startUpdatingLocation()
        self.mapView.showsUserLocation = true

    }

    // MARK: - Location Delegate Methods

    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        let location = locations.last
        let center = CLLocationCoordinate2D(latitude: location!.coordinate.latitude, longitude: location!.coordinate.longitude)
        let region = MKCoordinateRegion(center: center, span: MKCoordinateSpan(latitudeDelta: 1, longitudeDelta: 1))
        self.mapView.setRegion(region, animated: true)
    }

    func locationManager(manager: CLLocationManager, didFailWithError error: NSError) {
        print("Errors: " + error.localizedDescription)
    }
}

পরিশেষে, আমি এটিকে তথ্য.পুলিস্টে রেখেছি: তথ্য সম্পত্তি তালিকা: এনএসলোকেশনওয়েনইন ইউসেজ ব্যবহারের বিবরণ মূল্য: অ্যাপ্লিকেশনটির কর্মীদের জন্য লোকেশন সার্ভারের প্রয়োজন


2

আইওএসে ব্যবহারকারীদের অবস্থান অ্যাক্সেস করার জন্য। আপনাকে দুটি কী যুক্ত করতে হবে

NSLocationWhenInUseUsageDescription

NSLocationAlwaysUsageDescription

তথ্য.প্লেস্ট ফাইলের মধ্যে।

    <key>NSLocationWhenInUseUsageDescription</key>
    <string>Because I want to know where you are!</string>
    <key>NSLocationAlwaysUsageDescription</key>
    <string>Want to know where you are!</string>

এটি নীচের চিত্রটি দেখুন।

তথ্য.পলিট চিত্র


1
  1. প্রতিটি লক্ষ্য থেকে প্রতিটিটিতে জিপিএস ব্যবহার করতে বলার স্ট্রিং সহ কী NSLocationWhenInUseUsageDescriptionবা NSLocationAlwaysUsageDescription(পটভূমি জিপিএস ব্যবহার) যুক্ত করুন info.plist

  2. চালিয়ে অনুমতি চাই:

    [স্ব-উদ্যোগের অবস্থান ম্যানেজার: লোকেশন ম্যানেজার];

কোথায় initLocationManager:

// asks for GPS authorization on iOS 8
-(void) initLocationManager:(CLLocationManager *) locationManager{

    locationManager = [[CLLocationManager alloc]init];

    if([locationManager respondsToSelector:@selector(requestAlwaysAuthorization)])
        [locationManager requestAlwaysAuthorization];
}

মনে রাখবেন যে info.plistপ্রতিটি টার্গেটের জন্য কীগুলি যদি প্রতিটিটিতে না থাকে তবে অ্যাপ্লিকেশনটি ব্যবহারকারীকে জিজ্ঞাসা করবে না। ifআইওএস 7 সাথে সামঞ্জস্যের উপলব্ধ করা হয় এবং respondsToSelector:পদ্ধতি মাত্র আইওএস 7 এবং 8 এর জন্য সমস্যা সমাধানে বদলে ভবিষ্যতে সামঞ্জস্য নিশ্চয়তা।


0

আমার জন্য সমস্যা ছিল যে ক্লাসটি ছিল CLLocationManagerDelegateসেটি ব্যক্তিগত ছিল, যা প্রতিনিধিদের সমস্ত পদ্ধতি আহ্বান করা থেকে বিরত ছিল। অনুমান করুন এটি খুব সাধারণ পরিস্থিতি নয় তবে ভেবেছিলাম যে টি যদি কাউকে সহায়তা করে তবে আমি এটি উল্লেখ করব।


0

আমি আইওএস 8.4, আইপ্যাড মিনি 2InfoPlist.strings তে এই কীগুলি যুক্ত করব It এটিও কার্যকর। আমি আমার মধ্যে কোনও কী রাখি না ।NSLocationWhenInUseUsageDescriptionInfo.plist


তথ্য তালিকাভুক্ত.স্ট্রিংস :

"NSLocationWhenInUseUsageDescription" = "I need GPS information....";

এই থ্রেডের ভিত্তিতে , এটি বলেছিল, as in iOS 7ইনফোলিস্ট.স্ট্রিংগুলিতে স্থানীয় করা যেতে পারে। আমার পরীক্ষায়, এই কীগুলি সরাসরি ফাইলে কনফিগার করা যায় InfoPlist.strings

সুতরাং আপনাকে প্রথমে যে কাজটি করতে হবে তা হ'ল নিম্নলিখিত তথ্যগুলির মধ্যে একটি বা উভয়কে আপনার তথ্য.প্লেস্ট ফাইলটিতে যুক্ত করা:

  • NSLocationWhenInUseUsageDescription
  • NSLocationAlwaysUsageDescription

এই দু'টি কীই একটি স্ট্রিং নেয় যা আপনার অবস্থান পরিষেবার কেন প্রয়োজন তার একটি বিবরণ। আপনি "আপনি কোথায় আছেন তা সন্ধানের জন্য প্রয়োজনীয় অবস্থান" এর মতো একটি স্ট্রিং প্রবেশ করতে পারেন যা আইওএস 7 এর মতো , ইনফোলিস্ট.স্ট্রিংস ফাইলে স্থানীয় করা যেতে পারে।


হালনাগাদ:

আমি মনে করি @IOSএর পদ্ধতি আরও ভাল। Info.plistখালি মান সহ কী যুক্ত করুন এবং এতে স্থানীয়করণযুক্ত স্ট্রিং যুক্ত করুন InfoPlist.strings

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