2015-01-07 5 views
0

Я делаю приложение для обнаружения маяков. Приложение отлично работает, когда приложение находится на переднем плане или экран включен. Но метод locationManager: didEnterRegion не вызывается, когда экран выключен. Как я знаю, locationManager: didEnterRegion следует вызывать в любом случае.locationManager: метод didEnterRegion не вызывается, когда экран выключен

Я пробовал много сценариев, например, подождите 15 минут после ввода региона, различных конфигураций (notifyEntryStateOnDisplay = true или false) ... но результат тот же. locationManager: метод didEnterRegion не вызывается до разблокировки телефона.

PS: locationManager: didExitRegion получает правильное название, когда экран выключен.

Я использовал iPhone 5, 5S и 6 плюс протестировать приложение на IOS 8.1

Edit: "обновления Location" и "Использование Bluetooth LE аксессуары" включены

Спасибо за ваши ответы.

import UIKit 
import CoreLocation 

@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate, CLLocationManagerDelegate { 

var window: UIWindow? 
var locationManager: CLLocationManager? 
var lastProximity: CLProximity? 

let beaconRegion = CLBeaconRegion(
    proximityUUID: NSUUID(UUIDString:"d2c36ec5-dfsb-46d2-b069-d2f3r51996e0"), 
    identifier: "My region" 
)  

func application(application: UIApplication, 
    didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool { 
     self.beaconRegion.notifyOnEntry = true 
     self.beaconRegion.notifyOnExit = true 
     self.beaconRegion.notifyEntryStateOnDisplay = false 

     locationManager = CLLocationManager() 

     if(locationManager!.respondsToSelector("requestAlwaysAuthorization")) { 
      locationManager!.requestAlwaysAuthorization() 
     } 

     locationManager!.delegate = self 
     locationManager!.pausesLocationUpdatesAutomatically = false 

     locationManager!.startMonitoringForRegion(beaconRegion) 
     locationManager!.startRangingBeaconsInRegion(beaconRegion) 
     locationManager!.startUpdatingLocation() 

     return true 
} 

func locationManager(manager: CLLocationManager!, 
    didDetermineState state: CLRegionState, 
    forRegion region: CLRegion!) { 
     NSLog("State determined") 
}    

func locationManager(manager: CLLocationManager!, 
    didRangeBeacons beacons: [AnyObject]!, 
    inRegion region: CLBeaconRegion!) { 
     NSLog("didRangeBeacons") 
} 

func locationManager(manager: CLLocationManager!, 
    didEnterRegion region: CLRegion!) { 
    NSLog("didEnterRegion") 

    manager.startRangingBeaconsInRegion(region as CLBeaconRegion) 
    manager.startUpdatingLocation() 
} 

func locationManager(manager: CLLocationManager!, 
    didExitRegion region: CLRegion!) { 
    NSLog("didExitRegion")    
    manager.stopRangingBeaconsInRegion(region as CLBeaconRegion) 
    manager.stopUpdatingLocation() 
} 

func locationManager(manager: CLLocationManager!, 
    monitoringDidFailForRegion region: CLRegion!, 
    withError error: NSError!) { 
    NSLog("monitoringDidFailForRegion - error: %@", [error.localizedDescription]); 
}  



} 
+0

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

+0

Код доступа уже отключен, пока я тестирую приложение –

ответ

1

Вы должны включить фоновый режим выполнения для приложения.

Поместите нужный ключ и значение в вашем info.plist:

enter image description here

+0

«Обновления местоположения» и «Использует аксессуары Bluetooth LE». –

+0

Я не думаю, что это правильно. Конечно, он не нужен для мониторинга зоны без маяка и отклонит ваше приложение. –

0

Вы должны иметь ключ «NSLocationAlwaysUsageDescription» в файле info.plist, который дает сообщение для отображения пользователю, чтобы идти вместе с вызовом requestAlwaysAuthorization.

Вот пример:

enter image description here

Если вы запустили приложение, прежде чем были эти записи Plist настроены, вам, возможно, потребуется удалить и переустановить для того, чтобы работать должным образом.

+0

Спасибо, но я уже добавил NSLocationAlwaysUsageDescription в info.plist перед установкой приложения. –

0

какое оборудование вы используете для отправки сигнала iBeacon? У меня была почти такая же проблема, как у вас, и я нахожу решение случайно. Сначала я использую rad Beacon USB как iBeacon, но он не может разбудить экран от iPhone. Но когда я использую APP с именем Broadcaster, запускаемый на другом устройстве iOS для отправки сигнала iBeacon, это успех.

Может быть полезно: iOS Can not find the iBeacon again in fore ground

Смежные вопросы