自2018年10月18日起,高德开发者论坛除车机板块外,其他板块将停止发帖与维护,如您有使用问题请 提交工单 联系我们,感谢您的理解。

查看: 13556|回复: 30
打印 上一主题 下一主题

iOS 8无法定位的解决方案

[复制链接]
最佳答案
66 

37

主题

1135

帖子

2883

积分

超级版主

Rank: 8Rank: 8

积分
2883
跳转到指定楼层
楼主
发表于 2014-9-22 09:48:45 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 chenjie_1986 于 2014-10-16 09:43 编辑

升级iOS 8后,将无法定位,特给出解决方案。
1.Plist中追加下字段NSLocationWhenInUseUsageDescription或NSLocationAlwaysUsageDescription(这两个字段必须有其中一个,内容是系统alert的文言,文言可为空) ,如下图所示:
WhenInUse是应用在前台的时候可以搜到更新的位置信息,Always是除了应用在前台,应用在后台(suspend或terminated)都可以获取到更新的位置数据 ,根据需要,按需去申请权限

2.修改代码,self.mapView.showsUserLocation= YES;加入如下代码

定义CLLocationManager对象,私有的或者property都可以,以确保alert弹出,用户点击完以后 CLLocationManager 对象还没被释放。示例如下:
  1. @implementation ViewController
  2. {
  3.     CLLocationManager * locationManager;
  4. }
  5.   ……  

  6. locationManager =[[CLLocationManager alloc] init];

  7.   // fix ios8 location issue
  8.     if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined) {
  9. #ifdef __IPHONE_8_0
  10.         if ([locationManager respondsToSelector:@selector(requestAlwaysAuthorization)])
  11.         {
  12.             [locationManager performSelector:@selector(requestAlwaysAuthorization)];//用这个方法,plist中需要NSLocationAlwaysUsageDescription
  13.         }
  14.         
  15.         if ([locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)])
  16.         {
  17.             [locationManager performSelector:@selector(requestWhenInUseAuthorization)];//用这个方法,plist里要加字段NSLocationWhenInUseUsageDescription
  18.         }
  19. #endif
  20.     }
复制代码

以上解决方案仅针对Xcode6,适用于V2.3.0(含)之前版本。







回复

使用道具 举报

最佳答案
0 

1

主题

6

帖子

39

积分

新手上路

Rank: 1

积分
39
推荐
发表于 2014-9-23 16:05:48 | 只看该作者
找到问题了:
请将NSLocationWhenInUseDescription 替换成 NSLocationWhenInUseUsageDescription
以讹传讹啊!!!
回复 支持 1 反对 0

使用道具 举报

最佳答案
0 

1

主题

6

帖子

39

积分

新手上路

Rank: 1

积分
39
沙发
发表于 2014-9-22 21:26:34 | 只看该作者
本帖最后由 Ken_DC 于 2014-9-22 21:27 编辑

试过了,不行啊!
没有alert弹出请求定位服务
回复 支持 反对

使用道具 举报

最佳答案
0 

1

主题

5

帖子

19

积分

新手上路

Rank: 1

积分
19
板凳
发表于 2014-9-23 14:24:44 | 只看该作者
我测试的也不行....
回复 支持 反对

使用道具 举报

最佳答案
66 

37

主题

1135

帖子

2883

积分

超级版主

Rank: 8Rank: 8

积分
2883
地板
 楼主| 发表于 2014-9-23 14:35:35 | 只看该作者
charlesleo 发表于 2014-9-23 14:24
我测试的也不行....

您好!您的locationmanager是定义成property或者私有了吗?必须保证该对象没有被释放掉。
回复 支持 反对

使用道具 举报

最佳答案
66 

37

主题

1135

帖子

2883

积分

超级版主

Rank: 8Rank: 8

积分
2883
5#
 楼主| 发表于 2014-9-23 14:35:39 | 只看该作者
charlesleo 发表于 2014-9-23 14:24
我测试的也不行....

您好!您的locationmanager是定义成property或者私有了吗?必须保证该对象没有被释放掉。
回复 支持 反对

使用道具 举报

最佳答案
0 

1

主题

6

帖子

39

积分

新手上路

Rank: 1

积分
39
6#
发表于 2014-9-23 15:48:54 | 只看该作者
本帖最后由 Ken_DC 于 2014-9-23 15:51 编辑

[_locationManager requestWhenInUseAuthorization];

是_locationManager成员变量。默认是strong的,应该不会被自动释放。
我也实现了代理:
  1. - (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {
  2.     switch (status) {
  3.         case kCLAuthorizationStatusDenied :
  4.         {
  5.             // 提示用户出错原因,可按住Option键点击 KCLErrorDenied的查看更多出错信息,可打印error.code值查找原因所在
  6.             UIAlertView *tempA = [[UIAlertView alloc]initWithTitle:@"提醒" message:@"请在设置-隐私-定位服务中开启定位功能!" delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil];
  7.             [tempA show];
  8.         }
  9.             break;
  10.         case kCLAuthorizationStatusNotDetermined :
  11.             if ([_locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
  12.                 [_locationManager requestWhenInUseAuthorization];
  13.             }
  14.             break;
  15.         case kCLAuthorizationStatusRestricted:
  16.         {
  17.             // 提示用户出错原因,可按住Option键点击 kCLErrorDenied的查看更多出错信息,可打印error.code值查找原因所在
  18.             UIAlertView *tempA = [[UIAlertView alloc]initWithTitle:@"提醒"
  19.                                                            message:@"定位服务无法使用!"
  20.                                                           delegate:nil
  21.                                                  cancelButtonTitle:@"确定"
  22.                                                  otherButtonTitles:nil, nil];
  23.             [tempA show];
  24.         }
  25.             break;
  26.             
  27.         default:
  28.             break;
  29.     }
  30. }
复制代码


并且有回调。就是没有alert弹出请求定位服务
进入代理方法:kCLAuthorizationStatusNotDetermined case情况
再次调用[_locationManager requestWhenInUseAuthorization];也没反应
回复 支持 反对

使用道具 举报

最佳答案
0 

1

主题

6

帖子

39

积分

新手上路

Rank: 1

积分
39
7#
发表于 2014-9-23 15:57:04 | 只看该作者
找到方法了!!!!!!擦擦擦

都把这个plist属性写错了。而且一搜互联网都tmd错的。
去stackoverflow才问对。

NSLocationWhenInUseUsageDescription,不是tmd NSLocationWhenInUseDescription
回复 支持 反对

使用道具 举报

最佳答案
0 

1

主题

5

帖子

19

积分

新手上路

Rank: 1

积分
19
9#
发表于 2014-9-26 09:29:57 | 只看该作者
Ken_DC 发表于 2014-9-23 16:05
找到问题了:
请将NSLocationWhenInUseDescription 替换成 NSLocationWhenInUseUsageDescription
以讹传讹 ...

这个才是正解,已解决 . 谢谢
回复 支持 反对

使用道具 举报

最佳答案
0 

0

主题

4

帖子

16

积分

新手上路

Rank: 1

积分
16
10#
发表于 2014-9-26 20:51:53 | 只看该作者
这个是只执行一次,还是要每个VIEWCONTROLLER都要来一下?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|小黑屋|高德开发者论坛

Copyright ©2014 高德开发者论坛.All Rights Reserved |京ICP证070711号

意见反馈 常见问题 服务条款 联系我们
快速回复 返回顶部 返回列表