سؤال

هذا هو الرمز الذي لدي في فصل AppDelegate الخاص بي

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    CLLocationManager *locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate = self;
    locationManager.distanceFilter = 1000;  // 1 Km
    locationManager.desiredAccuracy = kCLLocationAccuracyKilometer;
    [locationManager startUpdatingLocation];
}

وهذه هي طريقة المندوب التي لدي في فصل AppDelegate الخاص بي

    //This is the delegate method for CoreLocation
- (void)locationManager:(CLLocationManager *)manager
    didUpdateToLocation:(CLLocation *)newLocation
           fromLocation:(CLLocation *)oldLocation
{

        //printf("AppDelegate latitude %+.6f, longitude %+.6f\n", newLocation.coordinate.latitude, newLocation.coordinate.longitude);

}

يعمل في 3.0 ، 3.1 ، 3.1.3 ، ولكنه لا يعمل في 4.0 محاكاة وجهاز كلاهما.

ماهو السبب ؟

هل كانت مفيدة؟

المحلول

كان لدي خطأ مماثل ، ويتم حله الآن. القضية هي إعلان متغير الموقع محليًا. أعلن ذلك بدلاً من ذلك كمتغير فئة وتأكد من الاحتفاظ به مباشرة أو عبر خاصية الاحتفاظ (أو قوي إذا كنت تستخدم ARC). أن يحل المشكلة! تم إصدار المتغير De LocationManager ولم يتم تحديث المندوب أبدًا. هنا الرمز:

.h ملف:

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


@interface MapViewController : UIViewController <MKMapViewDelegate, CLLocationManagerDelegate> {
@private
    MKMapView *_mapView;
    CLLocationManager *_locationManager;
}

@property(nonatomic, strong) CLLocationManager *locationManager;

@end

.M ملف:

self.locationManager = [[CLLocationManager alloc] init];
_locationManager.delegate = self;
_locationManager.desiredAccuracy = kCLLocationAccuracyBest;
[_locationManager startUpdatingLocation];

اتمني ان يكون مفيدا.

نصائح أخرى

يفعل -locationManager:didFailWithError: في المندوب الخاص بك من أي وقت مضى يتم الاتصال؟ أنا فقط أفكر ، ربما حرمت من الوصول إلى بيانات الموقع في مرحلة ما والآن لا تتم مطالبتها ، ولكن يتم رفض الوصول.

كنت مجنونة في محاولة لمعرفة سبب مجرد واحد من عدة فئات تستخدم cllocationManager أي من أساليب CllocationManagerDelegate.

اتضح: تم تهيئة تلك الفئة من خيط غير مين ، لذلك تم إنشاء CllocationManager الخاص به على خيط غير Main ... كان يمكن أن يكون خيطًا مؤقتًا. على أي حال ، كان لف المكالمة لتهيئة صفي مع ما يلي أن كل ما يتطلبه الأمر للحصول على أساليب مفوض CllocationManager الخاصة بي ليتم استدعاؤها.

dispatch_sync(dispatch_get_main_queue(), 
                    ^{
                         // create your class that will create a CLLocationManager here.
                     });

خلاصة القول: لا تنشئ cllocationManager على أي شيء سوى الخيط الرئيسي ، أو لن تحصل أبدًا على أساليب المندوب التي تسمى! كنت أعرف هذا مرة ... لقد كان وقتًا طويلاً ... تنهد. يضيع يوم لمعرفة هذا واحد مرة أخرى! نظرًا لأن كل CllocationManager ، فأنا أقرأ أبداً طرح هذا الأمر ، فأنا أقوم بنشره هنا. أتمنى أن يساعد شخص ما!

هل أنت متأكد من أنك لا تتوصل إلى مدير الموقع في مكان ما؟ يُظهر الكود الذي تبين أنه يتم تخصيصه في طريقة didfinishlaunching ... ولكن بعد ذلك يتم نسيانه (على الرغم من أنه لا يزال يتم الاحتفاظ به ، وبالتالي لا يزال يعمل).

هل ترى حتى هذا المنبثقة الأولية تسألك عما إذا كان من المقبول الحصول على موقع المستخدم؟

ضع الرموز في ViewController "الذي يتم دفعه إلى NavigationController".

الكود الخاص بي هو.

في SomeViewController.H

#import <MapKit/MapKit.h>
@interface SomeViewController : UIViewController<CLLocationManagerDelegate>{
}
@property (nonatomic, strong) CLLocationManager *locationManager;
@end

في SomeViewController.M

#import "SomeViewController.h"

@implementation SomeViewController


-(void)findLocation{
    if ([CLLocationManager locationServicesEnabled]) {
        if (!self.locationManager) {
            self.locationManager = [[CLLocationManager alloc] init];
            self.locationManager.delegate = self;
            self.locationManager.distanceFilter = kCLDistanceFilterNone;
            self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
            [self.locationManager startUpdatingLocation];
        }
    }
}
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{
    NSLog(@"didUpdateLocations");

    CLLocation *lo = [locations objectAtIndex:0];
    NSLog(@"latitude = %f, longitude = %f", lo.coordinate.latitude, lo.coordinate.longitude);

    [manager stopUpdatingHeading];
}
-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{
    NSLog(@"didUpdateToLocation");}
-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{
    NSLog(@"didFailWithError");
    [manager stopUpdatingLocation];
}

المشكلة التي أعتقد أنها بسبب ARC ، يتم إصدار LocationManager.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top