2014-09-20 8 views
12

यह मेरा कोड है, दोनों सतर्क और नक्शे पर वर्तमान स्थिति के लिए नीले डॉट दिखा:- [CLLocationManager requestWhenInUseAuthorization] या - [CLLocationManager requestAlwaysAuthorization] त्रुटि

MapName.h

#import <UIKit/UIKit.h> 
#import <MapKit/MapKit.h> 
#import <CoreLocation/CoreLocation.h> 


@interface MapName : UIViewController <MKMapViewDelegate, CLLocationManagerDelegate> 

@property (strong, nonatomic) IBOutlet MKMapView *MapName; 
@property (strong, nonatomic) CLLocationManager *locationManager; 

@end 

MapName.m

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 

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

//Center the map 
[self gotoLocation]; 

//Show current position 
_MapName.showsUserLocation = YES; 

} 

मैं कुंजीजोड़ दिया हैInfo.plist के लिए एक स्ट्रिंग के रूप में। मुझे अभी भी एक्सकोड पर एक ही त्रुटि मिल रही है।

+0

कृपया आप क्या देख रहे हैं के रूप में अधिक विशिष्ट, और यह आपके द्वारा होने वाली अपेक्षा से अलग कैसे होता है। आप किस त्रुटि का सामना कर रहे हैं? –

+0

आईफोन 5 एस पर सब कुछ ठीक काम कर रहा है: जब मैं ऐप खोलता हूं तो मुझे अपने स्थान तक पहुंच की अनुमति देने के लिए अलर्ट मिलता है और जब मैं पहुंच प्रदान करता हूं तो मुझे वास्तविक स्थिति (नीली बिंदु) मिलती है। लेकिन जैसा कि मैं अनुमति बटन दबाता हूं, मुझे संदेश मिलता है "स्थान प्राधिकरण के लिए संकेत दिए बिना मैपकिट स्थान अपडेट शुरू करने का प्रयास करना। कॉल करना चाहिए - [CLLocationManager requestWhenInUseAuthorization] या - [CLLocationManager requestAlwaysAuthorization] पहले।" एक्सकोड 6 पर। और यदि मैं एक्सकोड सिम्युलेटर का उपयोग करता हूं तो मुझे नीली बिंदु नहीं मिलती है, भले ही नकली स्थिति सही ढंग से चुनी गई हो। – Max1980

उत्तर

15

यह दोनों की वजह से है:

[self.locationManager startUpdatingLocation]; 

और

_MapName.showsUserLocation = YES; 

यदि उपयोगकर्ता की अनुमति दी है इससे पहले कि आप इन फोन की जांच करने की जरूरत है। यह भी सुनिश्चित करें कि आपने स्टोरीबोर्ड पर MKMapKit में उपयोगकर्ता स्थान बंद कर दिया है (इसने मुझे ट्रैक करने के लिए दिन लग गए)।

की तरह कुछ कार्य करें: आप लांच पर उपयोगकर्ता की अनुमति के लिए पूछने के बाद से है कि अनुशंसित नहीं है नहीं चाहते हो सकता है

CLAuthorizationStatus authorizationStatus= [CLLocationManager authorizationStatus]; 

if (authorizationStatus == kCLAuthorizationStatusAuthorized || 
    authorizationStatus == kCLAuthorizationStatusAuthorizedAlways || 
    authorizationStatus == kCLAuthorizationStatusAuthorizedWhenInUse) { 

    [self.locationManager startUpdatingLocation];  
    _MapName.showsUserLocation = YES;   

} 

अपने अनुप्रयोग पर निर्भर करता है।

+0

