我一直在研究一个iBeacon应用程序,而且我试图做到这一点,以便当用户退出该区域超过15分钟时它会发布到一个松弛的房间。我试图启动计时器,我试图使用开始时间然后结束时间(这是有效的,但如果用户返回信标,我无法停止循环)。我有所有松散的api代码,我只需要帮助代码计算一个人已离开信标区域的时间,如果超过15分钟,则执行一些代码。这是代码..它通过循环,但如果用户重新进入某个区域,它就不会选择它。
func locationManager(manager: CLLocationManager!,
didExitRegion region: CLRegion!) {
outOfRegion = true
let start = NSDate(); // <<<<<<<<<< Start time
let viewController:ViewController = window!.rootViewController as! ViewController
var names = viewController.theName
NSLog("You exited the region")
sendLocalNotificationWithMessage("You exited the region", playSound: true)
println(locationManager)
while (outOfRegion) {
println(outOfRegion)
let end = NSDate(); // <<<<<<<<<< end time
let timeInterval: Double = end.timeIntervalSinceDate(start); // <<<<< Difference in seconds (double)
println("Time to evaluate problem: \(timeInterval) seconds");
manager.startMonitoringForRegion(region as! CLBeaconRegion)
manager.startUpdatingLocation()
if (timeInterval > 60) {
//posting to slack API
var channel = "#botspam"
let username = "spyBot"
let text = names + " has left the office"
let image = ":eyes:"
//payload array
let str = "payload={\"channel\": \"\(channel)\", \"username\": \"\(username)\", \"text\": \"\(text)\", \"icon_emoji\": \"\(image)\"}"
// converting to JSON
let strData = (str as NSString).dataUsingEncoding(NSUTF8StringEncoding)
let cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringLocalCacheData
//Fusionary web hook
let url = NSURL(string: "///////")
var request = NSMutableURLRequest(URL: url!, cachePolicy: cachePolicy, timeoutInterval: 2.0)
request.HTTPMethod = "POST"
request.HTTPBody = strData
//checking to see if array is valid JSON
var error : NSError? = nil
if let data = NSURLConnection.sendSynchronousRequest(request, returningResponse: nil, error: &error) {
let results = NSString(data:data, encoding:NSUTF8StringEncoding)
println(results)
}
else
{
println("data invalid")
println(error)
}
break;
}
println("bye")
}
}
答案 0 :(得分:1)
不确定您是否能够仅使用iOS应用程序实现此目的 - iOS严重限制应用程序的后台处理。除非您是音乐或位置应用程序并且只需要在后台持续运行,否则您将只在特定事件发生时被授予后台执行时间 - 例如。进入灯塔的范围。据我所知,没有办法让iOS应用程序“在15分钟内”醒来,所以我很想知道你的意思是什么“有效”。
如果我们考虑在堆栈中添加更多层,我会尝试实现如下用例:
didExitRegion
)并向外部服务器发送消息:用户X退出[此处时间戳] 上的区域。 didEnterRegion
)并向服务器发送请求以取消向Slack发布。答案 1 :(得分:0)
首先,检查此主题并确保您在locationManager上执行某些操作:didEnterRegion - &gt; locationManager:didEnterRegion not called when a beacon is detected
此外,当您进入区域时,iBeacon不会立即调用您的方法。不幸的是,这个过程类似于通知 - 它会在决定时发生。
祝你好运。