Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/94.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 未提示在应用程序中启用位置服务_Ios_Objective C_Cllocationmanager_Cllocation - Fatal编程技术网

Ios 未提示在应用程序中启用位置服务

Ios 未提示在应用程序中启用位置服务,ios,objective-c,cllocationmanager,cllocation,Ios,Objective C,Cllocationmanager,Cllocation,更新:这不是重复的。我已经向info.plist添加了所需的密钥,如我在原始问题中所述,问题仍然存在。我试过三种不同组合的钥匙 在任何人感到不安之前,我已经阅读了许多Apple Dev论坛帖子和堆栈溢出帖子,无法理解为什么我的应用程序在使用授权时拒绝提示用户允许 我已将以下键添加到我的Info.plist文件中,并附带一个字符串值: NSLocationWhenInUseUsageDescription 然后,我(用Swift和Obj-C)编写了提示用户的代码: @property CLLoc

更新:这不是重复的。我已经向info.plist添加了所需的密钥,如我在原始问题中所述,问题仍然存在。我试过三种不同组合的钥匙

在任何人感到不安之前,我已经阅读了许多Apple Dev论坛帖子和堆栈溢出帖子,无法理解为什么我的应用程序在使用授权时拒绝提示用户允许

我已将以下键添加到我的
Info.plist
文件中,并附带一个字符串值:

NSLocationWhenInUseUsageDescription
然后,我(用Swift和Obj-C)编写了提示用户的代码:

@property CLLocationManager *location;
...
@synthesize location;
...
location = [[CLLocationManager alloc] init];
location.delegate = self;

location.desiredAccuracy = kCLLocationAccuracyBest;
location.distanceFilter = kCLDistanceFilterNone;

[location requestWhenInUseAuthorization];
[location startUpdatingLocation];


I'm using the following CLLocationManagerDelegate methods.
- (void) locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
- (void) locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
这基本上是直接从Apple“LocateMe”示例代码中复制的

无论我尝试了什么样的序列或细微的更改,应用程序都不会提示允许授权。我使用了switch语句来确定
[CLLocationManager authorizationStatus]
的状态,但不断收到“Not Determined”响应

if ([CLLocationManager locationServicesEnabled]) {
        switch ([CLLocationManager authorizationStatus]) {
            case kCLAuthorizationStatusAuthorizedAlways:
                NSLog(@"Always Authorized");
                break;
            case kCLAuthorizationStatusDenied:
                NSLog(@"Denied");
                break;
            case kCLAuthorizationStatusAuthorizedWhenInUse:
                NSLog(@"Authorized in Use");
                break;
            case kCLAuthorizationStatusNotDetermined:
                NSLog(@"Not Determined");
                break;
            case kCLAuthorizationStatusRestricted:
                NSLog(@"Restricted");
                break;
        }

    }

任何帮助都将不胜感激。我正在用iOS 8.1.2物理设备和iOS 8.2(12D5452a)模拟器运行Xcode 6.2(6C101)进行测试。

我发现在info.plst文件中,您不能使用隐私-位置使用说明密钥,在使用说明时,您必须有一个名为
nslocation的密钥和一个值。通过将此密钥添加到我的info.plist中,我可以使您的代码正常工作

#import <MapKit/MapKit.h>

@interface ViewController ()

@property CLLocationManager * location;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    _location = [[CLLocationManager alloc] init];

    self.location.delegate = self;
    self.location.desiredAccuracy = kCLLocationAccuracyBest;
    self.location.distanceFilter = kCLDistanceFilterNone;

    [_location requestWhenInUseAuthorization];
    [self.location startUpdatingLocation];
}

#导入
@界面视图控制器()
@物业CLLocationManager*位置;
@结束
@实现视图控制器
-(无效)viewDidLoad{
[超级视图下载];
_位置=[[CLLocationManager alloc]init];
self.location.delegate=self;
self.location.desiredAccuracy=KCallocationAccuracyBest;
self.location.distanceFilter=kCLDistanceFilterNone;
[_使用授权时的位置请求];
[self.location startUpdatingLocation];
}

这里有很多有用的比较:


还有,愚蠢的提问时间:你混合了_location和self.location,但你没有显示你的属性/合成代码。你确定是在同一个对象上操作吗?

我遇到了完全相同的问题,在深入研究两天后,发现应用程序没有读取project navigator窗格中捆绑包中包含的info.plist文件,因为它已本地化为另一种语言,并且正在使用基本国际化,这意味着在Finder中将有3个info.plist文件:

1-在测试文件夹下

2-在base.lproj文件夹下

3-在ar.lprj下(ar指阿拉伯语)

项目从base.lproj的版本中读取,该版本不包含在项目导航器窗格中的捆绑包中

我所做的是,我获取了我想要的plist文件的备份副本(上面的第2个),删除了project navigator中info.plist文件的本地化,并选择从磁盘删除以将其完全删除,然后在Finder中将备份副本放在project的根目录下,并将其导入Xcode中,现在,该项目将从新的info.plist文件和密钥nslocationwhenUsageDescription读取应用程序启动时的用户授权警报


希望这能有所帮助。

这可能有点傻,但我只是花了将近2个小时仔细检查了所有关于CLLocationManager权限的答案

当我终于意识到我有2个info.plist文件,而我使用的是错误的文件时,我觉得自己很愚蠢

您可以签入项目的生成设置-有一个名为Info.plist File的值


只想把它留在这里供将来的读者阅读。

如果您更改了iPhone模拟器中的位置设置,这可能会导致提示不显示。例如,如果您已经通过Allow Locations access iOS提示符设置了位置权限,并做出了决定,则这将存储在iPhone模拟器的隐私设置中,并随后调用
locationManager.requestAlwaysAuthorization()
locationManager.RequestWhenUseAuthorization())
将不会显示iOS提示,因为您已经为应用程序定义了隐私->位置设置

要清除iPhone模拟器的设置,请执行以下操作:
“iOS模拟器”->“重置内容和设置…”


另外,我在Xcode中做了一个干净的构建,在某个时候退出并重新启动了iPhone模拟器,我可能错误地认为这部分有任何帮助

@n00bProgrammer我在模拟器的“设置”>“重置”选项卡中看不到可用的重置选项。此外,我还编写了两个程序,一个用Swift,一个用Obj-C,它们都做同样的事情。我还用一个物理设备进行了测试,得到了同样的结果。我还没有尝试重置硬件。但是我正在8.1而不是8.2上进行测试。我已经用三个不同的键以各种方式进行了测试,希望能让它工作——在某一点上,我的一个项目神奇地开始工作,但我无法将这些更改复制到这个简单的项目中(这个测试的唯一目的是谁)我编辑了代码,添加了@synthesis并修改了属性,只需使用值
location
。也。我读过这一页,但出于某种原因,它对我的问题没有帮助。
nslocationwhenUsageDescription
是我的Info.plist文件中的一个字符串值。这是我的一个活动项目的剪报,正确提示。除了iOS7/8兼容性测试之外,它基本上与您的测试相匹配_locationManager=[[CLLocationManager alloc]init]_locationManager.delegate=self;如果([\u locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]{[\u locationManager requestWhenInUseAuthorization];}[\u locationManager startUpdatingLocation];`呵呵。猜测模式:检查设置>隐私>位置服务。您的应用程序已经有任何设置了吗?没有显示任何设置,授权状态为