थेंक्स जेरोम !! मैं इसे अभी कोशिश करूँगा! मैंने देखा है कि अन्य ऐप्स लॉच (उदाहरण के लिए स्काईस्कैनर) पर अनुमति मांग रहे हैं, इसलिए, मेरे ऐप में 10 अलग-अलग मानचित्र होते हैं, हो सकता है कि शुरुआत में केवल एक बार पूछना बेहतर हो। मेरा आईपैड संस्करण अभी वितरण के लिए रखा गया है, इसलिए मुझे लगता है कि ऐप्पल के साथ कोई समस्या नहीं है। मुझे खेद है कि स्टोरीबोर्ड उपयोगकर्ता स्थान विकल्प को समझने में आपको दिन लग गए (मुझे कहना चाहिए था कि मैंने इसका इस्तेमाल किया है)। इसलिए मैं वास्तव में आपके प्रयास की सराहना करता हूं !! Thanx बहुत – Max1980

+0

@ मैक्स 1 9 80 हाँ निश्चित रूप से आप लॉन्च पर अनुमति मांग सकते हैं और अपने ऐप के आधार पर आप चाह सकते हैं। मुझे पता है कि मेरे ऐप के बाद से, पिनपॉइंट - एक साथ रहें, भले ही आप अलग हों !, एक साइन अप प्रक्रिया है, हमने उपयोगकर्ता रूपांतरण दर (फ्लोरी के माध्यम से) में बड़ी वृद्धि देखी है जब हमने ऐप के उचित हिस्सों तक अनुमति पहुंच को स्थानांतरित किया । उदाहरण के लिए, जब उपयोगकर्ता मानचित्र पर होता है, तो जब उपयोगकर्ता मित्र को जोड़ने के लिए पता करता है तो पता पुस्तिका अनुमति के लिए हम स्थान अनुमति मांगते हैं। ऐप्पल आपको एक तरफ या किसी अन्य को अस्वीकार नहीं करेगा। –

+0

अपने जैसे कम अनुभवी आईओएस डेवलपर्स के लिए इसे लागू करने के बारे में अधिक जानकारी के लिए, यह आलेख बेहद सहायक था। http://nevan.net/2014/09/core-location-manager-changes-in-ios-8/ –

1

जानकारी फ़ाइल में कीवर्ड है (के बजाय "है" "में"):

NSLocationWhenInUseUsageDescription 
+0

क्षमा करें, गलती टाइप करें। यह वास्तव में इसके बजाय है। आईफोन 5 एस पर ठीक काम करना, लेकिन त्रुटि प्राप्त करना और Xcode6 – Max1980

+0

पर वर्तमान स्थान नहीं दिखाना डीबग करें और देखें कि आपने कभी भी ब्लॉक में प्रवेश किया है या नहीं। आप आईओएस 8 एसडीके का उपयोग कर रहे हैं? –

+0

मैं आईओएस 8 एसडीके का उपयोग कर रहा हूं वास्तव में @ पीटरपीईगुओ – Max1980

4

त्रुटि संदेश बहुत शाब्दिक है। [self.locationManager startUpdatingLocation] पर कॉल न करें जब तक आपके पास प्राधिकरण न हो। आपके [self.locationManager requestWhenInUseAuthorization], दस्तावेज़ों के अनुसार, असीमित है।

जब वर्तमान प्राधिकरण स्थिति kCLAuthorizationStatusNotDetermined है, तो यह विधि असीमित रूप से चलती है और उपयोगकर्ता को स्थान सेवाओं का उपयोग करने के लिए ऐप को अनुमति देने के लिए संकेत देती है।

इसका मतलब है कि आप दोनों ही पहुंच के लिए संकेत दे रहे हैं और साथ ही साथ स्कैन भी शुरू कर रहे हैं।

इसके बजाय, -[CLLocationManagerDelegate locationManager:didChangeAuthorizationStatus:] को लागू करने का प्रयास करें और यह निर्धारित करने के बाद वहां स्कैन शुरू करें कि आपके पास प्राधिकरण है।

+0

उत्तर @incanus के लिए Thanx। कहां कार्यान्वित किया जाना चाहिए - [CLLocationManagerDelegate स्थान प्रबंधक: didChangeAuthorizationStatus:] tho? मैं अभी भी गलत कर रहा हूं मुझे लगता है कि – Max1980

