簡體   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