文档章节

ios8 地图不能定位问题的解决办法

 泊竹
发布于 2014/09/26 09:18
字数 590
阅读 5880
收藏 2
- (void)startTrackingLocation {
    CLAuthorizationStatus status = [CLLocationManager authorizationStatus];
    if (status == kCLAuthorizationStatusNotDetermined) {
        [_locationManager requestWhenInUseAuthorization];
    }
    else if (status == kCLAuthorizationStatusAuthorizedWhenInUse || status == kCLAuthorizationStatusAuthorizedAlways) {
        [_locationManager startUpdatingLocation];
    }
}
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {
    switch (status) {
        case kCLAuthorizationStatusAuthorizedAlways:
        case kCLAuthorizationStatusAuthorizedWhenInUse:
            NSLog(@"Got authorization, start tracking location");
            [self startTrackingLocation];
            break;
        case kCLAuthorizationStatusNotDetermined:
            [_locationManager requestWhenInUseAuthorization];
        default:
            break;
    }
}


使用时

if (isIOS8) {
        _locationManager = [[CLLocationManager alloc] init];
        _locationManager.delegate = self;
        [self startTrackingLocation];
    }

另外,在项目的plist文件里设置key, 可以自定义授权弹窗的提示语。


上面的代码截取自苹果官方demo

/*
    Copyright (C) 2014 Apple Inc. All Rights Reserved.
    See LICENSE.txt for this sample’s licensing information
    
    Abstract:
    
                Primary view controller for what is displayed by the application.
                In this class we receieve location updates from Core Location, convert them to x,y coordinates so that they map on the imageView
                and move the pinView to that location
            
*/

#import "AAPLViewController.h"
#import "AAPLCoordinateConverter.h"

@interface AAPLViewController () <CLLocationManagerDelegate>

@property (nonatomic, weak) IBOutlet UIImageView *imageView;
@property (nonatomic, weak) IBOutlet UIImageView *pinView;
@property (nonatomic, weak) IBOutlet UIImageView *radiusView;

@property (nonatomic, strong) CLLocationManager *locationManager;
@property (nonatomic, strong) AAPLCoordinateConverter *coordinateConverter;

@property CGFloat displayScale;
@property CGPoint displayOffset;

@property (nonatomic) AAPLGeoAnchorPair anchorPair;

@end

@implementation AAPLViewController

- (void)viewDidLoad {
	[super viewDidLoad];

	// Setup a reference to location manager.
	self.locationManager = [[CLLocationManager alloc] init];
	self.locationManager.delegate = self;
	self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    self.locationManager.activityType = CLActivityTypeOther;

	// We setup a pair of anchors that will define how the floorplan image, maps to geographic co-ordinates
    AAPLGeoAnchor anchor1 = {
        .latitudeLongitude = CLLocationCoordinate2DMake(37.770511, -122.465810),
        .pixel = CGPointMake(12, 18)
    };

    AAPLGeoAnchor anchor2 = {
        .latitudeLongitude = CLLocationCoordinate2DMake(37.769125, -122.466356),
        .pixel = CGPointMake(481, 815)
    };

    self.anchorPair = (AAPLGeoAnchorPair) {
        .fromAnchor = anchor1,
        .toAnchor = anchor2
    };

	// Initialize the coordinate system converter with two anchor points.
	self.coordinateConverter = [[AAPLCoordinateConverter alloc] initWithAnchors:self.anchorPair];
}

- (void)viewDidAppear:(BOOL)animated {
    [self setScaleAndOffset];
    [self startTrackingLocation];
}

- (void) setScaleAndOffset {
    CGSize imageViewFrameSize = self.imageView.frame.size;
    CGSize imageSize = self.imageView.image.size;

    // Calculate how much we'll be scaling the image to fit on screen.
    self.displayScale = MIN(imageViewFrameSize.width / imageSize.width, imageViewFrameSize.height / imageSize.height);
    NSLog(@"Scale Factor: %f", self.displayScale);

    // Depending on whether we're constrained by width or height,
    // figure out how much our floorplan pixels need to be offset to adjust for the image being centered
    if (imageViewFrameSize.width / imageSize.width < imageViewFrameSize.height / imageSize.height) {
        NSLog(@"Constrained by width");
        self.displayOffset = CGPointMake(0, (imageViewFrameSize.height - imageSize.height * self.displayScale) / 2);
    } else {
        NSLog(@"Constrained by height");
        self.displayOffset = CGPointMake((imageViewFrameSize.width - imageSize.width * self.displayScale) / 2, 0);
    }

    NSLog(@"Offset: %f, %f", self.displayOffset.x, self.displayOffset.y);
}

- (void)startTrackingLocation {
	CLAuthorizationStatus status = [CLLocationManager authorizationStatus];
    if (status == kCLAuthorizationStatusNotDetermined) {
		[self.locationManager requestWhenInUseAuthorization];
    }
    else if (status == kCLAuthorizationStatusAuthorizedWhenInUse || status == kCLAuthorizationStatusAuthorizedAlways) {
		[self.locationManager startUpdatingLocation];
    }
}

- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {
	switch (status) {
		case kCLAuthorizationStatusAuthorizedAlways:
		case kCLAuthorizationStatusAuthorizedWhenInUse:
			NSLog(@"Got authorization, start tracking location");
			[self startTrackingLocation];
            break;
		case kCLAuthorizationStatusNotDetermined:
			[self.locationManager requestWhenInUseAuthorization];
		default:
			break;
	}
}

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
    // Pass location updates to the map view.
	[locations enumerateObjectsUsingBlock:^(CLLocation *location, NSUInteger idx, BOOL *stop) {
        NSLog(@"Location (Floor %@): %@", location.floor, location.description);
		[self updateViewWithLocation:location];
	}];
}