+0

मैंने सबकुछ प्रतिनिधि फ़ाइलों में डाल दिया है और अब यह एक्सकोड 6 पर किसी भी त्रुटि के बिना काम कर रहा है, जैसा कि उत्तर उदाहरण में है। जब मैं अपने ऐप में एक यादृच्छिक मानचित्र खोलता हूं तो यह केवल तभी काम नहीं कर सकता है: जब मैं पहली बार ऐप खोलता हूं तो अलर्ट सही दिखाता है। क्या यह एकमात्र संभव तरीका है? – Max1980

+0

मुझे यह चेतावनी मिली है, भले ही मैं * प्रतीक्षा कर रहा था जब तक उपयोगकर्ता ने सेटिंग ऐप अलर्ट में अनुमति नहीं दी थी; कुंजी जेरोम मिआस्टकोव्स्की (उपरोक्त) राज्यों के रूप में थी: स्टोरीबोर्ड/xib फ़ाइल में आपको एक्सकोड के गुण इंस्पेक्टर में मानचित्र दृश्य के लिए "[_] उपयोगकर्ता स्थान" चेकबॉक्स को साफ़ करना होगा (दाईं ओर एक्सकोड के उपयोगिता पैनल में चौथा फलक) । इसे डिफ़ॉल्ट रूप से साफ़ किया गया है, लेकिन मैंने कोड में इस ध्वज को सेट करने के बजाय इसे चेक किया था (self.mapView.showsUserLocation = YES;)। ऐसा लगता है कि आईओएस 8 के लिए गलत विकल्प स्पष्ट होने की जरूरत है * जब तक आपको पहुंच प्रदान नहीं की जाती है। – SteveCaine

0

इस तरह Xcode6 पर त्रुटियों के बिना काम कर रहा है:

AppDelegate.h

#import <UIKit/UIKit.h> 
#import <CoreLocation/CoreLocation.h> 

@interface AppDelegate : UIResponder <UIApplicationDelegate> 
@property (strong, nonatomic) CLLocationManager *locationManager; 
@property (strong, nonatomic) UIWindow *window; 

@end 

AppDelegate.m

#import "AppDelegate.h" 

@implementation AppDelegate 

@synthesize locationManager = _locationManager; 


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary  *)launchOptions 
{ 
//Current position 
    self.locationManager = [[CLLocationManager alloc] init]; 
    [self.locationManager requestWhenInUseAuthorization]; 

return YES; 
} 
@end 

आपके द्वारा ऐप्स खोलने चेतावनी संदेश से पता चलता पहली बार

0

जेरोम की प्रतिक्रिया के आधार पर, मैंने उस उत्तर का अनुवाद किया जो मेरे लिए स्विफ्ट करने के लिए काम करता था।

let authorizationStatus = CLLocationManager.authorizationStatus() 

    if(authorizationStatus == .AuthorizedWhenInUse || authorizationStatus == .AuthorizedAlways) { 
      self.findMyLocation() 
    } 

नोट: मैं क्या दस्तावेजों में पढ़ा से, वहाँ कोई kCLAuthorizationStatusAuthorized स्विफ्ट में बराबर है।

3

तेजी पर:

let locationManager: CLLocationManager = CLLocationManager() 
    let authorizationStatus = CLLocationManager.authorizationStatus() 


    override func viewDidLoad() { 
    super.viewDidLoad() 
    if(authorizationStatus == .AuthorizedWhenInUse || authorizationStatus == .AuthorizedAlways) { 
     locationManager.startUpdatingLocation() 
    } 
    else 
    { 
     locationManager.requestWhenInUseAuthorization() 
    } 
    locationManager.delegate = self 
    locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters 

} 

Info.plist फ़ाइल इन कुंजियों में जोड़ने के लिए मत भूलना:

enter image description here

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