Cập nhật vị trí liên tục nền iOS13


9

Tôi hiện đang thử nghiệm chế độ vị trí nền trong iOS 13, vì tôi muốn theo dõi vị trí và chuyển động của người dùng (sử dụng CMMotionManager) trong nền. Do đó, tôi có lớp (singleton) riêng xử lý theo dõi vị trí. Tôi khởi tạo CLLocationManager theo cách sau:

    func initializeLocationManager() -> CLLocationManager {
        let manager = locationManager ?? CLLocationManager()
        manager.delegate = self
        manager.requestAlwaysAuthorization()
        manager.allowsBackgroundLocationUpdates = true
        manager.pausesLocationUpdatesAutomatically = false
        manager.distanceFilter = kCLDistanceFilterNone
        manager.desiredAccuracy = kCLLocationAccuracyBest
        manager.activityType = .other
        return manager
    }

Sau đó, tôi bắt đầu các dịch vụ sau:

   func startLocationServices() {
        // ...
        locationManager.startUpdatingLocation()
        locationManager.startMonitoringVisits()
        locationManager.startMonitoringSignificantLocationChanges()
        // ...
    }

Ngoài ra, tôi đã triển khai các phương thức CLLocationManagerDelegate didChangeAuthorization (), didUpdateLocation ().

Trong tập tin info.plist tôi đã thêm các mục sau:

<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>...</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>...</string>
<key>UIBackgroundModes</key>
<array>
    <string>location</string>
</array> 

Trong ViewContoder của tôi, tôi gọi startLocationService. Hiện tại, tôi đặt quyền của ứng dụng để theo dõi dữ liệu vị trí thành ". Trái phép"

Các cập nhật vị trí dừng lại sau khoảng 60 - 130 phút.

Để giải quyết vấn đề, tôi đã thêm chức năng didFinishLaunchingWithOptions, kích hoạt lại cập nhật vị trí:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    if let launchOptions = launchOptions,
        let isLocationKey = launchOptions[UIApplication.LaunchOptionsKey.location] as? Bool,
        isLocationKey {
        restartServices()

    }
    return true
} 

Khi ứng dụng bị đánh thức bằng chức năng này, tôi đã quản lý để có được dữ liệu liên tục trong một số thử nghiệm, nhưng đôi khi ứng dụng bị treo lại sau vài phút.

Cuối cùng, tôi cũng đã thử một bộ đếm thời gian khởi động lại theo dõi vị trí cứ sau 5 phút, nhưng điều này dường như không ảnh hưởng đến thời lượng cập nhật.

Vì vậy, câu hỏi của tôi là nếu có một cách liên tục nhận được các bản cập nhật vị trí trong nền, hoặc có một số tùy chọn tôi đang thiếu?

Cảm ơn trước.

Chỉnh sửa: Tôi đã thử nghiệm ứng dụng trên iOS 12 và nó được cập nhật liên tục trong 5/5 thử nghiệm. Vì vậy, tôi đoán vấn đề có liên quan đến iOS 13.


1
Này bạn đã có được giải pháp cho việc này chưa?
Abhishek

2
Vâng, như đã nêu trong bình luận cuối cùng của tôi, tôi có thể tăng đáng kể thời lượng trước khi ứng dụng được chuyển sang trạng thái treo, bằng cách giảm các tài nguyên tiêu thụ trong nền. -> Tôi đã xóa bộ sưu tập chuyển động hoàn toàn khỏi ứng dụng. -> Khi chuyển sang nền tôi giảm độ chính xác và tăng khoảng cách Bộ lọc cho các vị trí để có ít sự kiện hơn, tôi dừng một số tác vụ đang cập nhật giao diện người dùng, tôi lấy mẫu thu thập các nguồn dữ liệu khác, tôi không xuất dữ liệu của mình trong nền hoặc khối lượng công việc khác. Vì vậy, bây giờ tôi nhận được khoảng 3000 phút trong nền.
mattll

bạn có thể giúp tôi với một số mã?
Abhishek

