iOS11及以上操作系统无法定位问题完美解决方案

简介: iOS11及以上操作系统无法定位问题完美解决方案

原来的应用使用的是后台一直定位正常,升级到xcode9后,无法定位,在隐私定位中看到的应用是永不。在info.Plist中的添加新Key NSLocationAlwaysAndWhenInUseUsageDeion和旧Key NSLocationWhenInUseUsageDeion。仍然没有用,卸载应用后再安装,看到脸定位的永不状态也没有了。

我以前解决了两天天没有搞定这个老工程不能定位的问题,新建的项目在iOS11下可以定位(是直接建立工程,不是拷贝过来一个老工程修改下)。由于换工作,不做曹操专车的软件,新的公司的应用没有使用位置定位功能,由于项目忙,所以就没有进一步的解决。

今天我终于有时间,再次研究老工程无法定位的问题,我感觉是配置项哪里没有生效引起的。更新了高德定位sdk,下载高德定位demo,比较代码发现没有什么区别,demo都是定位回调正常的,但是自己的老工程就是没有定位回调,并且日志打印:

2018-07-31 14:12:01.357574+0800 OutdoorClub[31564:2724613] [AMapLocationKit] 要在iOS 11及以上版本使用定位服务, 需要在Info.plist中添加NSLocationAlwaysAndWhenInUseUsageDescription和NSLocationWhenInUseUsageDescription字段。

原来的高德sdk是不打印这个信息的,所以以前定位更困难,这就距离Ios11发布过去快一年,要是这个问题别的应用没有解决,那么打车软件就不能用了,所以很可能还是配置问题。我又把这个字段加上去,仍旧报这个错。

程序员的精神告诉我;没有跨不过的坎,是没有踩不完的坑。想想我用WKWebView代替UIWebView时踩过几十个坑,当时我甚至怀疑有些功能WKWebView就不能实现,最终我还是迈过去了。但是WKWebView虽然后多好处,但是那么多年UIWebView还是没有完全代替,估计也是和这些大坑有关吧!采用更新的技术总要有流血流汗的准备,阵痛是有的,但是我们最终会越来越接近完美。做程序员重在思路。若做一个错误的功能,你做的再解决需求仍旧做不完美的体验,所以我们也要对不对的需求进行建议性修改。有时候程序猿的思路卡壳了,你就是通宵也不一定能解决了。所以要听听别人的解决方法,特别是做苹果app开发和安卓app开发的技术上是想通的,毕竟苹果系统和安卓也是一家亲,互相抄袭。上次我遇到一个js标签图标图片的iOS app图片替换问题,我想了一周就没有解决了。把百度上的所有的相关文章的方法都试了一遍,结果功能没有实现,结果产生post请求无法发送参数的大问题。看来网上的解决方案是有特定环境和要求的,和我们的需求完全不相同。但是网上的解决方案思路是正确的,只是有些关键的细节有问题,虽然它的demo运行正常,并不能说明它没有问题。本来天下的文章一抄。这个app 定位的问题也是一个典型的一抄走遍天下。解决方案肯定不全面。

以我解决问题的方式,不放过任何细节,怀疑的都要试一试,那么试错了也没有什么,只是浪费一些时间,又没有别人批评你。

1. 怀疑高德的地图key有问题。去干,在高德demo上换掉地图key和bundle identifier,结果高德demo定位正常,地图显示正常。分析高德的地图模块和定位模块是分开的,不会是key的问题。看来我想多了。但是有时后就是这样,你认为不会发生的,可能真的就会发生奇迹,不过这次奇迹没有出现。

2. 怀疑由于我模块化没有把定位开始函数放在AppDelegate.m文件里,仍旧还是没有任何定位信息。

3. 怀疑在info.plist文件里增加NSLocationAlwaysAndWhenInUseUsageDescription和NSLocationWhenInUseUsageDescription字段后需要重新安装应用,结果卸载应用再安装还是依然。

4.

4. 怀疑没有进行授权检查。按照官方文档增加下面的代码:

地图定位单例的部分代码:

