当前位置: 首页 > 知识库问答 >
问题:

iOS:应用程序在安装应用程序时不询问用户的权限。

汪甫
2023-03-14

我正在尝试获取iOS应用程序中的用户位置。我首先在我的项目中包括了corelocation框架。然后点击一个按钮,我调用核心位置api,如下所示。当我试图将其安装到设备中时,核心位置从不请求用户权限。当我尝试在单击按钮时获取位置时,我得到的KClauthorizationStatusNotDetected为AuthorizationStatus。请帮我做这件事。我不知道发生了什么事。

- (IBAction)fetchLessAccurateLocation:(id)sender {
    [self.txtLocation setText:@""];

    locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate = self;
    locationManager.desiredAccuracy = kCLLocationAccuracyKilometer;
    locationManager.distanceFilter = 1000;

    if ([self shouldFetchUserLocation]) {
        [locationManager startUpdatingLocation];
    }
}

这是我的shouldFetchUserLocation方法:

-(BOOL)shouldFetchUserLocation{

    BOOL shouldFetchLocation= NO;

    if ([CLLocationManager locationServicesEnabled]) {
        switch ([CLLocationManager authorizationStatus]) {
            case kCLAuthorizationStatusAuthorized:
                shouldFetchLocation= YES;
                break;
            case kCLAuthorizationStatusDenied:
            {
                UIAlertView *alert= [[UIAlertView alloc]initWithTitle:@"Error" message:@"App level settings has been denied" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles: nil];
                [alert show];
                alert= nil;
            }
                break;
            case kCLAuthorizationStatusNotDetermined:
            {
                UIAlertView *alert= [[UIAlertView alloc]initWithTitle:@"Error" message:@"The user is yet to provide the permission" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles: nil];
                [alert show];
                alert= nil;
            }
                break;
            case kCLAuthorizationStatusRestricted:
            {
                UIAlertView *alert= [[UIAlertView alloc]initWithTitle:@"Error" message:@"The app is recstricted from using location services." delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles: nil];
                [alert show];
                alert= nil;
            }
                break;

            default:
                break;
        }
    }
    else{
        UIAlertView *alert= [[UIAlertView alloc]initWithTitle:@"Error" message:@"The location services seems to be disabled from the settings." delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles: nil];
        [alert show];
        alert= nil;
    }

    return shouldFetchLocation;
}

以下是我的核心位置委托方法:

- (void)locationManager:(CLLocationManager *)manager
    didUpdateLocations:(NSArray *)locations __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_6_0){

    NSLog(@"location fetched in delegate");

    CLLocation* location = [locations lastObject];
    NSDate* eventDate = location.timestamp;
    NSTimeInterval howRecent = [eventDate timeIntervalSinceNow];

    if (abs(howRecent) < 15.0) {
        // If the event is recent, do something with it.
        NSLog(@"inside loop.... latitude %+.6f, longitude %+.6f\n",
              location.coordinate.latitude,
              location.coordinate.longitude);
    }
    NSLog(@"latitude %+.6f, longitude %+.6f\n",
          location.coordinate.latitude,
          location.coordinate.longitude);
    [self.txtLocation setText:[NSString stringWithFormat:@"\nlatitude: %+.6f \nlongitude:   %+.6f", location.coordinate.latitude, location.coordinate.longitude]];

    [locationManager stopUpdatingLocation];
    [locationManager stopMonitoringSignificantLocationChanges];

    if(locationManager!=nil){
        locationManager.delegate= nil;
        locationManager= nil;
    }
}

共有3个答案

邢和光
2023-03-14

目标C遵循以下说明:

iOS-11 For iOS 11看看这个答案:iOS 11位置访问

需要将两个密钥添加到plist中,并提供如下图的消息

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

Delegat方法

#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];
}

快速代码

按照以下说明操作:

iOS-11 For iOS 11看看这个答案:iOS 11位置访问

需要将两个密钥添加到plist中,并提供如下图的消息:

 1. NSLocationAlwaysAndWhenInUseUsageDescription 
 2. NSLocationWhenInUseUsageDescription
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

}
罗毅
2023-03-14

我也面临同样的问题,在重新安装我的应用程序后,每当检查[CLLocationManager authorizationStatus]时,它都会返回kCLAuthorizationStatusNotDetermined,而该应用程序甚至没有显示在设置中

iOS提示用户批准对位置服务的访问的授权对话框在[locationManager startUpdatingLocation]上触发,在您的情况下,该对话框从不调用shouldFetchUserLocation将始终为)。

米格尔的解决方案似乎是一个很好的解决方案,我会尝试的。