1
Trong AppDelegate.swift của bạn triển khai các chức năng func applicationDid EntryBackground (_ application: UIApplication) và func applicationDid EntryBackground (_ application: UIApplication). Trong các hàm đó truy cập CLLocationManager của bạn và đặt các thuộc tính distanceFilter, mong muốnAccuracy tương ứng. Tôi cũng lấy mẫu hẹn giờ mà tôi sử dụng để viết một số thông tin sử dụng (như trạng thái pin hiện tại) và kết thúc bộ hẹn giờ mà tôi sử dụng để cập nhật định kỳ chế độ xem chính hoặc ngược lại khi phương thức applicationDidBecomeActive. Tôi đoán chơi xung quanh và thử nghiệm là chìa khóa.
mattll

Câu trả lời:


1

Không có gì sai với mã !! , Tôi đã đối mặt với cùng một vấn đề và sau khi nghiên cứu tôi thấy rằng

Tại bài phát biểu WWDC19, Apple đã công bố hai thay đổi về cách thức cấp phép vị trí sẽ hoạt động trong iOS 13. Thay đổi đầu tiên cho người dùng tùy chọn chia sẻ vị trí của họ với ứng dụng của bạn chỉ một lần. Điều này giúp dễ dàng thử các tính năng vị trí và giúp người dùng giữ dữ liệu vị trí nhạy cảm ở chế độ riêng tư.

Thay đổi đáng chú ý đầu tiên là ngay cả khi bạn gọi requestAlwaysAuthorization, người dùng sẽ chỉ nhận được các tùy chọn 'ngay bây giờ' và 'khi sử dụng' trong hộp thoại cấp phép. Nếu người dùng cấp cho bạn quyền 'khi sử dụng' và bạn cố quét vị trí trong nền, chỉ sau đó người dùng sẽ được cung cấp hộp thoại để cấp quyền nền.

Vì vậy, khi các khoản tài trợ sử dụng WhenInUseUsage phép Bạn sẽ nhận được alwaystrong CLAuthorizationStatusvà Nếu người dùng chọn Allow Once CLAuthorizationStatussẽ được nghỉ ngơi để notDeterminedlần ra mắt ứng dụng đó nữa

Bạn có thể kiểm tra bài viết này để biết thông tin chi tiết https://medium.com/q42-engineering/apple-location- allow-ios13-1e0e59002889

Và đây là video https://developer.apple.com/ideo/play/wwdc2019/705/

BIÊN TẬP

Sau khi có quyền Người dùng được cấp bởi người dùng iOS sẽ hiển thị cho người dùng một đoạn hội thoại khác sau một số ngày để thay đổi quyền từ khi sử dụng sang luôn cho phép.

Vì vậy, bây giờ không có cách nào để yêu cầu người dùng trực tiếp cho phép luôn cho phép ngay lập tức như chúng tôi làm trước đây.

nhập mô tả hình ảnh ở đây


1
Điều đó đã giải quyết vấn đề của bạn? Tôi tự đặt mức ủy quyền thành luôn trong -> Cài đặt -> Quyền riêng tư -> Dịch vụ vị trí Nhưng điều đó không giải quyết được vấn đề.
mattll

1
Nhưng ngay cả sau khi tôi đặt cờ luôn cho phép, Ứng dụng sẽ chấm dứt tại một số điểm. Ứng dụng của bạn có chạy liên tục sau đó không?
mattll

1
Cảm ơn các cập nhật. Tôi đã gặp cửa sổ bật lên đó và bạn cũng có thể đặt thông báo luôn trong cài đặt quyền riêng tư của iphone, nhưng điều này không giải quyết được vấn đề ở trên cho tôi. Trên iOS 12 tôi chưa gặp phải bất kỳ vấn đề nào với tính năng theo dõi vị trí liên tục, trong khi trên iOS 13, ứng dụng sẽ bị treo sau một thời gian.
mattll

1
Dưới đây là những quan sát của tôi sau khi khám phá vấn đề trong một thời gian. Nói ngắn gọn: Tôi càng làm ít trong khi ở chế độ nền, tôi càng có thể ghi âm lâu hơn cho đến khi bị đình chỉ. Tôi đã vô hiệu hóa hầu hết các chức năng được thực thi trong nền, vì vậy bây giờ tôi chỉ theo dõi vị trí / một số thông tin sử dụng và lưu trữ nó bằng dữ liệu cốt lõi. Ngoài ra, khi ứng dụng chuyển sang chế độ nền, tôi thay đổi distanceFilter và mong muốnAccuracy của trình quản lý vị trí. Bây giờ, tôi có thể theo dõi khoảng 3000 mà không bị đình chỉ.
mattll

1
có ai có giải pháp này?
Abhishek
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.