() translation by (you can also view the original English article)



AV Foundation adalah kerangka kerja untuk bekerja dengan audio dan visual media di iOS dan OSX. Menggunakan AV Foundation, Anda dapat memainkan, menangkap, dan menyandikan media. Ini merupakan kerangka kerja yang luas dan untuk tujuan tutorial ini kita akan fokus pada porsi audio. Secara khusus, kita akan menggunakan kelas AVAudioPlayer
untuk memutar file MP3.
Proyek Starter
Saya telah menyediakan proyek awal yang memiliki semua tindakan dan outlet yang sudah dikonfigurasi, dan dengan metode yang tepat mematikan. Kelas yang digunakan oleh proyek, sudah mati juga sehingga kita bisa langsung masuk ke kode. Anda dapat mengunduh proyek starter dari GitHub.
1. Menghubungkan Kerangka AV Foundation
Sebelum Anda dapat menggunakan AV Foundation, Anda harus menghubungkan proyek tersebut dengan framework. Di Navigator Proyek, pastikan proyek Anda dipilih. Di bawah tab General, pergi ke Linked Frameworks and Libraries dan dari sana Anda memilih AVFoundation.framework.



2. FileReader
Class
Dalam proyek awal, Anda akan menemukan file bernama FileReader.swift. Buka file ini untuk melihat isinya.
1 |
import UIKit |
2 |
|
3 |
class FileReader: NSObject { |
4 |
|
5 |
}
|
Ini adalah tulisan rintisan sederhana dari kelas yang akan kita gunakan untuk membaca file dari disk. Itu mewarisi dari NSObject
. Kami akan menerapkan metode, readFiles
, yang akan menjadi tipe metode. Tipe metode memungkinkan Anda untuk memanggil metode di kelas itu sendiri, jenis, sebagai lawan dari sebuah instance dari kelas. Di bawah ini adalah implementasi metode readFiles
.
1 |
class func readFiles() -> [String] { |
2 |
return NSBundle.mainBundle().pathsForResourcesOfType("mp3", inDirectory: nil) as! [String] |
3 |
}
|
Paket utama berisi kode dan sumber daya untuk proyek Anda, dan di sinilah kita akan menemukan MP3. Kami menggunakan metode metode pathSForResourcesOfType (_: inDirectory :)
, yang mengembalikan larik yang berisi nama path untuk jenis sumber daya yang ditentukan. Dalam hal ini, kami mencari tipe "mp3"
. Karena kami tidak tertarik dengan direktori tertentu, kami lulus dalam nol
.
Kelas ini akan digunakan oleh kelas MP3Player
, yang akan kita kerjakan selanjutnya.
3. MP3Player
Class
Selanjutnya, buka MP3Player.swift dan lihat isinya.
1 |
import UIKit |
2 |
import AVFoundation |
3 |
|
4 |
class MP3Player: NSObject, AVAudioPlayerDelegate { |
5 |
|
6 |
}
|
Perhatikan bahwa kami mengadopsi protokol AVAudioPlayerDelegate
. Protokol ini menyatakan sejumlah metode yang berguna, salah satunya adalah audioPlayerDidFinishPlaying (_: berhasil :)
. Dengan menerapkan metode audioPlayerDidFinishPlaying (_: berhasil :)
, kami akan diberitahu ketika audio telah selesai diputar.
Langkah 1: Properti
Tambahkan yang berikut ini ke MP3Player.swift.
1 |
class MP3Player: NSObject, AVAudioPlayerDelegate { |
2 |
var player:AVAudioPlayer? |
3 |
var currentTrackIndex = 0 |
4 |
var tracks:[String] = [String]() |
5 |
}
|
Properti pemutar
akan menjadi instance kelas AVAudioPlayer
, yang akan kita gunakan untuk memutar, menjeda, dan menghentikan MP3. Variabel currentTrackIndex
melacak MP3 yang sedang diputar. Akhirnya, variabel trek
akan menjadi larik jalur ke daftar MP3 yang termasuk dalam bundel aplikasi.
Langkah 2: init
1 |
override init(){ |
2 |
tracks = FileReader.readFiles() |
3 |
super.init() |
4 |
queueTrack(); |
5 |
}
|
Selama inisialisasi, kami memanggil metode readFiles
FileReader
untuk mengambil jalur MP3 dan menyimpan daftar ini di lintasan trek
. Karena ini adalah penginisialisasi yang ditunjuk, kita harus memanggil metode init
dari superclass. Akhirnya, kami memanggil queueTrack
, yang akan kami tulis berikutnya.
Langkah 3: queueTrack
Tambahkan implementasi berikut untuk metode queueTrack
ke kelas MP3Player
.
1 |
func queueTrack(){ |
2 |
if (player != nil) { |
3 |
player = nil |
4 |
}
|
5 |
|
6 |
var error:NSError? |
7 |
let url = NSURL.fileURLWithPath(tracks[currentTrackIndex] as String) |
8 |
player = AVAudioPlayer(contentsOfURL: url, error: &error) |
9 |
|
10 |
if let hasError = error { |
11 |
//SHOW ALERT OR SOMETHING
|
12 |
} else { |
13 |
player?.delegate = self |
14 |
player?.prepareToPlay() |
15 |
}
|
16 |
}
|
Karena kami akan melakukan instantiasi instance AVAudioPlayer
baru setiap kali metode ini dipanggil, kami melakukan sedikit pembenahan dengan mengatur pemain
ke nol
.
Kami menyatakan NSError
opsional dan url
konstan. Kami memanggil fileURLWithPath (_ :)
untuk mengambil jalur ke MP3 saat ini dan menyimpan nilai dalam url
. Kami melewati lintasan trek
sebagai parameter menggunakan currentTrackIndex
sebagai subskripnya. Ingat lintasan trek berisi jalur ke MP3, bukan referensi ke file MP3 itu sendiri.
Untuk instantiate pemutar
, kami meneruskan variabel konstanta dan kesalahan
url
ke penginisialisasi AVAudioPlayer
. Jika inisialisasi terjadi gagal, variabel kesalahan
diisi dengan penjelasan mengenai kesalahan.
Jika kami tidak menemukan kesalahan, kami menetapkan delegasi pemain ke diri sendiri
dan meminta metode prepareToPlay
pada pemain. Metode prepareToPlay
melakukan pramuat buffer dan memperoleh perangkat keras audio, yang meminimalkan lag apa pun saat memanggil metode putar
.
Langkah 4: mainkan
Metode bermain
pertama memeriksa untuk melihat apakah audio sudah bermain dengan memeriksa properti bermain
aptly bernama. Jika audio tidak diputar, maka akan mengaktifkan metode putar
dari properti pemutar
.
1 |
func play() { |
2 |
if player?.playing == false { |
3 |
player?.play() |
4 |
}
|
Langkah 5: berhenti
Metode berhenti
pertama memeriksa apakah pemutar audio sudah bermain. Jika ya, itu akan memanggil metode berhenti
dan mengatur properti currentTime
ke 0. Ketika Anda memanggil metode berhenti
, itu hanya menghentikan audio. Itu tidak mengatur ulang audio kembali ke awal, itulah sebabnya mengapa kita perlu melakukannya secara manual.
1 |
func stop(){ |
2 |
if player?.playing == true { |
3 |
player?.stop() |
4 |
player?.currentTime = 0 |
5 |
}
|
6 |
}
|
Langkah 6: menjeda
Sama seperti metode berhenti
, pertama-tama kita periksa untuk melihat apakah pemutar audio sedang diputar. Jika ya, kami meminta metode jeda
.
1 |
func pause(){ |
2 |
if player?.playing == true{ |
3 |
player?.pause() |
4 |
}
|
5 |
}
|
Langkah 7: nextSong
Metode nextSong (_: Bool)
akan memasukkan lagu berikutnya dan, jika pemain sedang bermain, memainkan lagu itu. Kami tidak ingin lagu berikutnya diputar jika pemain dijeda. Namun, metode ini juga disebut ketika sebuah lagu selesai diputar. Dalam hal ini, kami ingin memainkan lagu berikutnya, yang menjadi tujuan dari lagu parameterFinishedPlaying
.
1 |
func nextSong(songFinishedPlaying:Bool){ |
2 |
var playerWasPlaying = false |
3 |
if player?.playing == true { |
4 |
player?.stop() |
5 |
playerWasPlaying = true |
6 |
}
|
7 |
|
8 |
currentTrackIndex++ |
9 |
if currentTrackIndex >= tracks.count { |
10 |
currentTrackIndex = 0 |
11 |
}
|
12 |
queueTrack() |
13 |
if playerWasPlaying || songFinishedPlaying { |
14 |
player?.play() |
15 |
}
|
16 |
}
|
Variabel playerWasPlaying
digunakan untuk memberi tahu apakah pemain sedang bermain saat metode ini dipanggil atau tidak. Jika lagu itu diputar, kami meminta metode berhenti
pada pemutar
dan mengatur pemutarWasPlaying
menjadi true
.
Selanjutnya, kami menaikkan currentTrackIndex
dan memeriksa untuk melihat apakah itu lebih besar dari atau sama dengan tracks.count
. Hitung
milik larik memberi kita jumlah total item dalam larik. Kita harus yakin bahwa kita tidak mencoba mengakses elemen yang tidak ada di lintasan trek
. Untuk mencegah ini, kami mengatur currentTrackIndex
kembali ke elemen pertama dari array jika itu adalah kasusnya.
Akhirnya, kita memanggil queueTrack
untuk mendapatkan lagu berikutnya siap dan memainkan lagu itu jika salah satu pemainWasPlaying
atau songFinishedPlaying
adalah benar
.
Langkah 8: previousSong
Metode previousSong
bekerja sangat mirip dengan nextSong
. Satu-satunya perbedaan adalah kita menurunkan currentTrackIndex
dan memeriksa apakah itu sama dengan 0. Jika ya, kita atur ke indeks elemen terakhir dalam array.
1 |
func previousSong(){ |
2 |
var playerWasPlaying = false |
3 |
if player?.playing == true { |
4 |
player?.stop() |
5 |
playerWasPlaying = true |
6 |
}
|
7 |
currentTrackIndex-- |
8 |
if currentTrackIndex < 0 { |
9 |
currentTrackIndex = tracks.count - 1 |
10 |
}
|
11 |
|
12 |
queueTrack() |
13 |
if playerWasPlaying { |
14 |
player?.play() |
15 |
}
|
16 |
}
|
17 |
Dengan memanfaatkan metode nextSong
dan previousSong
, kita dapat menggilir semua MP3 dan memulai kembali ketika kita mencapai awal atau akhir daftar.
Langkah 9: getCurrentTrackName
Metode getCurrentTrackName
mendapatkan nama MP3 tanpa ekstensi.
1 |
func getCurrentTrackName() -> String { |
2 |
let trackName = tracks[currentTrackIndex].lastPathComponent.stringByDeletingPathExtension |
3 |
return trackName |
4 |
}
|
Kami mendapatkan referensi untuk apa pun MP3 saat ini dengan menggunakan trek [currentTrackIndex]
. Ingat, bagaimanapun, bahwa ini adalah jalur ke MP3 dan bukan file sebenarnya itu sendiri. Jalurnya agak panjang, karena itu adalah path lengkap ke file MP3.
Di komputer saya, misalnya, elemen pertama dari lintasan trek
sama dengan "/Users/jamestyner/Library/Developer/CoreSimulator/Devices/80C8CD34-22AE-4F00-862E-FD41E2D8D6BA/data/Containers/Bundle/Application/3BCF8543-BA1B-4997-9777-7EC56B1C4348/MP3Player.app/Lonesome Road Blues.mp3". Jalur ini akan berbeda pada perangkat yang sebenarnya tentu saja.
Kami punya string besar yang berisi jalur ke MP3, tetapi kami hanya ingin nama MP3 itu sendiri. Kelas NSString
mendefinisikan dua properti yang dapat membantu kita. Seperti namanya, properti lastPathComponent
mengembalikan komponen terakhir dari sebuah path. Seperti yang Anda duga, properti stringByDeletingPathExtension
menghapus ekstensi.
Langkah 10: getCurrentTimeAsString
Metode getCurrentTimeAsString
menggunakan properti currentTime
dari instance pemain
dan mengembalikannya sebagai string yang dapat dibaca manusia (misalnya, 1:02).
1 |
func getCurrentTimeAsString() -> String { |
2 |
var seconds = 0 |
3 |
var minutes = 0 |
4 |
if let time = player?.currentTime { |
5 |
seconds = Int(time) % 60 |
6 |
minutes = (Int(time) / 60) % 60 |
7 |
}
|
8 |
return String(format: "%0.2d:%0.2d",minutes,seconds) |
9 |
}
|
Properti currentTime
adalah tipe NSTimeInterval
, yang hanya merupakan typealias
untuk Double
. Kami menggunakan beberapa matematika untuk mendapatkan detik
dan menit
, memastikan kami mengonversi waktu
ke Int
karena kami perlu bekerja dengan bilangan bulat. Jika Anda tidak akrab dengan operator sisanya (%), ia menemukan sisanya setelah pembagian satu nomor dengan yang lain. Jika variabel waktu
sama dengan 65, maka detik
akan sama dengan 5 karena kita menggunakan 60.
Langkah 11: getProgress
Metode getProgress
digunakan oleh instance UIProgressView
untuk memberikan indikasi seberapa banyak MP3 telah diputar. Kemajuan ini diwakili oleh nilai dari 0,0 hingga 1,0 sebagai Float
.
1 |
func getProgress()->Float{ |
2 |
var theCurrentTime = 0.0 |
3 |
var theCurrentDuration = 0.0 |
4 |
if let currentTime = player?.currentTime, duration = player?.duration { |
5 |
theCurrentTime = currentTime |
6 |
theCurrentDuration = duration |
7 |
}
|
8 |
return Float(theCurrentTime / theCurrentDuration) |
9 |
}
|
Untuk mendapatkan nilai ini, kami membagi properti currentTime
pemain
berdasarkan properti durasi
pemain
, kami menyimpan nilai-nilai ini dalam variabel theCurrentTime
dan theCurrentDuration
. Seperti currentTime
, properti durasi
adalah tipe NSTimeInterval
dan ini mewakili durasi lagu dalam hitungan detik.
Langkah 12: setVolume
Metode setVolume (_: Float)
memanggil metode setVolume
dari instance pemain
.
1 |
func setVolume(volume:Float){ |
2 |
player?.volume = volume |
3 |
}
|
Langkah 13: audioPlayerDidFinishPlaying(_:successfully:)
Metode audioPlayerDidFinishPlaying (_: berhasil :)
adalah metode dari protokol AVAudioPlayerDelegate
. Metode ini mengambil parameter sebagai instance AVAudioPlayer
dan boolean. Boolean diatur ke true
jika pemutar audio telah selesai memutar lagu saat ini.
1 |
func audioPlayerDidFinishPlaying(player: AVAudioPlayer, successfully flag: Bool){ |
2 |
if flag == true { |
3 |
nextSong(true) |
4 |
}
|
5 |
}
|
Jika lagu berhasil selesai diputar, kita memanggil metode nextSong
, menyampaikannya dengan benar
sejak lagu selesai diputar sendiri.
Ini melengkapi kelas MP3Player
. Kami akan mengunjunginya kembali beberapa saat kemudian, setelah menerapkan tindakan kelas ViewController
.
4. Kelas ViewController
Buka ViewController.swift dan lihat isinya.
1 |
mport UIKit |
2 |
import AVFoundation |
3 |
|
4 |
class ViewController: UIViewController { |
5 |
var mp3Player:MP3Player? |
6 |
var timer:NSTimer? |
7 |
|
8 |
@IBOutlet weak var trackName: UILabel! |
9 |
@IBOutlet weak var trackTime: UILabel! |
10 |
@IBOutlet weak var progressBar: UIProgressView! |
11 |
|
12 |
override func viewDidLoad() { |
13 |
super.viewDidLoad() |
14 |
|
15 |
}
|
16 |
@IBAction func playSong(sender: AnyObject) { |
17 |
|
18 |
}
|
19 |
@IBAction func stopSong(sender: AnyObject) { |
20 |
|
21 |
}
|
22 |
|
23 |
@IBAction func pauseSong(sender: AnyObject) { |
24 |
|
25 |
}
|
26 |
|
27 |
@IBAction func playNextSong(sender: AnyObject) { |
28 |
}
|
29 |
|
30 |
|
31 |
@IBAction func setVolume(sender: UISlider) { |
32 |
|
33 |
}
|
34 |
|
35 |
@IBAction func playPreviousSong(sender: AnyObject) { |
36 |
|
37 |
}
|
38 |
|
39 |
|
40 |
override func didReceiveMemoryWarning() { |
41 |
super.didReceiveMemoryWarning() |
42 |
// Dispose of any resources that can be recreated.
|
43 |
}
|
44 |
}
|
Variabel mp3Player
adalah contoh dari kelas MP3Player
yang kami terapkan sebelumnya. Variabel timer
akan digunakan untuk memperbarui trackTime
dan progressBar
views setiap detik.
Dalam beberapa langkah selanjutnya, kami akan menerapkan tindakan kelas ViewController
. Tapi pertama-tama, kita harus memberi contoh Instance MP3Player
. Perbarui penerapan metode viewDidLoad
seperti yang ditunjukkan di bawah ini.
1 |
override func viewDidLoad() { |
2 |
super.viewDidLoad() |
3 |
mp3Player = MP3Player() |
4 |
}
|
Langkah 1: playSong(_: AnyObject)
Masukkan yang berikut di metode playSong (_: AnyObject)
.
1 |
@IBAction func playSong(sender: AnyObject) { |
2 |
mp3Player?.play() |
3 |
}
|
Dalam metode ini, kita memanggil metode bermain
pada objek mp3Player
. Kami berada di titik di mana kami dapat mulai menguji aplikasi sekarang. Jalankan aplikasi dan tekan tombol putar. Lagu itu harus mulai diputar.
Langkah 2: stopSong (_: AnyObject)
Metode stopSong (_: AnyObject)
memanggil metode berhenti pada objek mp3Player
.
1 |
@IBAction func stopSong(sender: AnyObject) { |
2 |
mp3Player?.stop() |
3 |
}
|
Jalankan aplikasi lagi dan ketuk tombol putar. Anda sekarang harus dapat menghentikan lagu dengan mengetuk tombol stop.
Langkah 3: pauseSong (_: AnyObject)
Seperti yang Anda duga, metode pauseSong (_: AnyObject)
memanggil metode jeda
pada objek mp3Player
.
1 |
@IBAction func pauseSong(sender: AnyObject) { |
2 |
mp3Player?.pause() |
3 |
}
|
Langkah 4: playNextSong (_: AnyObject)
1 |
IBAction func playNextSong(sender: AnyObject) { |
2 |
mp3Player?.nextSong(false) |
3 |
}
|
Di playNextSong (_: AnyObject)
, kita memanggil metode nextSong
pada objek mp3player
. Perhatikan bahwa kita melewatkan false
sebagai parameter, karena lagunya tidak selesai diputar sendiri. Kami secara manual memulai lagu berikutnya dengan menekan tombol berikutnya.
Langkah 5: previousSong (_: AnyObject)
1 |
@IBAction func playPreviousSong(sender: AnyObject) { |
2 |
mp3Player?.previousSong() |
3 |
}
|
Seperti yang Anda lihat, penerapan metode previousSong (_: AnyObject)
sangat mirip dengan nextSong (_: AnyObject)
. Semua tombol pemutar MP3 harus berfungsi sekarang. Jika Anda belum menguji aplikasi, sekarang adalah saat yang tepat untuk memastikan semuanya berjalan sesuai harapan.
Langkah 6: setVolume(_: UISlider)
Metode setVolume (_: UISlider)
memanggil metode setVolume
pada objek mp3Player
. Properti volume adalah tipe Float
. Nilai berkisar dari 0,0 hingga 1,0. Objek UISlider
diatur dengan 0,0 sebagai nilai minimumnya dan 1,0 sebagai nilai maksimumnya.
1 |
@IBAction func setVolume(sender: UISlider) { |
2 |
mp3Player?.setVolume(sender.value) |
3 |
}
|
Jalankan aplikasi sekali lagi dan mainkan dengan penggeser volume untuk menguji bahwa semuanya bekerja dengan benar.
Langkah 7: startTimer
Metode startTimer
instantiates contoh NSTimer
baru.
1 |
func startTimer(){ |
2 |
timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: Selector("updateViewsWithTimer:"), userInfo: nil, repeats: true) |
3 |
}
|
The scheduledTimerWithTimeInterval (_: target: selector: userInfo: repeats :)
initializer mengambil parameter jumlah detik antara pengaktifan timer, objek yang memanggil metode pada ditentukan oleh pemilih
, metode yang dipanggil saat timer menyala , kamus userInfo
opsional, dan apakah timer mengulang sampai tidak valid.
Kami menggunakan metode bernama updateViewsWithTimer (_: NSTimer)
sebagai pemilih, jadi kami akan membuat itu selanjutnya.
Langkah 8: updateViewsWithTimer(_: NSTimer)
Metode updateViewsWithTimer (_: NSTimer)
memanggil metode updateViews
, yang akan kita terapkan pada langkah berikutnya.
1 |
func updateViewsWithTimer(theTimer: NSTimer){ |
2 |
updateViews() |
3 |
}
|
Langkah 9: updateViews
Metode updateViews
memperbarui tampilan trackTime
dan progressBar
.
1 |
func updateViews(){ |
2 |
trackTime.text = mp3Player?.getCurrentTimeAsString() |
3 |
if let progress = mp3Player?.getProgress() { |
4 |
progressBar.progress = progress |
5 |
}
|
6 |
}
|
Properti teks
dari trackTime
diperbarui dengan properti currentTime
, diformat sebagai string dengan menerapkan metode getCurrentTimeAsString
. Kami menyatakan kemajuan
konstan menggunakan metode getProgress
mp3Player
, dan mengatur progressBar.progress
menggunakan konstanta itu.
Langkah 10: Wiring Up the Timer
Sekarang kita perlu memanggil metode startTimer
di tempat yang sesuai. Kita perlu memulai pengatur waktu dalam metode playSong (_: AnyObject)
, metode playNextSong (_: AnyObject)
, dan metode playPreviousSong (_: AnyObject)
.
1 |
@IBAction func playSong(sender: AnyObject) { |
2 |
mp3Player?.play() |
3 |
startTimer() |
4 |
}
|
1 |
@IBAction func playNextSong(sender: AnyObject) { |
2 |
mp3Player?.nextSong(false) |
3 |
startTimer() |
4 |
}
|
1 |
@IBAction func playPreviousSong(sender: AnyObject) { |
2 |
mp3Player?.previousSong() |
3 |
startTimer() |
4 |
}
|
Langkah 11: Menghentikan Timer
Kita juga perlu menghentikan penghitung waktu
ketika tombol jeda dan berhenti ditekan. Anda dapat menghentikan objek pewaktu
dengan menerapkan metode tidak valid
pada instance NSTimer
.
1 |
@IBAction func stopSong(sender: AnyObject) { |
2 |
mp3Player?.stop() |
3 |
updateViews() |
4 |
timer?.invalidate() |
5 |
}
|
1 |
@IBAction func pauseSong(sender: AnyObject) { |
2 |
mp3Player?.pause() |
3 |
timer?.invalidate() |
4 |
}
|
Langkah 12: setTrackName
Metode setTrackName
mengatur properti teks
dari trackName
dengan menerapkan getCurrentTrackName
pada objek mp3Player
.
1 |
func setTrackName(){ |
2 |
trackName.text = mp3Player?.getCurrentTrackName() |
3 |
}
|
Langkah 13: setupNotificationCenter
Ketika sebuah lagu selesai diputar, seharusnya secara otomatis menunjukkan nama lagu berikutnya dan mulai memainkan lagu itu. Juga, ketika pengguna menekan tombol putar, berikutnya, atau sebelumnya, metode setTrackName
harus dipanggil. Tempat yang ideal untuk melakukan ini adalah metode queueTrack
dari kelas MP3Player
.
Kami membutuhkan cara agar kelas MP3Player
memberi tahu kelas ViewController
untuk menjalankan metode setTrackName
. Untuk melakukan itu, kita akan menggunakan kelas NSNotificationCenter
. Pusat notifikasi menyediakan cara untuk menyiarkan informasi di seluruh program. Dengan mendaftar sebagai pengamat dengan pusat pemberitahuan, objek dapat menerima siaran ini dan melakukan operasi. Cara lain untuk menyelesaikan tugas ini adalah menggunakan pola delegasi.
Tambahkan metode berikut ke kelas ViewController
.
1 |
func setupNotificationCenter(){ |
2 |
NSNotificationCenter.defaultCenter().addObserver(self, |
3 |
selector:"setTrackName", |
4 |
name:"SetTrackNameText", |
5 |
object:nil) |
6 |
}
|
Kami terlebih dahulu mendapatkan referensi ke pusat pemberitahuan default. Kami kemudian memanggil metode addObserver (_: selector: name: object :)
di pusat notifikasi. Metode ini menerima empat parameter:
- objek yang mendaftar sebagai pengamat,
diri
dalam kasus ini - pesan yang akan dikirim ke pengamat saat notifikasi diposting
- nama pemberitahuan untuk mendaftarkan pengamat
- objek yang pemberitahuannya ingin diterima oleh pengamat
Dengan meneruskan nil
sebagai argumen terakhir, kami mendengarkan setiap notifikasi yang memiliki nama SetTrackNameText.
Sekarang kita perlu memanggil metode ini dalam metode viewDidLoad
pengontrol tampilan.
1 |
override func viewDidLoad() { |
2 |
super.viewDidLoad() |
3 |
mp3Player = MP3Player() |
4 |
setupNotificationCenter() |
5 |
}
|
Langkah 14: Posting Pemberitahuan
Untuk memposting pemberitahuan, kami memanggil metode postNotificationName (_: object :)
pada pusat pemberitahuan default. Seperti yang saya sebutkan sebelumnya, kita akan melakukan ini dalam metode queueTrack
dari kelas MP3Player
. Buka MP3Player.swift dan perbarui metode queueTrack
seperti yang ditunjukkan di bawah ini.
1 |
func queueTrack(){ |
2 |
if(player != nil){ |
3 |
player = nil |
4 |
}
|
5 |
|
6 |
var error:NSError? |
7 |
let url = NSURL.fileURLWithPath(tracks[currentTrackIndex] as String) |
8 |
player = AVAudioPlayer(contentsOfURL: url, error: &error) |
9 |
|
10 |
if let hasError = error { |
11 |
//SHOW ALERT OR SOMETHING
|
12 |
} else { |
13 |
player?.delegate = self |
14 |
player?.prepareToPlay() |
15 |
NSNotificationCenter.defaultCenter().postNotificationName("SetTrackNameText", object: nil) |
16 |
}
|
17 |
}
|
Jika Anda menguji aplikasi sekarang dan membiarkan lagu diputar sepanjang jalan, itu akan mulai memainkan lagu berikutnya secara otomatis. Tapi Anda mungkin bertanya-tanya mengapa nama lagu itu tidak muncul selama lagu pertama. Metode init
dari kelas MP3Player
memanggil metode queueTrack
, tetapi karena belum selesai menginisialisasi, itu tidak berpengaruh.
Yang perlu kita lakukan adalah memanggil metode setTrackName
secara manual setelah kita menginisialisasi objek mp3Player
. Tambahkan kode berikut ke metode viewDidLoad
di ViewController.swift.
1 |
override func viewDidLoad() { |
2 |
super.viewDidLoad() |
3 |
mp3Player = MP3Player() |
4 |
setupNotificationCenter() |
5 |
setTrackName() |
6 |
updateViews() |
7 |
}
|
Anda akan melihat bahwa saya juga menyebut metode updateViews
. Dengan cara ini, pemain menunjukkan waktu 0:00 di awal. Jika Anda menguji aplikasi sekarang, Anda harus memiliki pemutar MP3 yang berfungsi penuh.
Kesimpulan
Ini adalah tutorial yang agak panjang, tetapi Anda sekarang memiliki pemutar MP3 fungsional untuk membangun dan memperluas. Satu saran adalah untuk memungkinkan pengguna memilih lagu untuk dimainkan dengan menerapkan UITableView
di bawah pemain. Terima kasih telah membaca dan saya harap Anda telah belajar sesuatu yang bermanfaat.