- (instancetype)init
{
    self = [super init];
    if (self) {
        self.locationManager = [[AMapLocationManager alloc] init];
#if DEBUG
        self.locationManager.distanceFilter = kCLLocationAccuracyBestForNavigation;
#else
        self.locationManager.distanceFilter = kCLLocationAccuracyBestForNavigation;
#endif
        self.locationManager.pausesLocationUpdatesAutomatically = NO;
        self.locationManager.locatingWithReGeocode = NO;
        if (IOS_VERSION_LARGE_OR_EQUAL(9.0))
        {
            [self.locationManager setAllowsBackgroundLocationUpdates:YES];
        }
        CLAuthorizationStatus status = [CLLocationManager authorizationStatus];
        if(kCLAuthorizationStatusNotDetermined == status)
        {
            CLLocationManager *locationManager = [[CLLocationManager alloc] init];
            locationManager.delegate = self;
            if (IOS_VERSION_LARGE_OR_EQUAL(9.0))
            {
                [locationManager requestWhenInUseAuthorization];
            }
            else
            {
                [locationManager requestAlwaysAuthorization];
            }
        }
        self.locationManager.delegate = self;
        self.searchAPI = [[AMapSearchAPI alloc] init];
        self.searchAPI.delegate = self;
        [self setupCommand];
    }
    return self;
}

结果还是没有定位信息。虽然问题不是出在这里,iOS11确实需要这些检查。iOS11把永远定位降低为使用时定位。所以原来的requestAlwaysAuthorization函数要换成requestWhenInUseAuthorization。

5. 怀疑工程Target的Capabilities的Background Modes重的Location Updates没有勾选。查看后也勾选。

6. 在现在使用的其它应用中加入定位的功能,仍旧不能定位。

7. 求助我朋友,它建立的工程定位很正常。总不能把我以前的代码搬移到他的demo里把,那样工程也太浩大了。若是项目紧急,找不到原因真的可能怎么做。有方案总比无方案好。那也是没有办法的临时办法。

8. 怀疑工程里有配置错误。突然发现工程中有一个info配置,点开一看,其中Custom IOS Target Prpperties和Info.plist很像,并发现确实没有NSLocationAlwaysAndWhenInUseUsageDescription和NSLocationWhenInUseUsageDescription字段,只有Privacy - Location Always Usage Description。我赶紧去掉Privacy - Location Always Usage Description,加上Privacy - Location Always and When In Use Usage Description和Privacy - Location When In Use Usage Description。运行果然定位授权信息弹出来了,并且地图定位也正常。

这个问题的解决方案找到可真不容易啊!苹果的官方文章也没有任何说明,这不是坑我们程序猿吗?让我们上蹿下跳吗?网上的文章抄来抄去,不断的误导我们。做程序就是这样失之毫厘谬以千里,一个零可以让你倾家荡产。

缺少配置的配置项:

修改正确的配置项:

弹出定位授权页面和没有获得定位信息时高德显示的地图是北京的地图:


地图收到正确的定位信息的地图定位图:


把截屏的图片或网上下载的图片下载的图片保存到相册,也有类似的问题。就是在info.plist增加了Privacy - Photo Library Additions Usage Description(增加图片到系统相册的权限)属性字段,但是工程的Info配置项中没有对应的字段,导致app保存图片到相册时崩溃的问题,并非每个工程都遇到,但是部分老工程有可能遇到,至少我的app因此而崩溃了。


