3

デバイスの位置を追跡するためにを使用iOS 6.1 iPhone appするARC有効化された状態で作業しています。CLLocationManager

アップデート

DestinationViewController実装するがありCLLocationManagerDelegateます。を作成CLLocationManagerし、セットアップを行います。プロジェクトにをインポートしCoreLocation frameworkました。

多くのデバッグを試みましたが、CLLocationManagerが作成され、エラーがないことがわかります。しかし、問題は、[CLLocationManager authorizationStatus]kCLAuthorizationStatusNotDetermined[self.locationManager startUpdatingLocation];の両方にあるということです。したがって、このアプリの位置情報サービスを使用する許可を求めるプロンプトは表示されません。そのため、このメソッドは実行されません。

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:  
(NSArray *)locations

私はまた、同様の例を探すために何時間もWebを検索しようとしましたが、運がありませんでした。DestinationViewControllerからのコードは以下に掲載されています。

インターフェース

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

@interface DestinationViewController : UIViewController <CLLocationManagerDelegate>

実装

#import "DestinationViewController.h"

@interface DestinationViewController ()
@property (strong, nonatomic) CLLocationManager *locationManager;
@end


@implementation DestinationViewController

// Initializer
- (CLLocationManager *)locationManager
{
    if (!_locationManager) {
        _locationManager = [[CLLocationManager alloc] init];
    }
    return _locationManager;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    [self startLocation];
}


- (void)startLocation
{
    self.locationManager.delegate = self;
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    self.locationManager.distanceFilter = 1;

    NSString *error;
    if (![CLLocationManager locationServicesEnabled]) {
        error = @"Error message";
    }

    CLAuthorizationStatus status = [CLLocationManager authorizationStatus];
    if (status == kCLAuthorizationStatusRestricted ||
        status == kCLAuthorizationStatusDenied ||) {
        error = @"Error message";
    }

    if (error) {
        NSLog(error);
    }
    else
    {

        status = [CLLocationManager authorizationStatus];

    self.locationManager.pausesLocationUpdatesAutomatically = NO;

        [self.locationManager startUpdatingLocation];

        status = [CLLocationManager authorizationStatus];

        NSLog(@"CLLocationManager is %@", self.locationManager);
        NSLog(@"Location is %@", self.locationManager.location);

        [self updateUI];
    }
}


- (void)locationManager:(CLLocationManager *)manager
     didUpdateLocations:(NSArray *)locations
{
    CLLocation *recentLocation = [locations lastObject];
    NSLog(@"Found location");
}

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
    NSLog(@"didFailWithError");
}

- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
{
    NSLog(@"Change in authorization status");
}
4

2 に答える 2

7

コードは機能するはずです。

アプリケーションが位置情報サービスの使用を許可されていることを確認してください。

次の方法を使用して、コードで認証ステータスを確認できます

 + (CLAuthorizationStatus)authorizationStatus

編集

kCLAuthorizationStatusNotDeterminedは、ロケーションサービスが無効になっていることが原因である可能性があります。最初にロケーションサービスのステータスを確認する必要があります。コードは次のようになります

if([CLLocationManager locationServicesEnabled]) {
    // Location Services Are Enabled
    switch([CLLocationManager authorizationStatus]) {
        case kCLAuthorizationStatusNotDetermined:
            // User has not yet made a choice with regards to this application
            break;
        case kCLAuthorizationStatusRestricted:
            // This application is not authorized to use location services.  Due
            // to active restrictions on location services, the user cannot change
            // this status, and may not have personally denied authorization
            break;
        case kCLAuthorizationStatusDenied:
            // User has explicitly denied authorization for this application, or
            // location services are disabled in Settings
            break;
        case kCLAuthorizationStatusAuthorized:
            // User has authorized this application to use location services
            break;
    }
} else {
    // Location Services Disabled
}
于 2013-03-27T11:03:35.583 に答える
-14

やっと解決しました!代理人が正しく設定されていませんでした。行う代わりに:

self.locationManager.delegate = self;

私はそれを次のように変更しました:

[self.locationManager setDelegate:self];

そして今、私のデリゲートメソッドが解雇されます。

助けてくれた人たちに感謝します!

于 2013-03-28T16:29:23.883 に答える