Thay đổi phương pháp lấy thông tin location từ iOS8
Vấn đề phát sinh Từ iOS8 trở đi, phương pháp lấy thông tin location đã được thay đổi. Nếu bạn sử dụng phương pháp như cũ thì sẽ không thể lấy được thông tin location nữa. Các bạn có thể tham khảo topic dưới đây trên Stack Overflow: iOS 8 : Location Services not working My app that ...
Vấn đề phát sinh
Từ iOS8 trở đi, phương pháp lấy thông tin location đã được thay đổi. Nếu bạn sử dụng phương pháp như cũ thì sẽ không thể lấy được thông tin location nữa. Các bạn có thể tham khảo topic dưới đây trên Stack Overflow:
iOS 8 : Location Services not working
My app that worked fine in iOS 7 doesn't work with the iOS 8 SDK.
CLLocationManager doesn't return a location, and I don't see my app under >Settings > Location Services either. I did a Google search on the issue but nothing >came up, what could be wrong?
Point
-
Liên quan đến privacy việc sử dụng thông tin location, kể từ iOS8 thì user có t lựa các lựa chọn chi tiết hơn. Trước iOS8 thì chỉ có 2 lựa chọn cho phép/ko cho phép.
- While Using the App
- Always
- Never
-
Bắt buộc phải ghi rõ mục đích sử dụng thông tin location của app
-
Thêm method liên quan đến request authorization sử dụng thông tin location
Implementation
Đầu tiên, hãy ghi mục đích sử dụng thông tin location vào trong Info.plist. Item này từ trước đến nay là tuỳ ý, nhưng kể từ iOS8 trở đi thì là bắt buộc
Lưu ý là phụ thuộc vào privacy policy mà key cũng khác nhau:
While Using | NSLocationWhenInUseUsageDescription |
---|---|
Always | NSLocationAlwaysUsageDescription |
Check authorization status
Authorization status thay đổi như sau:
- kCLAuthorizationStatusNotDetermined
- kCLAuthorizationStatusRestricted
- kCLAuthorizationStatusDenied
- kCLAuthorizationStatusAuthorized (bỏ)
- kCLAuthorizationStatusAuthorizedAlways
- kCLAuthorizationStatusAuthorizedWhenInUse
kCLAuthorizationStatusAuthorized đã bị bỏ, thay vào đó là 2 giá trị kCLAuthorizationStatusAuthorizedAlways (luôn luôn cho phép) và kCLAuthorizationStatusAuthorizedWhenInUse (chỉ cho phép lúc sử dụng)
Trong trường hợp ở iOS8 mà ko lấy được thông tin location thì rất có thể lúc đó authorization status đang rơi vào trường hợp kCLAuthorizationStatusNotDetermined
Có thể check authorization status bằng delegate như sau:
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status { if (status == kCLAuthorizationStatusNotDetermined) { // user chưa cấp phép xử dụng thông tin location } }
Trong trường hợp chưa được cấp phép sử dụng thông tin location, thì phải sử dụng authorization request để xin phép user cấp quyền sử dụng.
Request authorization
Từ iOS, 2 methods dưới đây được thêm vào CLLocationManager:
- requestAlwaysAuthorization - yêu cầu quyền được sử dụng thông tin location bất cứ lúc nào
- requestWhenInUseAuthorization - yêu cầu quyền được sử dụng thông tin location chỉ khi đang chạy app ở foreground
**Lưu ý: sử dụng các methods trên ở môi trường iOS7 sẽ gây crash !! **
Khi sử dụng các methods trên, authorization dialog sẽ hiện ra. Trên dialog sẽ hiển thị mục đích sử dụng thông tin location của app mà ta đã setting từ trước.
Method này có thể được gọi đến bao nhiêu lần cũng được, dialog chỉ hiển thị khi authorization status = kCLAuthorizationStatusNotDetermined
Không đối ứng những điều trên thì sao chứ?
Tôi đã thử down những app hiện tại có trên AppStore và chạy thử ở iOS8, vẫn có thể lấy được thông tin location. Vì thế đối với những app đã release từ trước thì ko bắt buộc phải đối ứng ngay vấn đề trên cũng chả sao :#)
Source: iOS 8から位置情報を取得する方法が変わるよ