苹果审核地图位置类应用被拒解决
2017-02-25 本文已影响54人
小白哥有话说
嗟呼!
因为苹果最近更改了审核流程,当天提交第二天就可以完成审核,为其速度点个赞!
但是审核的程序将更加的严格,对于定位这一块的用户体验要求到了近乎苛刻的程度,对于第一次上传的小白而言,必然会被拒,甚至3次不止,虽然我也被拒了这么一次,深刻感悟,还是要把自己所遇到的血淋淋的现实在此说明下,以飨食者!
本篇要说些什么呢?
一.小白之地图应用的常规注意事项:
二.地图应用权限的2种场景解决办法:
三.点点建议与注意点再次重审!
一.小白之地图应用的常规注意事项:
1.以苹果官方地图为例,指明地图的集成:(这里只说定位,没有地图哦!)
导入框架遵循代理如下:
//导入框架
#import <CoreLocation/CoreLocation.h>
//遵循代理
@interface VMVoiceViewController ()<CLLocationManagerDelegate>
初始化地图类:
-(void)initCLLocationManger {
self.manager.delegate = self;
// 请求授权,记得修改的infoplist,NSLocationAlwaysUsageDescription(描述)
[self.manager requestAlwaysAuthorization];
}
地图类的代理介绍与实现:
#pragma mark - CLLocationManagerDelegate
/** 定位服务状态改变时调用*/
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status{
switch (status) {
case kCLAuthorizationStatusNotDetermined: {
DDLog(@"用户还未决定授权");
if ([manager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
// [manager requestAlwaysAuthorization];
[manager requestWhenInUseAuthorization];
}
break;
}
case kCLAuthorizationStatusRestricted: {
DDLog(@"访问受限");
break;
}
case kCLAuthorizationStatusDenied: {
NSString *appName = [[NSBundle mainBundle].infoDictionary valueForKey:@"CFBundleDisplayName"];
if (!appName) appName = [[NSBundle mainBundle].infoDictionary valueForKey:@"CFBundleName"];
NSString *message = [NSString stringWithFormat:@"请在%@的\"设置-隐私-定位服务\"选项中,\r允许%@访问你的位置。",[UIDevice currentDevice].model,appName];
[DisplayHelper displayWarningAlert:message];
if ([CLLocationManager locationServicesEnabled]) {
DDLog(@"定位服务开启,被拒绝");
}
else{
DDLog(@"定位服务关闭,不可用");
}
break;
}
case kCLAuthorizationStatusAuthorizedAlways: {
DDLog(@"获得前后台授权");
[self startLocation];
break;
}
case kCLAuthorizationStatusAuthorizedWhenInUse: {
DDLog(@"获得前后台授权");
[self startLocation];
break;
}
}
}
-(void)startLocation {
[self.manager startUpdatingLocation];
//设置精确度
self.manager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
//设置过滤距离
self.manager.distanceFilter = 1000;
//开始定位方向
[self.manager startUpdatingHeading];
}
// 开始定位时获得到信息调用,调用频率比较高
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
//获取当前位置
CLLocation *location = manager.location;
// 地址的编码通过经纬度得到具体的地址
CLGeocoder *gecoder = [[CLGeocoder alloc] init];
[gecoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {
CLPlacemark *placemark = [placemarks firstObject];
if (placemark.location) {
self.voiceModel.nowLocation =placemark.location;
}
// //打印地址
DDLog(@"dic =%@",placemark.addressDictionary[@"City"]);
NSString *citys = placemark.addressDictionary[@"City"];
NSDictionary *addressDic = placemark.addressDictionary;
if ([addressDic.allKeys containsObject:@"FormattedAddressLines"]) {
NSArray *array =addressDic[@"FormattedAddressLines"];
if (array.count) {
NSString *address =[array firstObject];
if (address.length) {
self.voiceModel.detailAddress =address;
}else {
self.voiceModel.detailAddress =citys;
}
}
}
NSString *city =placemark.locality;
if (city.length) {
NSString *cityStr =[city substringToIndex:city.length -1];
self.placeLable.text =cityStr;
}
}];
//停止定位
[self.manager stopUpdatingLocation];
}
2.权限设置问题:
requestAlwaysAuthorization :当用户还未决定授权,但应用程序想一致访问程序位置,就调用这个方法,
requestWhenInUseAuthorization:当用户还未决定授权,但应用程序想在用户使用程序时访问位置信息,就调用这个方法,
3.必要的提示优化!
当用户拒绝程序访问位置信息时,就要每次提示用户去手动开启访问位置。
case kCLAuthorizationStatusDenied: {
NSString *appName = [[NSBundle mainBundle].infoDictionary valueForKey:@"CFBundleDisplayName"];
if (!appName) appName = [[NSBundle mainBundle].infoDictionary valueForKey:@"CFBundleName"];
NSString *message = [NSString stringWithFormat:@"请在%@的\"设置-隐私-定位服务\"选项中,\r允许%@访问你的位置。",[UIDevice currentDevice].model,appName];
[DisplayHelper displayWarningAlert:message];
if ([CLLocationManager locationServicesEnabled]) {
DDLog(@"定位服务开启,被拒绝");
}
else{
DDLog(@"定位服务关闭,不可用");
}
break;
}
二.地图应用权限的2种场景解决办法:
1.用户使用应用程序期间,应用位置:
代码处理上如下:
case kCLAuthorizationStatusNotDetermined: {
DDLog(@"用户还未决定授权");
if ([manager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
[manager requestWhenInUseAuthorization];
}
break;
}
info.plist 增加字段为:
<key>NSLocationWhenInUseUsageDescription</key><string>需要您的同意,才能在使用应用程序期间访问位置,用于上传路况信息所用</string>
2.用户一直在后台使用位置:
代码处理上如下:
case kCLAuthorizationStatusNotDetermined: {
DDLog(@"用户还未决定授权");
if ([manager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
[manager requestAlwaysAuthorization];
}
break;
}
info.plist 增加字段为:
<key> NSLocationAlwaysUsageDescription </key><string>需要您的同意,才能在后台一直访问您的位置,用于上传路况信息所用</string>
三.点点建议与注意点再次重审!
1.权限设置的一一对应
即如果在定位状态为: kCLAuthorizationStatusNotDetermined(即用户还未决定是否授权)状态下,
代码中判断的方法为 requestAlwaysAuthorization时候,则权限设置为NSLocationAlwaysUsageDescription;
代码中判断的方法为 requestWhenInUseAuthorization时候,则权限设置为NSLocationWhenInUseUsageDescription;
一定要一一对应
2.用户拒绝访问位置的友情提示!
再次重申,一定记得加上,下次如果用户拒绝了,个别功能无法用,要给予提示,让用户手动去打开权限
3.对于2种权限的建议
建议最好使用的是NSLocationWhenInUseUsageDescription 属性,特别是只需要访问用户的位置,并没有明显的地图界面的情况下,
如果存在地图地位的情况,就用NSLocationAlwaysUsageDescription,
需要注意的是,用NSLocationAlwaysUsageDescription的时候,提示语必须加上,用于XXX所用,如上面的:
“需要您的同意,才能在后台一直访问您的位置,用于上传路况信息所用”这样的value字段
4.可以在 app描述里加上:使用后台定位会减少电池的使用寿命。
如果用的这种权限问题,则可以在打包提交项目的项目描述中详情说明自己用定位的目的,
以及一直用的话,会减少电池的使用寿命。这样类似的话,便于更快的通过审核!