在屏幕关闭时,不会调用locationManager:didEnterRegion方法

时间:2015-01-07 18:49:29

标签: ios swift ios8 core-bluetooth ibeacon

我一直在做一个应用来检测信标。当应用程序处于前台或屏幕打开时,该应用程序运行良好。但是当屏幕关闭时,没有调用locationManager:didEnterRegion方法。据我所知,应该以任一方式调用locationManager:didEnterRegion。

我尝试了许多场景,例如在输入区域后等待15分钟以上,不同的配置(notifyEntryStateOnDisplay = true或false)......但结果是相同的。 locationManager:在解锁手机之前,不会调用didEnterRegion方法。

PS:当屏幕关闭时,locationManager:didExitRegion被正确调用。

我使用iPhone 5,5S和6 plus来测试IOS 8.1上的应用程序

编辑:"位置更新"和"使用蓝牙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]);
}    



}

3 个答案:

答案 0 :(得分:1)

您必须为应用启用后台执行模式。

将所需的键和值放在info.plist

enter image description here

答案 1 :(得分:0)

你需要有一个" NSLocationAlwaysUsageDescription"在info.plist文件中输入密钥,该消息显示给用户以显示requestAlwaysAuthorization电话。

以下是一个例子:

enter image description here

如果您在设置这些plist条目之前运行了应用程序,则可能需要卸载并重新安装才能使其正常工作。

答案 2 :(得分:0)

您使用哪种硬件发送iBeacon信号? 我和你的问题几乎一样,我偶然找到了解决办法。我首先使用rad Beacon USB充当iBeacon,但它无法唤醒iPhone的屏幕。但是当我使用名为Broadcaster的APP在另一台iOS设备上运行发送iBeacon信号时,它就成功了。

也许有用: iOS Can not find the iBeacon again in fore ground