目录
相关文章
|
26天前
|
安全 Android开发 iOS开发
Android vs iOS:深入剖析两大移动操作系统的优劣与未来趋势####
【10月更文挑战第21天】 本文旨在通过技术视角,全面对比分析Android与iOS两大主流移动操作系统的架构差异、用户体验、安全性及生态系统等方面,探讨其各自优势与不足,并预测未来发展趋势。 ####
38 1
|
1月前
|
Android开发 Swift iOS开发
深入探索iOS与Android操作系统的架构差异及其对应用开发的影响
在当今数字化时代,移动设备已经成为我们日常生活和工作不可或缺的一部分。其中,iOS和Android作为全球最流行的两大移动操作系统,各自拥有独特的系统架构和设计理念。本文将深入探讨iOS与Android的系统架构差异,并分析这些差异如何影响应用开发者的开发策略和用户体验设计。通过对两者的比较,我们可以更好地理解它们各自的优势和局限性,从而为开发者提供有价值的见解,帮助他们在这两个平台上开发出更高效、更符合用户需求的应用。
|
2月前
|
Android开发 Swift iOS开发
iOS和安卓作为主流操作系统,开发者需了解两者差异以提高效率并确保优质用户体验。
【10月更文挑战第1天】随着移动互联网的发展,智能手机成为生活必需品,iOS和安卓作为主流操作系统,各有庞大的用户群。开发者需了解两者差异以提高效率并确保优质用户体验。iOS使用Swift或Objective-C开发,强调简洁直观的设计;安卓则采用Java或Kotlin,注重层次与动画。Swift和Kotlin均有现代编程特性。此外,iOS设备更易优化,而安卓需考虑更多兼容性问题。iOS应用仅能通过App Store发布,审核严格;安卓除Google Play外还可通过第三方市场发布,审核较宽松。开发者应根据需求选择合适平台,提供最佳应用体验。
73 3
|
19天前
|
人工智能 安全 物联网
Android与iOS:移动操作系统的双雄争霸
在智能手机市场中,Android和iOS作为两大主流操作系统,各自拥有庞大的用户群体和独特的生态系统。本文将深入探讨这两种系统的发展历程、技术特点、市场表现以及未来趋势,以期为读者提供全面而深入的了解。通过对比分析,我们可以发现,尽管Android和iOS在某些方面存在竞争关系,但它们也在相互借鉴中不断进步和完善。
|
16天前
|
安全 生物认证 Android开发
深入探索iOS与Android操作系统的安全性差异
本文旨在通过对比分析iOS和Android两大主流移动操作系统在安全性方面的差异,揭示它们各自的安全机制、面临的挑战以及用户如何提升自身设备的安全保护。通过对系统架构、应用审核机制、数据加密方式及隐私政策的深入探讨,本文为读者提供了一个全面了解两大平台安全性的视角,并提出了实用的安全建议。
|
24天前
|
IDE 安全 Android开发
深入探索Android与iOS操作系统的架构差异
本文旨在对比分析Android和iOS两大主流移动操作系统在架构设计上的根本差异。通过详细解读两者的系统架构、开发环境、以及安全性等方面,揭示它们各自的特点及优势,为开发者选择合适的平台提供参考。
|
29天前
|
安全 定位技术 Android开发
深入探索Android与iOS操作系统的安全性差异
【10月更文挑战第21天】 在当今数字化时代,智能手机已成为我们生活中不可或缺的一部分。其中,Android和iOS作为两大主流操作系统,各自拥有庞大的用户群体。然而,它们在安全性方面的表现却大相径庭。本文将深入探讨Android与iOS在安全机制、隐私保护以及应对恶意软件方面的差异,帮助读者更全面地了解这两个平台的安全特性。
|
1月前
|
开发框架 前端开发 Android开发
探索安卓和iOS应用开发中的跨平台解决方案
【10月更文挑战第42天】在移动应用开发的广阔天地中,安卓和iOS系统如同两座巍峨的山峰,分别占据着半壁江山。开发者们在这两座山峰之间穿梭,努力寻找一种既能节省资源又能提高效率的跨平台开发方案。本文将带你走进跨平台开发的世界,探讨各种解决方案的优势与局限,并分享一些实用的代码示例,助你在应用开发的道路上更加游刃有余。
|
1月前
|
安全 Android开发 iOS开发
深入探讨Android与iOS操作系统的差异性
本文旨在通过对比分析Android和iOS两大主流移动操作系统,揭示它们在设计理念、用户体验、安全性、应用生态及系统更新等方面的根本差异。不同于传统的功能列表式摘要,本摘要强调了两大系统背后的哲学思想及其对用户日常使用的实际影响,为读者提供了一个宏观且深入的视角来理解这两种操作系统的独特之处。
|
1月前
|
搜索推荐 Android开发 iOS开发
安卓与iOS的较量:选择最适合你的移动操作系统
在智能手机市场上,安卓和iOS一直是两大主流操作系统。本文将深入探讨这两个系统的优缺点,帮助你根据自己的需求做出最佳选择。
下一篇
DataWorks