斯威夫特 - 在灯塔附近播放声音

时间:2015-02-10 22:47:26

标签: swift xcode6 ibeacon estimote

我买了一些信标,然后按照一些教程开始玩它们。 我现在有一点问题,用下面的代码我可以成功地改变我的iPhone的背景颜色,但声音(3分钟MP3)在几秒钟后循环。

如何修改我的代码才能继续?

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

    let knownBeacon = beacons.filter{ $0.proximity != CLProximity.Unknown }
    if knownBeacon.count > 0 {
        let nearestBeacon = knownBeacon[0] as CLBeacon
        self.view.backgroundColor = self.colors[nearestBeacon.minor.integerValue]

        if nearestBeacon.minor.integerValue == 15879 {
            audioPlayer = AVAudioPlayer(contentsOfURL: NSURL(fileURLWithPath: path!), fileTypeHint: "mp3", error: nil)
            if let sound = audioPlayer {
                sound.prepareToPlay()
                sound.play()
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

只要你附近有一个信标,你的循环就会运行。可能还有其他方法,但我能想到的是使用简单的NSTimer。

在类

下面的项目顶部添加一个bool
var beaconEnabled : Bool = true

将您的代码更改为此类似内容。注意“beaconEnabled = true”和play()函数之后的NSTimer。将300秒更改为您需要的任何内容。

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

    if beaconEnabled {

        let knownBeacon = beacons.filter{ $0.proximity != CLProximity.Unknown }
        if knownBeacon.count > 0 {
            let nearestBeacon = knownBeacon[0] as CLBeacon
            self.view.backgroundColor = self.colors[nearestBeacon.minor.integerValue]

            if nearestBeacon.minor.integerValue == 15879 {
                audioPlayer = AVAudioPlayer(contentsOfURL: NSURL(fileURLWithPath: path!), fileTypeHint: "mp3", error: nil)
                if let sound = audioPlayer {
                    sound.prepareToPlay()
                    sound.play()
                    beaconEnabled = false
                    NSTimer.scheduledTimerWithTimeInterval(300.0, target: self, selector: Selector("enableBeacon"), userInfo: nil, repeats: false)
                }
            }
        }
    }
}

然后添加此功能以再次启用您的信标

func enableBeacon () {
    beaconEnabled = true
}

这将等待300秒才能再次播放声音。