2012-05-03 34 views
22

Thiết kế một hệ thống âm nhạc sinh sản dành cho iOS, sử dụng OpenFrameworks, tôi sẽ cần phải cung cấp một chế độ trong đó người dùng có thể nghe nhạc được tạo ra bởi các ứng dụng khi:Cách xử lý phát âm thanh nền trong khi thiết bị iOS bị khóa hoặc trên một ứng dụng khác?

  • điện thoại bị khóa
  • người dùng sử dụng ứng dụng khác

Một số ứng dụng như BLOOM, hoặc đồng hồ báo thức, hoạt động như thế và đề xuất cho người dùng bật/tắt tính năng này.

Bất kỳ mẹo nào cho điều đó?

Trả lời

34

Chơi Bối cảnh âm thanh

Một ứng dụng đóng hoặc ghi âm thanh liên tục (ngay cả khi ứng dụng là chạy ở chế độ nền) có thể đăng ký để thực hiện những nhiệm vụ trong nền . Bạn bật hỗ trợ âm thanh từ phần Chế độ nền của tab Khả năng trong dự án Xcode của bạn. (Bạn cũng có thể bật hỗ trợ này bằng cách bao gồm khóa UIBackgroundModes với giá trị âm thanh trong tệp Info.plist của ứng dụng của bạn.) Các ứng dụng phát nội dung âm thanh trong nền phải phát nội dung âm thanh và không tắt tiếng.

Apple reference "Playing and Recording Background Audio"

Ensuring That Audio Continues When the Screen Locks

Đối bật/tắt tính năng này tôi thấy Activating and Deactivating Your Audio Session, tôi đã không thử nó bản thân mình, nhưng có vẻ như những gì bạn cần.

+1

Xin chào Danich và cảm ơn rất nhiều câu trả lời của bạn. Có cách nào để thay đổi nó trong thời gian chạy không? – gluon

+0

Tôi đã mở một chuỗi khác cho điểm cụ thể này: http://stackoverflow.com/questions/10504432/how-can-we-handle-enable-disable-background-audio-abilities-at-runtime-on-ios-de – gluon

+1

Rất tiếc, không nhận thấy câu hỏi của bạn về bật/tắt. Tôi nghĩ rằng chủ đề mới không phải là một ý tưởng tốt. Đã cập nhật câu trả lời của tôi. Chấp nhận, nếu bạn nghĩ nó hữu ích. – DanSkeel

29

Bạn cần thực hiện một vài thay đổi trong tệp plist.

ví dụ: 1) Set chế độ nền buộc App đóng audio

2) thiết lập ứng dụng không chạy ở chế độ nền để NO.

NSError *setCategoryErr = nil; 
NSError *activationErr = nil; 
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error:&setCategoryErr]; 
[[AVAudioSession sharedInstance] setActive:YES error:&activationErr]; 

Sau đó, bạn cần phải viết những nhiều mã trong appdelegate

Bây giờ, bạn có thể dễ dàng chạy âm thanh trong khi khóa màn hình điện thoại hoặc đi ở chế độ nền.

+6

"Ứng dụng không chạy ở chế độ nền" phải được đặt thành "NO" – ctpenrose

+2

là tuyệt vời, cảm ơn. Tôi cũng cần thiết lập Khả năng> Chế độ nền> Âm thanh & AirPlay – Dunc

+0

Tôi viết mã này ở đâu? – Danpe

-1

Ngoài ra bạn có thể sử dụng mã này:

AVAudioSession *session = [AVAudioSession sharedInstance]; 
[session setCategory:AVAudioSessionCategoryPlayback error:NULL]; 

AVAudioSession *backgroundMusic = [AVAudioSession sharedInstance]; 

[backgroundMusic setCategory:AVAudioSessionCategoryPlayback error:NULL]; 
2

Make những thay đổi sau trong cài đặt dự án Xcode cũng như trong mã.

bước 1) Chọn tệp dự án của bạn trong Bộ điều hướng của Xcode. Sau đó, từ phần Khả năng, hãy chuyển sang phần phụ Chế độ nền. Sau khi danh sách các chế độ nền được cung cấp cho bạn, hãy đánh dấu vào công tắc Chuyển đổi âm thanh &.

stp 2) Sử dụng sau mã nhanh, về cơ bản bạn cần đặt phiên âm thanh cho ứng dụng của mình.

var audioPlayer : AVAudioPlayer! 

@IBAction func playButtonClicked(sender : AnyObject){ 

    let dispatchQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) 
    dispatch_async(dispatchQueue, { 

     if let data = NSData(contentsOfFile: self.audioFilePath()) 
     { 
      do{ 
       let session = AVAudioSession.sharedInstance() 

       try session.setCategory(AVAudioSessionCategoryPlayback) 
       try session.setActive(true) 

       self.audioPlayer = try AVAudioPlayer(data: data) 
       //self.audioPlayer.delegate = self 
       self.audioPlayer.prepareToPlay() 
       self.audioPlayer.play() 
      } 
      catch{ 
       print("\(error)") 
      } 
     } 
    }); 
} 

func audioFilePath() -> String{ 

    let filePath = NSBundle.mainBundle().pathForResource("mySong", ofType: "mp3")! 
    return filePath 
} 

Phiên phát lại âm thanh này sẽ phát lại ứng dụng của bạn, ngay cả khi ứng dụng ở chế độ nền hoặc điện thoại ở chế độ im lặng hoặc thiết bị bị khóa.

0

Bạn cần phải thực hiện vài thay đổi trong file plist.

1) Đặt chế độ nền bắt buộc thành Ứng dụng phát âm thanh

2) thiết lập Ứng dụng không chạy ở chế độ nền thành NO.

let dispatchQueue = DispatchQueue.global() 
      dispatchQueue.async(execute: { 
        do{ 
         let session = AVAudioSession.sharedInstance() 

         try session.setCategory(AVAudioSessionCategoryPlayback) 
         try session.setActive(true) 

         self.isObjectAllocate = true 
         if self.isPlayed == false{ 
          self.playSound(soundName: "http://radio.zahraun.com:8000/live.m3u") 
          self.isPlayed = true 
          self.btnPlayAudio.setImage(#imageLiteral(resourceName: "pause") , for: .normal) 

         }else{ 
          self.audioPlayer.pause() 
          self.isPlayed = false 
          self.btnPlayAudio.setImage(#imageLiteral(resourceName: "audioPlay"), for: .normal) 
         } 
        } 
        catch{ 
         print("\(error)") 
        } 
      });