繁体   English   中英

像睡眠周期一样的闹钟ios swift

[英]alarm clock like sleep cycle ios swift

我一直在寻找答案,但没有找到。 我想创建一些类似于闹钟的应用程序。

它的功能之一将在用户指定的时间醒来(不足为奇)。 如果您查看睡眠周期应用程序,您会注意到它可以唤醒您,但它也可以跟踪您的睡眠,因此它必须在后台运行。 此外,它还可以播放唤醒您的歌曲,直到您将其关闭为止(不仅限于30秒钟,这是通知声音长度的限制)。 它还可以调高设备的音量。

如果我还没有真正看到这个应用程序,那么我就不会相信开发人员可以在iPhone上实现这种功能。

我目前的进度:

  1. 我可以在用户指定的时间播放声音,但前提是应用程序处于前台。 如果播放了声音,然后用户单击“主页”按钮,声音仍然会播放(很酷),但是如果应用程序处于后台,则音乐无法开始播放。 这是一些代码:

     do { try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, withOptions: AVAudioSessionCategoryOptions.MixWithOthers) print("AVAudioSession Category Playback OK") do { try AVAudioSession.sharedInstance().setActive(true) print("AVAudioSession is Active") } catch let error as NSError { print(error.localizedDescription) } } catch let error as NSError { print(error.localizedDescription) } 

    然后我用

     AVAudioPlayer 
    播放一些声音。 因此,第一个问题是:如何像睡眠周期应用程序一样播放背景声音? 而且我确定睡眠周期不会使用通知声音。

我的第二个问题是如何更改设备的音量(睡眠周期也可以做到这一点,但是在堆栈溢出的情况下,很多人说这是不可能的)。

请帮忙 :)

好的,所以我设法使用一些技巧:

首先,这是可以帮助我设置音频播放器的功能:

func setupAudioPlayerWithFile(file:NSString, type:NSString) -> AVAudioPlayer?  {
    //1
    let path = NSBundle.mainBundle().pathForResource(file as String, ofType: type as String)
    let url = NSURL.fileURLWithPath(path!)

    //2
    var audioPlayer:AVAudioPlayer?

    // 3
    do {
        try audioPlayer = AVAudioPlayer(contentsOfURL: url)
    } catch {
        NSLog("Player not available")
    }

    return audioPlayer
}

然后,当用户按下按钮“启动警报”时,我这样做:

silence_audio = setupAudioPlayerWithFile("silence", type:"wav");
silence_audio?.numberOfLoops = -1;
silence_audio?.volume = 1;
silence_audio?.play();

您可以猜到它什么都没发出来-空着的声音。 苹果说:

对于需要更多执行时间才能实现的任务,您必须请求特定的权限才能在后台运行它们而不暂停它们。 在iOS中,只允许特定的应用类型在后台运行:

-在后台播放可听内容的应用程序,例如音乐播放器应用程序

连续播放或录制音频的应用程序(即使该应用程序在后台运行)也可以注册以在后台执行这些任务。 您可以从Xcode项目中“功能”选项卡的“背景模式”部分启用音频支持。 (您还可以通过在应用程序的Info.plist文件中包含音频值和UIBackgroundModes键来启用此支持。)

而且我还必须这样做: 在此处输入图片说明

之后,我的应用程序便可以不受限制地在后台运行。 如果Apple不允许我发布它,我将开始使用麦克风或类似的东西。 没有该功能,将无法执行闹钟应用程序。

而且设备的更改量非常简单:

    let volumeView = MPVolumeView()
    if let view = volumeView.subviews.first as? UISlider{
        view.value = 0.3
    }

然后将view.value设置为0-1。

希望它会有所帮助:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM