当用户退出该区域超过15分钟时,尝试将iBeacon应用程序发布到休闲室

时间:2015-05-26 19:10:40

标签: swift ibeacon

我一直在研究一个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")

        }



       }

2 个答案:

答案 0 :(得分:1)

不确定您是否能够仅使用iOS应用程序实现此目的 - iOS严重限制应用程序的后台处理。除非您是音乐或位置应用程序并且只需要在后台持续运行,否则您将只在特定事件发生时被授予后台执行时间 - 例如。进入灯塔的范围。据我所知,没有办法让iOS应用程序“在15分钟内”醒来,所以我很想知道你的意思是什么“有效”。

如果我们考虑在堆栈中添加更多层,我会尝试实现如下用例:

  1. 用户退出信标区域,应用程序被唤醒(didExitRegion)并向外部服务器发送消息:用户X退出[此处时间戳] 上的区域。
  2. 服务器安排在收到的时间戳后15分钟内执行操作,然后发布到Slack。
  3. 如果用户在时间用完之前返回该区域,应用程序将被唤醒(didEnterRegion)并向服务器发送请求以取消向Slack发布。
  4. 如果用户在时间用完之前没有返回该区域,则服务器会发布到Slack。

答案 1 :(得分:0)

首先,检查此主题并确保您在locationManager上执行某些操作:didEnterRegion - &gt; locationManager:didEnterRegion not called when a beacon is detected

此外,当您进入区域时,iBeacon不会立即调用您的方法。不幸的是,这个过程类似于通知 - 它会在决定时发生。

祝你好运。