быстро, обнаруживать ibeacons на заднем плане и отправлять уведомления, когда в радиусе действия - PullRequest
0 голосов
/ 17 октября 2018

Здравствуйте, я новичок в IBeacons и новичок в Swift, и я пытаюсь создать небольшое приложение, которое обнаруживает Ibeacon на фоне приложения и отправляет уведомление, когда Ibeacon находится в диапазоне, мне удается это сделать, но толькокогда я гуляю, когда приложение открыто, я не могу заставить его работать и искать Ibeacons на заднем плане, хотя я дал приложению доступ, чтобы определить местоположение на фоне с помощью

 if (CLLocationManager.authorizationStatus() != CLAuthorizationStatus.authorizedAlways) {
        locationManager.requestAlwaysAuthorization();
    }

, это мой главныйпроблема, у меня также есть побочная проблема, что приложение не сохраняет имя человека, если приложение закрывается и открывается снова, приложение забудет имя.Вот мой код, я очень признателен за вашу помощь, также, пожалуйста, если у вас есть какие-либо ссылки, чтобы узнать больше о приложениях IBeacons, я буду признателен за это

   import UIKit
   import CoreLocation
   import UserNotifications

   class ViewController: UIViewController, CLLocationManagerDelegate {
   @IBOutlet weak var field: UITextField!
   @IBOutlet weak var textLbl : UILabel!
   var inRoom = false
   var name = ""
   var sendYet = false ;

func sendHiNoti()
{
    name = field.text! ;
    let content = UNMutableNotificationContent()
    content.title = "Heloo "+name
    content.subtitle = "Welcome to your Home"
    content.body = "this messaage to welcome you in Home"
    content.badge = 1
    content.sound = UNNotificationSound(named: UNNotificationSoundName(rawValue: "quiteimpressed.mp3"))
    let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 2, repeats: false)
    let request = UNNotificationRequest(identifier: "azanSoon", content: content, trigger: trigger)
    UNUserNotificationCenter.current().removeAllPendingNotificationRequests()
    UNUserNotificationCenter.current().add(request) {(error) in
        if let error = error {
            print("error: \(error)")
        }
    }
}

func sendByeNoti()
{
    name = field.text! ;
    let content = UNMutableNotificationContent()
    content.title = "OH"+name
    content.subtitle = "You are going out already ??"
    content.body = "Take care of your self"
    content.badge = 1
    content.sound = UNNotificationSound(named: UNNotificationSoundName(rawValue: "quiteimpressed.mp3"))
    let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 2, repeats: false)
    let request = UNNotificationRequest(identifier: "azanSoon", content: content, trigger: trigger)
    UNUserNotificationCenter.current().removeAllPendingNotificationRequests()
    UNUserNotificationCenter.current().add(request) {(error) in
        if let error = error {
            print("error: \(error)")
        }
    }
}

@IBAction func getText(){
    name = field.text!
    let alert = UIAlertController(title: "Your Name is", message: name, preferredStyle: UIAlertController.Style.alert)
    alert.addAction(UIAlertAction(title: "Ok", style: UIAlertAction.Style.default, handler: nil))
    self.present(alert, animated: true, completion: nil)

}


var locationManager = CLLocationManager()

override func viewDidLoad() {

    super.viewDidLoad()

    locationManager.delegate = self


    UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge], completionHandler: {didAllow, error in})

    let uuid = UUID(uuidString: "E2C56DB5-DFFB-48D2-B060-D0F5A71096E0")!
    let beaconRegion = CLBeaconRegion(proximityUUID: uuid, major: 444, minor: 333, identifier: "abcdefac005b")

    if (CLLocationManager.authorizationStatus() != CLAuthorizationStatus.authorizedAlways) {
        locationManager.requestAlwaysAuthorization();
    }
    locationManager.startRangingBeacons(in: beaconRegion)
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()

}



func locationManager(_ manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], in region: CLBeaconRegion) {
    print(beacons)
    if(beacons.count > 0){
    if(!sendYet){
    if beacons[0].proximity.rawValue < 2 {
        textLbl.text = "In the room"
        sendHiNoti()
        sendYet = true ;
    }
    }
   else if beacons[0].proximity.rawValue >= 3 {
        textLbl.text = "Outside the room"
        sendByeNoti()
        sendYet = false ;
    }
}
}
}

1 Ответ

0 голосов
/ 17 октября 2018

В приведенном коде используется диапазон радиомаяка locationManager.startRangingBeacons(in: beaconRegion), который обычно не поддерживается в фоновом режиме более 10 секунд после перехода между передним планом и фоном.

locationManager.requestAlwaysAuthorization() откроет только возможность использовать мониторинг маяков в фоновом режиме.Мониторинг маяков дает вам один вызов, когда маяки либо появляются впервые (didEnter(region: region)), либо все исчезают (didExit(region: region)).Это единственный API маяка, который работает в фоновом режиме при нормальных обстоятельствах.

Можно выполнять измерение маяка в фоновом режиме более 10 секунд, используя два метода:

  1. Вы можете получить 180 секунд диапазона фона после перехода приложения в фон, запустив фоновую задачу, как описано в моем блоге здесь .

  2. Вы можететакже скажите iOS, что вы - приложение для определения местоположения, чтобы разблокировать неограниченный диапазон радиомаяков.Сначала вы должны реализовать решение в части 1. Затем в своем Info.plist объявите:

    <key>UIBackgroundModes</key>
    <array>
        <string>location</string>
    </array>
    

    Наконец, в своем коде выполните locationManager.startUpdatingLocation().Это приведет к тому, что ваше приложение будет регулярно получать обновления широты / долготы, но в качестве побочного эффекта вы сможете выполнять фоновую задачу, начиная с шага 1, вечно, позволяя ранжированию продолжаться вечно в фоновом режиме.

Если вы решите использовать вариант 2, имейте в виду, что будет труднее получить одобрение вашего приложения для продажи в AppStore.Вы должны убедить рецензентов Apple, что ваше приложение является законным приложением для определения местоположения (например, Waze или Apple Maps), и пользователь знает, что ваше приложение всегда работает в фоновом режиме.Если вы не убедите их в этом, они отклонят ваше приложение.

Отдельно просто сохранить значения в постоянном хранилище, чтобы они сохранялись при перезапуске приложения.Просто используйте NSUserDefaults так:

 // save off name when user fills it in
 UserDefaults.standard.set(name, forKey: "name")

 // load back name on app restart
 name = UserDefaults.standard.string(forKey: "name") 
...