我一直在做一个应用来检测信标。当应用程序处于前台或屏幕打开时,该应用程序运行良好。但是当屏幕关闭时,没有调用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]);
}
}
答案 0 :(得分:1)
您必须为应用启用后台执行模式。
将所需的键和值放在info.plist
:
答案 1 :(得分:0)
你需要有一个" NSLocationAlwaysUsageDescription"在info.plist文件中输入密钥,该消息显示给用户以显示requestAlwaysAuthorization
电话。
以下是一个例子:
如果您在设置这些plist条目之前运行了应用程序,则可能需要卸载并重新安装才能使其正常工作。
答案 2 :(得分:0)
您使用哪种硬件发送iBeacon信号? 我和你的问题几乎一样,我偶然找到了解决办法。我首先使用rad Beacon USB充当iBeacon,但它无法唤醒iPhone的屏幕。但是当我使用名为Broadcaster的APP在另一台iOS设备上运行发送iBeacon信号时,它就成功了。