Обнаружение маяка в фоновом режиме из фреймворка

#ios #background #frameworks #ibeacon #detection

#iOS #фон #фреймворки #ibeacon #обнаружение

Вопрос:

У меня есть фреймворк, в котором была вся логика обнаружения маяка, и пример приложения, которое настраивает и демонтирует фреймворк. Я хочу получать уведомления о входе и выходе из региона после завершения работы приложения. Я могу получать уведомления из приложения, когда логика находится в приложении. Но когда логика находится в фреймворке, я не получаю уведомлений. Что я делаю не так?

 import UIKit
import CoreLocation

extension AppDelegate: CLLocationManagerDelegate {

    func registerForBeaconNotifications() {
        let locationManager = CLLocationManager()
        let region = CLBeaconRegion(proximityUUID: UUID(uuidString: "83f9daec-4cae-54f1-b64e-846f12345d05")!, major: 10, minor: 10, identifier: "iPhone 6 Beacon")

        locationManager.delegate = self
        region.notifyOnEntry = true
        region.notifyOnExit = true
        region.notifyEntryStateOnDisplay = true

        locationManager.startMonitoring(for: region)
        locationManager.startRangingBeacons(in: region)

        // Register for showing notification alerts
        UIApplication.shared.registerUserNotificationSettings(UIUserNotificationSettings(types: .alert, categories: nil))
    }

    func locationManager(_ manager: CLLocationManager, didDetermineState state: CLRegionState, for region: CLRegion) {
        let notification = UILocalNotification()

        switch state {
        case .inside:
            notification.alertBody = "Entered region"
            UIApplication.shared.presentLocalNotificationNow(notification)

        case .outside:
            notification.alertBody = "Exited region"
            UIApplication.shared.presentLocalNotificationNow(notification)

        default:
            notification.alertBody = "Region unknown"
            UIApplication.shared.presentLocalNotificationNow(notification)
        }
    }
}
  

Комментарии:

1. Есть много, много вещей, которые могут пойти не так. Не видя кода, любой ответ был бы не более чем диким предположением. Не могли бы вы опубликовать код?

2. Я не уверен AppDelegate BeaconMonitoring.swift , должна ли быть ссылка на файл, но она не прошла. Несмотря на это, стандартная практика в StackOverflow заключается в публикации небольшого отрывка вашего кода с указанием частей кода, имеющих отношение к вашему вопросу.

3. Я был в середине обновления, последний комментарий был по ошибке. Я отредактировал свой вопрос с помощью кода.

Ответ №1:

Чтобы предотвратить сборку мусора, которая остановит мониторинг, locationManager должна быть переменная класса, а инициализация должна выполняться внутри метода. Вот так:

 let locationManager: CLLocationManager!

func registerForBeaconNotifications() {
    self.locationManager = CLLocationManager()
    ...
  

Комментарии:

1. Я пробовал это, не повезло: (Что-нибудь еще, о чем вы можете подумать, неверно?

2. Причина, по которой он не работал, в том, что я провел пальцем вверх, чтобы убить приложение, и в этом случае приложение не будет разбужено при обнаружении iBeacons. Есть ли какое-либо решение для решения этой проблемы?