2015-09-20 35 views
8

Tôi có một ứng dụng phải báo cáo vị trí của người dùng ngay cả khi nó được nền hoặc thậm chí bị giết (chấm dứt). Vấn đề là các ứng dụng nên báo cáo vị trí không hiếm hơn 1 giờ khoảng thời gian.Cập nhật vị trí nền iOS định kỳ không chỉ phụ thuộc vào thay đổi vị trí quan trọng

Tôi đang sử dụng thay đổi vị trí đáng kể (SLC) để theo dõi tất cả các chuyển động khá đủ khi người dùng đang di chuyển nhưng khi người dùng ngừng cập nhật thêm và ứng dụng không có cơ hội gửi vị trí mới (trong khi người dùng ở trong cùng một khu vực nhưng không có SLC).

Để trang trải trường hợp này, tôi bắt đầu sử dụng tính năng Tìm nạp nền để định kỳ gửi vị trí cập nhật ở chế độ nền ngay cả khi không có SLC). Vấn đề ở đây là tìm nạp nền được sử dụng để hoạt động khá thường xuyên (cứ sau 20-30 phút kể từ khi tôi sử dụng trong ứng dụng iOS 7.x khác) nhưng giờ đây với iOS8/iOS9 tôi chỉ có thể nhận được mỗi ngày một lần hoặc không chấp nhận được trong trường hợp của tôi. Tôi đã thực hiện tấn thử nghiệm, phát triển ứng dụng tải nền đơn giản, thêm thông báo cục bộ khi tìm nạp. Không có may mắn để buộc nó làm việc thường xuyên hơn.

Đây là appdelegate tôi:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    [[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum]; 
    [application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound categories:nil]]; 
    return YES; 
} 

- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler 
{  
    [[UIApplication sharedApplication] cancelAllLocalNotifications]; 
    UILocalNotification *localNotification = [[UILocalNotification alloc] init]; 
    NSDate *now = [NSDate date]; 
    localNotification.fireDate = now; 
    localNotification.alertBody = [NSString stringWithFormat:@"Background fetch!"]; 
    localNotification.soundName = UILocalNotificationDefaultSoundName; 
    NSInteger number = [UIApplication sharedApplication].applicationIconBadgeNumber; 
    number++; 
    localNotification.applicationIconBadgeNumber = number; 
    [[UIApplication sharedApplication] scheduleLocalNotification:localNotification]; 

    completionHandler(UIBackgroundFetchResultNewData); 
} 

Tất cả những gì được thực hiện ở đây là để thêm thông báo địa phương trên tất cả các nền lấy. Tôi luôn hoàn thành việc thực thi nền với UIBackgroundFetchResultNewData.

Bạn có bất kỳ đề xuất nào về cách buộc tải xuống nền hoạt động thường xuyên hơn (hoặc chứng minh các liên kết không thể thực hiện được nữa)? Bất kỳ giải pháp thay thế nào để đáp ứng yêu cầu của tôi cũng được hoan nghênh!

+1

nền Truy xuất đã không bao giờ có một thời gian thi công đảm bảo. Tôi đề nghị bạn gửi push im lặng cho thiết bị của bạn để cho nó một cơ hội để báo cáo vị trí, nhưng điều này sẽ không hoạt động nếu ứng dụng được chấm dứt – Paulw11

+0

Nó không bao giờ được đảm bảo nhưng ít nhất nó được sử dụng để làm việc thường xuyên hơn. Có một số thay đổi đáng kể kể từ iOS 7 liên quan đến tìm nạp nền không? –

+1

Giá trị nào bạn trả lại cho trình xử lý hoàn thành? Dữ liệu mới hoặc không có dữ liệu mới? Theo kinh nghiệm của tôi, ngay cả trên iOS8, nó không được gọi cứ 20-30 phút một lần. – Paulw11

Trả lời

4

Hóa ra lượt tìm nạp nền trong iOS phụ thuộc rất nhiều vào những gì bạn đang làm trong trình xử lý, đặc biệt là hoạt động mạng. Đây là danh sách phụ thuộc mà bạn nên xem xét việc cố gắng để hiểu được nếu và mức độ thường xuyên iOS sẽ thực hiện của bạn lấy:

  • thời gian bạn dành cho việc xử lý
  • kết quả (NoData, NewData) xử lý
  • lỗi (bạn sẽ được đưa ra ít có khả năng nếu bạn mã treo
  • timeout (thực thi mã của bạn có thể bị gián đoạn bởi iOS)
  • sử dụng điện hoạt động
  • mạng liên quan đến kết quả (bạn phải làm một yêu cầu mạng khi nói t mũ bạn có NewData, nếu không tìm nạp của bạn có thể được thực hiện trong thời gian tới trong một ngày hoặc lâu hơn không bao giờ.

Apps rằng tải một lượng nhỏ nội dung một cách nhanh chóng và chính xác phản ánh khi họ có nội dung có sẵn để tải về, có nhiều khả năng nhận thời gian thực hiện trong tương lai so với ứng dụng chụp thời gian dài để tải về nội dung của họ hoặc tuyên bố nội dung có sẵn nhưng sau đó không tải xuống bất kỳ nội dung nào.

Mục cuối cùng hóa ra là rất quan trọng trong trường hợp của tôi, vì mục đích thử nghiệm tôi đã khai báo và không bao giờ cố gắng tải xuống bất kỳ thứ gì. Khi tôi bắt đầu sử dụng mạng trong trình xử lý, các lần tải nền tiếp tục hoạt động như mong đợi sau mỗi 15-30 phút.

của Apple docs: https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html

3

Tôi đã làm việc trên một dự án tương tự. Sau khi thử các giải pháp khác nhau, cách duy nhất tôi đã tìm thấy sự là giải pháp đề xuất ở đây: https://github.com/voyage11/Location

Dưới đây là hướng dẫn tương ứng với git: http://mobileoop.com/getting-location-updates-for-ios-7-and-8-when-the-app-is-killedterminatedsuspended

Tất cả các khoản tín dụng để https://stackoverflow.com/users/1995940/ricky

Nó đã cứu tôi rất nhiều thời gian!

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