- (void) updateViewWithLocation: (CLLocation *) location {
	// We animate transition from one position to the next, this makes the dot move smoothly over the map
	[UIView animateWithDuration:0.75 animations:^ {
		// Call the converter to find these coordinates on our floorplan.
		CGPoint pointOnImage = [self.coordinateConverter pointFromCoordinate:location.coordinate];

		// These coordinates need to be scaled based on how much the image has been scaled
		CGPoint scaledPoint = CGPointMake(pointOnImage.x * self.displayScale + self.displayOffset.x,
										  pointOnImage.y * self.displayScale + self.displayOffset.y);

		// Calculate and set the size of the radius
		CGFloat radiusFrameSize = location.horizontalAccuracy * self.coordinateConverter.pixelsPerMeter * 2;
		self.radiusView.frame = CGRectMake(0, 0, radiusFrameSize, radiusFrameSize);

		// Move the pin and radius to the user's location
		self.pinView.center = scaledPoint;
		self.radiusView.center = scaledPoint;
	}];
}

- (void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
	// Upon rotation, we want to resize the image and center it appropriately.
    [self setScaleAndOffset];
}


© 著作权归作者所有

共有 人打赏支持
粉丝 90
博文 67
码字总数 13285
作品 0
徐汇
私信 提问
加载中

评论(2)

泊竹

引用来自“萧雨歇”的评论

你好,官方demo的地址可以贴一下吗?
从开发者网站下载的。重新编辑的这篇文章,添加了官方demo代码
三月飞鸟
你好,官方demo的地址可以贴一下吗?
iOS8中定位服务的变化(CLLocationManager协议方法不响应,无法回掉GPS方法,不出

iOS8中定位服务的变化(CLLocationManager协议方法不响应,无法回掉GPS方法,不出现获取权限提示) 最近在写一个LBS的项目的时候,因为考虑到适配iOS8,就将项目迁移到Xcode6.0.1上,出现了不能...

天舒
2015/01/28
0
0
iOS CLLocationManager定位

在iOS8以前的版本中,我们使用CLLocationManager定位是没有问题的,最近在iOS8系统中却无法定位了。。。。这是一大问题啊! 1、首先定义一个全局的变量用来记录CLLocationManager对象,引入C...

万能的匹诺曹
2016/06/29
34
0
使用Xcode6和IOS8SDK以后遇到的问题

定位。苹果在IOS8里面修改了定位授权协议,也就意味着你原来的app在ios8上很可能无法定位。目前最好的办法就是在app启动的时候调用IOS8的定位授权API来获取用户的授权,这样就不要在其他地方...

hejunbinlan
2015/08/19
0
0
iOS8中使用CoreLocation定位

在iOS8中,苹果已经强制开发者在请求定位服务时获得用户的授权,此外iOS状态栏中还有指示图标,提示用户当前应用是否正在使用定位服务。另外在iOS8中,苹果进一步改善了定位服务,让开发者请...

Im刘亚芳
2014/12/07
0
0
iOS 系统设置隐私中常用的功能权限获取

1.相册权限 根据apple的sdk ALAuthorizationStatus 拥有以下状态 iOS8 以后可以通过 PHAuthorizationStatus的权限值同上相似,这边就不写了,可查看具体的apple 的sdk 2.相机权限 对应的权限...

wesk痕
2016/08/05
112
0

没有更多内容

加载失败,请刷新页面

加载更多

Elasticsearch通关教程(五):如何通过SQL查询Elasticsearch

  这篇博文本来是想放在全系列的大概第五、六篇的时候再讲的,毕竟查询是在索引创建、索引文档数据生成和一些基本概念介绍完之后才需要的。当前面的一些知识概念全都讲解完之后再讲解查询是...

SEOwhywhy
8分钟前
0
0
以太坊PHP离线交易开发包

EthTool开发包适用于希望采用裸交易的PHP以太坊应用开发,主要包含以下特性: 支持裸交易部署/调用合约 内置etherscan和infura支持 keystore生成与读取,兼容geth/parity 采用裸交易的一个好...

笔阁
36分钟前
2
0
SRE的含义及与 DevOps 如何关联?

虽然站点可靠性工程师(site reliability engineer SRE)角色在近几年变得流行起来,但是很多人 —— 甚至是软件行业里的 —— 还不知道 SRE 是什么或者 SRE 都干些什么。为了搞清楚这些问题...

linuxCool
37分钟前
1
0
月入3万之一个程序员的转行坎坷历程

陈年往事 “我月入3万,怎么会少少了你一个鸡蛋啊?” 这是2017年9月左右的一个新闻,一位煎饼摊大妈因和顾客争执时脱口而出这样一句话而走红。当时还上了各大新闻的头条。 互联网兴起今天,...

苏南-首席填坑官
58分钟前
3
1
OSChina 周一乱弹 —— 眼看着这颗陨石砸了下来

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子:分享Nachtblut的单曲《Antik》 《Antik》- Nachtblut 手机党少年们想听歌,请使劲儿戳(这里) @mr_chip :上海的初雪之后有点冷 ...

小小编辑
今天
627
10

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部