2015-09-24 20 views
22

Ứng dụng của tôi theo dõi vị trí trong khi ở chế độ nền ... chế độ nền vị trí được bật và tôi sử dụngiOS9 không theo dõi vị trí trong khi ở chế độ nền

[self.locationManager startUpdatingLocation]; 

này hoạt động tốt trên iOS7-8 nhưng nó ngừng làm việc trên iOS9

Trong giả lập nó hoạt động, nhưng trên thiết bị thực tôi không nhận được gọi lại trong khi ở chế độ nền ... khi chạy cùng một mã trên thiết bị iOS8, tôi nhận được callbacks bình thường như trước

Tài liệu này có được không? Tại sao nó hoạt động trong trình mô phỏng chứ không phải trong thiết bị? nó là một lỗi?

Khi sử dụng startSignificantChangeUpdates nó hoạt động trên iOS9, tôi tự hỏi, nếu đây là một số loại tính năng tiết kiệm pin, rằng họ có thể bị cấm startUpdatingLocation

+1

Hãy xem belo http://stackoverflow.com/questions/30808192/allowsbackgroundlocationupdates-in-cllocationmanager-in-ios9 – Dipen

Trả lời

34

Sử dụng:

if ([self.locationManager respondsToSelector:@selector(setAllowsBackgroundLocationUpdates:)]) { 
    [self.locationManager setAllowsBackgroundLocationUpdates:YES]; 
} 

để tránh sử dụng một macro đánh giá phiên bản của hệ thống. Điều này sẽ gọi setAllowsBackgroundLocationUpdates: trên iOS 9 nhưng không phải trên iOS 8.

+0

này lưu cuối tuần của tôi :) và kỳ lạ của nó mà trong giả lập nó hoạt động mà không có bất kỳ vấn đề –

15

Vui lòng sử dụng dưới tham chiếu cho vị trí trong ios 9

allowsBackgroundLocationUpdates in CLLocationManager in iOS9

tài sản mới này được giải thích trong phiên WWDC "Có gì mới trong lõi Location".

Giá trị mặc định là NO nếu bạn liên kết chống lại iOS 9.

Nếu ứng dụng của bạn sử dụng vị trí trong nền (không hiển thị trên thanh trạng thái màu xanh), bạn phải thiết lập allowsBackgroundLocationUpdates YES trong Ngoài việc thiết lập chế độ nền khả năng trong Info.plist. Nếu không, bản cập nhật vị trí chỉ được phân phối ở nền trước. Ưu điểm là bây giờ bạn có thể có người quản lý vị trí với các cập nhật vị trí nền và người quản lý vị trí khác chỉ với bản cập nhật vị trí tiền cảnh trong cùng một ứng dụng. Bạn cũng có thể đặt lại giá trị thành NO để thay đổi hành vi.

Các tài liệu là khá rõ ràng về nó:

Theo mặc định, đây là NO cho các ứng dụng liên kết chống lại iOS 9.0 hoặc mới hơn, bất kể mục tiêu triển khai tối thiểu.

Với UIBackgroundModes được đặt để bao gồm "vị trí" trong Info.plist, bạn cũng phải đặt thuộc tính này thành CÓ khi chạy bất cứ khi nào gọi -startUpdatingLocation với mục đích tiếp tục trong nền.

Đặt thuộc tính này thành YES khi UIBackgroundModes không bao gồm "vị trí" là lỗi nghiêm trọng.

Đặt lại thuộc tính này thành NO tương đương với việc bỏ qua "vị trí" khỏi giá trị UIBackgroundModes. Quyền truy cập vào vị trí vẫn được cho phép bất cứ khi nào ứng dụng đang chạy (tức là không bị tạm ngưng) và có đủ ủy quyền (tức là nó có quyền Sử dụng khi sử dụng và đang được sử dụng hoặc nó đã Luôn ủy quyền). Tuy nhiên, ứng dụng sẽ vẫn phải tuân thủ các quy tắc tạm dừng tác vụ thông thường.

See -requestWhenInUseAuthorization and -requestAlwaysĐể biết thêm chi tiết về các giá trị ủy quyền có thể có.

Cảm ơn

+0

Cám ơn upvote và chấp nhận – Dipen

+2

Xin lưu ý rằng chương trình của bạn sẽ bị lỗi nếu bạn bao gồm thuộc tính này trên các phiên bản hệ thống nhỏ hơn 9.0. Bạn sẽ thấy: [CLLocationManager setAllowsBackgroundLocationUpdates:]: bộ chọn không được nhận dạng được gửi đến ví dụ. Xin vui lòng xem câu trả lời của tôi để quản lý điều này. – mkabatek

+0

ổn nhờ cho đề nghị – Dipen

8

tôi đã cùng một vấn đề, bạn cần phải thêm một cái gì đó như thế này:

if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"9.0")){ 

    [self.locationManager setAllowsBackgroundLocationUpdates:YES]; 

} 

vĩ mô của tôi để kiểm tra phiên bản hệ điều trông như thế này:

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending) 

Sau đây bài đăng trên diễn đàn đã giúp tôi:

https://forums.developer.apple.com/thread/6895

Các vấn đề liên quan