Takahiro Octopress Blog

-1から始める情弱プログラミング

iOS8でrequestLocationが使える!?

実はiOS8.4.1でrequestLocationが使える

さて、今回はたまたま気づいたバグ?の紹介です。
皆様、ご存知の通り, iOS9から requestLocation なるものがCoreLocation.frameworkに追加されました。
これにより、1回だけ現在地を取得する処理を自作せずにframeworkに任せることができるようになりました。

しかし、iOS9からとアナウンスされているものの、実は iOS8.4.1 でも利用できました。
コードは下記になります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
// ViewController.m
#import "ViewController.h"
#import <CoreLocation/CoreLocation.h>

@interface ViewController () <CLLocationManagerDelegate>

@property (strong, nonatomic) CLLocationManager *lm;

@end

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];

  self.lm = [[CLLocationManager alloc] init];
  self.lm.delegate = self;
  [self.lm requestWhenInUseAuthorization];
}

- (void)didReceiveMemoryWarning {
  [super didReceiveMemoryWarning];
}

- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {
  if (status == kCLAuthorizationStatusNotDetermined) {
      // ユーザが位置情報の使用を許可していない
      NSLog(@"kCLAuthorizationStatusNotDetermined");
  } else if(status == kCLAuthorizationStatusAuthorizedAlways) {
      // ユーザが位置情報の使用を常に許可している場合
   NSLog(@"kCLAuthorizationStatusAuthorizedAlways");
  } else if(status == kCLAuthorizationStatusAuthorizedWhenInUse) {
      // ユーザが位置情報の使用を使用中のみ許可している場合
      NSLog(@"kCLAuthorizationStatusAuthorizedWhenInUse");
  }
}

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations {
  // 位置情報の取得に成功した場合
  NSLog(@"%@", locations.firstObject);
}

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
  // 位置情報の取得に失敗した場合
  NSLog(@"%@", error);
}

- (IBAction)getLocation:(id)sender {
  if([self.lm respondsToSelector:@selector(requestLocation)]) {
      // iOS9.x以上の場合
      [self.lm requestLocation];
  } else {
      // iOS8.x以下の場合
      NSLog(@"iOS8.xです");
  }
}

騙されたと思って試してみてください。
なぜかiOS8.4.1でもrequestLocationが実行されますので。

Comments