当iOS8出现时,它对CLLocationManager的使用方式几乎没有改变。正如在其他答案中多次提到的,与iOS7相比,它需要额外的步骤。今天,我自己面对这个问题,发现了这篇文章(从其他多个问题中引用了这篇文章,但它完成了我先前的回答)。希望有帮助!

邹野
2023-03-14

假设[CLLocationManager locationServicesEnabled]返回YES,

随着iOS应用程序[iOS7和iOS8]的首次启动,LocationManager(CLLocationManager)授权状态预设为

authorizationStatus(CLAuthorizationStatus) = kCLAuthorizationStatusNotDetermined

启动LocationManager(CLLocationManager,Strong)并设置代理(CLLocationManager,LEGATE)

现在提示用户使用位置服务,并在设置下列出应用程序

位置更新-[self.locationManager startUpdatingLocation]

地区监控-[self.locationManager启动地区监控:beaconRegion]

执行上述方法后,iOS将提示用户请求接受应用程序中的位置服务,并且无论用户选择什么,应用程序都将列在设置下

它与iOS8的情况相同,首次推出应用程序位置服务

authorizationStatus(CLAuthorizationStatus) = kCLAuthorizationStatusNotDetermined

iOS 8我们有了向用户显示提示的新方法

[self.locationManager requestAlwaysAuthorization] 
or
[self.locationManager requestWhenInUseAuthorization]

requestAlwaysAuthorization/RequestWhenUseAuthorization可从iOS8获得。如果应用程序部署目标是iOS7,则将其包装在if块下,以确保在iOS7中不会导致应用程序崩溃。

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

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

根据iOS8,必须在信息中包含说明应用程序为何使用requestAlwaysAuthorization/RequestWhenUseAuthorization的字符串。plist包括应用程序要求的所有这些财产

对于KCLAuthorizationStatusAuthorizationDalWays,包括键/值(字符串值)对

NSLocationAlwaysUsageDescription = App use Locations service mode Always

对于kCLAuthorizationStatusAuthorizedWhenInUse,使用包含键/值(字符串值)对

NSLocationWhenInUseUsageDescription = App use Locations service mode In Use 
 类似资料:
  • 问题内容: 我不是在寻找java-web- start,而是在寻找胖客户端应用程序安装工具包。我有一个独立的应用程序,其中包含几个文件(jar文件,数据文件等),并且需要执行一些非常标准的安装任务,例如向用户询问目标目录,让他们找到系统的某些部分- 选择一些按计算机或按用户配置的选项,并可能尝试检测它们的某些计算机设置。 我正在寻找类似于MSI或其他向导驱动的安装应用程序的东西。什么是Java的良

  • 我在设置的应用程序部分看到应用程序,上面写着。它完全是灰色的,我无法卸载它。当我从play store安装相同的版本时,它说不兼容的版本已经安装了。 我只想从我的设备上移除这个应用程序。 也不会从adb卸载 C:\users\athakur>adb卸载com.osfg.rintonesetter.main失败[DELETE_FAILED_INTERNAL_ERROR] 而且 C:\users\at

  • 我正在尝试使用Android Studio3.6.3和我的手机制作一个应用程序来测试它。我遇到了一个问题,我认为卸载这个应用程序是个好主意,但现在,Android studio不知道我的手机上不存在这个应用程序,它试图运行文件。错误是: 05/27 21:03:30:在小米红米Note 7上启动“MainActivity”。 启动活动时出错 我怎样才能欺骗它重新安装正确的应用程序?

  • 我正在尝试使用AppUpdateManager在应用程序更新API中实现Android。我首先尝试遵循文档,如果您在这里,那么您知道这是行不通的。 所以我读了十几篇教程和博客文章,介绍了如何实现这个功能。我大概90%在那。对我来说,在用户接受更新后,更新被下载,我的侦听器检测到下载完成,并且我显示自己的消息并回调(大多数教程在这一点上使用了一个Toast(吐司),但这不重要)。如果我的用户点击“r

  • 我正在开发一个应用程序,它也可以从另一个应用程序启动。姑且称之为“被叫app”和“主叫app”。我正在使用protection level“signature”向“被调用的应用程序”的启动器活动添加权限。但是,当我添加此权限时,我无法从应用程序图标启动“被调用的应用程序”。上面写着“App未安装”。我还尝试使用“危险”保护级别。它给出了同样的错误。 我想这个问题可能是因为我给启动器活动提供了一个自

  • 我正在开发一个企业应用程序。当我在iOS8测试版中测试它时,我看到了以下警报视图: 它只是第一次出现。我能设法避免吗?它与什么有关?