您如何在没有用户共享/授予权限的情况下使用核心位置?

Posted

技术标签:

【中文标题】您如何在没有用户共享/授予权限的情况下使用核心位置?【英文标题】:How do you use Core Location without User sharing/granting permission? 【发布时间】:2012-11-20 07:06:16 【问题描述】:

我已经在我的应用中实现了核心位置。

当用户允许在应用启动时共享位置时,一切都会完美运行。 但是当用户不分享他的位置时,“南大西洋”会显示在应用程序的位置字段中。

应该做些什么来避免这种情况以及当用户不分享他的位置时应该显示什么。

我正在使用此代码获取位置:

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

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];

    [self.window makeKeyAndVisible];


    locationManager = [[CLLocationManager alloc] init];
    locationManager.distanceFilter = kCLDistanceFilterNone; // whenever we move
    locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    [locationManager startUpdatingLocation];

    CLGeocoder *ceo = [[CLGeocoder alloc]init];
    CLLocation *loc = [[CLLocation alloc]initWithLatitude:locationManager.location.coordinate.latitude longitude:locationManager.location.coordinate.longitude]; //insert your coordinates

    [ceo reverseGeocodeLocation: loc completionHandler:
     ^(NSArray *placemarks, NSError *error)
     
         CLPlacemark *placemark = [placemarks objectAtIndex:0];
         NSLog(@"placemark %@",placemark);
         //String to hold address
         locatedAt = [[placemark.addressDictionary valueForKey:@"FormattedAddressLines"] componentsJoinedByString:@", "];
         NSLog(@"addressDictionary %@", placemark.addressDictionary);

         NSLog(@"placemark %@",placemark.region);
         NSLog(@"placemark %@",placemark.country);  // Give Country Name
         NSLog(@"placemark %@",placemark.locality); // Extract the city name
         NSLog(@"location %@",placemark.name);
         NSLog(@"location %@",placemark.ocean);
         NSLog(@"location %@",placemark.postalCode);
         NSLog(@"location %@",placemark.subLocality);

         NSLog(@"location %@",placemark.location);
         //Print the location to console
         NSLog(@"I am currently at %@",locatedAt);
     ];


    return YES;




- (NSString *)deviceLocation

    NSString *theLocation = [NSString stringWithFormat:@"latitude: %f longitude: %f", locationManager.location.coordinate.latitude, locationManager.location.coordinate.longitude];
    return theLocation;


【问题讨论】:

【参考方案1】:

您可以检查[CLLocationManager authorizationStatus] 以验证用户是否允许使用类似的位置服务

int result = [CLLocationManager authorizationStatus];

它有返回值

typedef enum 
    kCLAuthorizationStatusNotDetermined = 0,
    kCLAuthorizationStatusRestricted,
    kCLAuthorizationStatusDenied,
    kCLAuthorizationStatusAuthorized
 CLAuthorizationStatus;

【讨论】:

【参考方案2】:

有关如何获取用户位置的信息,请参阅Location Awareness Programming Guide。最重要的是,您必须创建CLLocationManager 位置管理器(就像您一样),然后启动位置服务(低功耗显着变化位置服务或标准位置服务)并等待CLLocationManagerDelegate 方法didUpdateLocations 返回位置(或 didFailWithError 报告错误,因为应用程序授权失败,或者因为设备由于某种原因无法满足位置请求)。但是,您不能只从CLLocationManager 中获取位置。在可靠地开始使用经度和纬度之前,您必须等待服务调用 didUpdateLocations

Location Awareness Programming Guide 将引导您完成所有这些,包括一些非常有用的代码示例。

【讨论】:

@user1837938 我现在意识到您的问题是如何在不征得许可的情况下执行此操作,我没有回答。 Apple 的应用程序提交指南(参见第 4 节)明确禁止这种做法。有很多方法可以做到,但我认为寻求许可比被抓到偷偷摸摸要好得多。

以上是关于您如何在没有用户共享/授予权限的情况下使用核心位置?的主要内容,如果未能解决你的问题,请参考以下文章

Chrome 地理位置扩展

仅在授予权限后如何加载地图

如何在不为 RVM 用户授予 sudo 访问权限的情况下安装 RVM 系统要求

只要状态没有被授予,如何一直询问位置权限-Flutter

检索核心位置的授权状态

什么条件使 iOS 13 要求用户授予“始终”位置访问权限?