iOS8定位适配

简介:

iOS8 beta版发布后淘点点尝试适配,其中遇到的一个主要的问题是无法定位,做了一些适配后后能够正常定位。iOS8正式版定位方面没有变动,依然需要做适配。iOS8对定位的改动,基本思路就是将定位细分为Always和WhenInUse两类,要求开发者说明使用定位的用途并酌情使用。此举意在防止定位信息滥用,至于作用就仁者见仁智者见智了。

更新:
当使用iOS SDK 8,并且iOS设备或模拟器也是iOS8时,无法定位需要做适配。其他情况下不做适配也可以正常工作。

定位变更

iOS8的变更包括:

  • 状态栏图标
  • 定位服务设置
  • 定位授权

想要全面了解的同学可以学习WWDC的What's New in Core Location一节。这里我们主要介绍定位授权。

定位授权在iOS8中细分为Always和WhenInUse。如下表,定位可以细分为5类。前三个前台更新,属于Continuous Updates。后两个后台更新,属于Location Monitoring。Always授权可以使用这5类定位,而WhenInUse可以使用Continuous Updates,也就是前三个。

Location Always WhenInUse
Location Yes Yes
Background location Yes Yes
Ranging Yes Yes
Region monitoring Yes
Significant location changes Yes

iOS8要求应用如果使用定位,需要告诉用户使用的原因。描述放在应用的Info.plist中,当然也可能是其他文件名,取决于项目中的定义。两个授权的key分别为:

  • NSLocationAlwaysUsageDescription
  • NSLocationWhenInUseUsageDescription

看起来Always授权涵盖了WhenInUse授权,使用Always授权可以一劳永逸了。但是如果应用被授予了Always授权,几天后可能需要再次向用户请求授权。这样是为了让应用按需申请授权,开发者可能需要权衡。

之前定位授权获取发生在应用使用定位的时候,开发者不需要显式地请求。现在则需要显式地请求授权。两个授权对应的方法在类CLLocationManager中,分别为:


- (void)requestAlwaysAuthorization __OSX_AVAILABLE_STARTING(__MAC_NA, __IPHONE_8_0);
- (void)requestWhenInUseAuthorization __OSX_AVAILABLE_STARTING(__MAC_NA, __IPHONE_8_0);


如何适配

1. 添加定位使用描述

在Info.plist中添加应用准备使用的定位授权,例如


<key>NSLocationAlwaysUsageDescription</key>
<string>淘点点将获取您的位置,为您提供更精准的餐饮服务</string>


2. 检测并请求授权

在调用CLLocationManagerstartUpdatingLocation前请求授权。首先为了兼容老版本,需要用宏定义在老版本中屏蔽相关代码。然后检测Info.plist中定义授权的描述,根据存的授权的描述决定申请哪个定位授权。以下代码为墨昕编写。


#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_7_1
    if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_7_1 && [CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined) {
        BOOL hasAlwaysKey = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSLocationAlwaysUsageDescription"] != nil;
        BOOL hasWhenInUseKey = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSLocationWhenInUseUsageDescription"] != nil;
        if (hasAlwaysKey) {
            [self.locationManager requestAlwaysAuthorization];
        } else if (hasWhenInUseKey) {
            [self.locationManager requestWhenInUseAuthorization];
        } else {
            NSAssert(hasAlwaysKey || hasWhenInUseKey, @"moxin.xt:add NSLocationWhenInUseUsageDescription or NSLocationAlwaysUsageDescription to your info.plist");
        }
    }
#endif


同时建议其他iOS团队写好对用户授权的描述,更多信息参考在正确的情境中向用户获取iOS权限

目录
相关文章
|
3月前
|
IDE API Android开发
安卓与iOS开发环境的差异及适配策略
在移动应用开发的广阔舞台上,Android和iOS两大操作系统各据一方,各自拥有独特的开发环境和工具集。本文旨在深入探讨这两个平台在开发环境上的关键差异,并提供有效的适配策略,帮助开发者优化跨平台开发流程。通过比较Android的Java/Kotlin和iOS的Swift/Objective-C语言特性、IDE的选择、以及API和系统服务的访问方式,本文揭示了两个操作系统在开发实践中的主要分歧点,并提出了一套实用的适配方法,以期为移动开发者提供指导和启示。
|
5月前
|
程序员 定位技术 开发工具
iOS11及以上操作系统无法定位问题完美解决方案
iOS11及以上操作系统无法定位问题完美解决方案
58 1
|
5月前
|
iOS开发
SwiftUI适配iOS16导航控制器引起的闪退
SwiftUI适配iOS16导航控制器引起的闪退
63 0
|
5月前
|
监控 iOS开发
iOS15适配问题:viewForSupplementaryElementOfKind表头和表尾复用闪退,UITableView section header多22像素等问题
iOS15适配问题:viewForSupplementaryElementOfKind表头和表尾复用闪退,UITableView section header多22像素等问题
79 0
|
5月前
|
iOS开发
ios中,输入框获得焦点时,页面输入框被遮盖,定位的元素位置错乱
ios中,输入框获得焦点时,页面输入框被遮盖,定位的元素位置错乱
77 1
|
10月前
|
iOS开发
ios fixed定位问题
ios fixed定位问题
97 0
|
11月前
|
小程序 开发工具 Android开发
Donut多端框架小程序打包适配ios和安卓app
腾讯新出了一个 Donut 多端框架,可以直接将微信小程序转成 ios 和 安卓 app,小程序开发者工具里也集成了 app 相关升级、调试和打包的功能,终于可以一套代码开发出3个客户端了!
244 0
Donut多端框架小程序打包适配ios和安卓app
|
安全 前端开发 开发工具
iOS12、iOS11、iOS10、iOS9常见适配
iOS12、iOS11、iOS10、iOS9常见适配
227 0
|
小程序 iOS开发
uniapp中IOS端小程序底部黑线适配的方法(整理)
uniapp中IOS端小程序底部黑线适配的方法(整理)
|
iOS开发
iOS 第三方dSYM定位BUG
iOS 第三方dSYM定位BUG
129 0