2017-04-05 15 views
5

Tôi muốn hiển thị lời bài hát từ bài hát hiện đang được chơi bởi trình phát hệ thống iOS.Cách tải bài hát cho bài hát Now Playing trong iOS10 (Swift 3)

Đây là máy nghe nhạc tùy chỉnh của tôi:

import UIKit 
import MediaPlayer 
import AVFoundation 

class NowPlayingController: NSObject { 
    var musicPlayer: MPMusicPlayerController { 
     if musicPlayer_Lazy == nil { 
      musicPlayer_Lazy = MPMusicPlayerController.systemMusicPlayer() 

      let center = NotificationCenter.default 
      center.addObserver(self, 
       selector: #selector(self.playingItemDidChange), 
       name: NSNotification.Name.MPMusicPlayerControllerNowPlayingItemDidChange, 
       object: musicPlayer_Lazy) 
      musicPlayer_Lazy!.beginGeneratingPlaybackNotifications() 
     } 

     return musicPlayer_Lazy! 
    } 
    private var musicPlayer_Lazy: MPMusicPlayerController? 

    var nowPlaying: MPMediaItem? 

    //If song changes 
    func playingItemDidChange(notification: NSNotification) { 
     nowPlaying = musicPlayer.nowPlayingItem 
    } 
} 

Để có được lời bài hát từ nowPlaying mục Tôi đã thử 2 cách tiếp cận và cả trong số họ luôn trở nil.

Mã này luôn trả về nil:

let lyricsText = nowPlaying?.value(forProperty: MPMediaItemPropertyLyrics) as? NSString as String? 

Trong đoạn mã sau MPMediaItemPropertyAssetURL luôn trả nil thay vì URL thực tế:

let songUrl = nowPlaying?.value(forProperty: MPMediaItemPropertyAssetURL) as? NSURL as URL? 
if songUrl != nil { 
    let songAsset = AVURLAsset(url: songUrl!, options: nil) 
    lyricsText = songAsset.lyrics 

Tất cả các bài hát được trên thiết bị (đồng bộ hóa bằng iTunes), chứa lời bài hát (hiển thị trong trình phát hệ thống) và không được bảo vệ bởi DRM (đã tắt aac/mp3).

Tôi đang thử nghiệm này trên thiết bị thực: 6s iPhone/iOS 10,3

Bất kỳ lời đề nghị làm thế nào tôi có thể nhận được lời bài hát hay tại sao MPMediaItemPropertyAssetURL trả về nil?

+0

Những ngày này, hầu hết nội dung iTunes được bảo vệ bởi FairPlay DRM hoặc là Apple Music (cũng được bảo vệ bởi FairPlay? Không biết.) & Loại nội dung này luôn trả về một nil 'MPMediaItemPropertyAssetURL'. Bạn chỉ được sử dụng nó trong một thời trang "jukebox", nơi iOS phát nhạc trở lại cho bạn. Các trường hợp sử dụng phức tạp hơn là không thể. –

+0

Bạn đã thử truy cập như dưới đây? 'let lyric = nowPlaying? .lyrics cho assetUrl = nowPlaying? .assetURL' cũng lưu ý rằng – Bluewings

+0

@RhythmicFistman đây không phải là trường hợp, vì nội dung của tôi không phải là nội dung trên iTunes Store. Nhưng dù sao thì tôi cũng đã kiểm tra lại bằng phương thức sau để trả về 'false' (nghĩa là không có DRM trên bài hát):' nowPlaying? .hasProtectedAsset' – dandepeched

Trả lời

1

Tôi không biết tại sao nó không hoạt động, nhưng có vẻ như cùng một mã bây giờ hoạt động tốt. Có lẽ nó bằng cách nào đó kết nối với singleton mà tôi đang sử dụng cho người chơi. Đây là phiên bản Swift 3 100% hoạt động:

import UIKit 
import MediaPlayer 
import AVFoundation 

class NowPlayingController: NSObject { 

    static let sharedController = NowPlayingController() 

    //MARK: Init 
    private override init() { 
     super.init() 

     var musicPlayer_Lazy: MPMusicPlayerController? 

     // System player instance 
     if musicPlayer_Lazy == nil { 
      musicPlayer_Lazy = MPMusicPlayerController.systemMusicPlayer() 
      NotificationCenter.default.addObserver(self, 
               selector: #selector(self.playingItemDidChange), 
               name: NSNotification.Name.MPMusicPlayerControllerNowPlayingItemDidChange, 
               object: musicPlayer_Lazy) 
      musicPlayer_Lazy!.beginGeneratingPlaybackNotifications() 
     } 

     self.musicPlayer = musicPlayer_Lazy! 
    } 

    // MARK: Class properties 
    var musicPlayer: MPMusicPlayerController! 
    var nowPlaying: MPMediaItem? 

    // MARK: Methods 
    func playingItemDidChange(notification: NSNotification) { 
     nowPlaying = musicPlayer.nowPlayingItem 
     NotificationCenter.default.post(newSongNotification as Notification) 
    } 

    func getLyrics() { 
     let songUrl = nowPlaying?.value(forProperty: MPMediaItemPropertyAssetURL) as? URL 
     let songAsset = AVURLAsset(url: songUrl!, options: nil) 
     let lyricsText = songAsset.lyrics 
    } 
} 
Các vấn đề liên quan