우리가 MusicKit과 MediaPlayer를 사용하는 가장 큰 이유는 Apple Music 앱과의 연동성 때문일거에요!
저는 앱의 라이브러리에 있는 곡의 정보를 불러와서 이를 앨범 단위로 보여준 후, 해당 곡을 재생시키는 그런 앱을 만들었는데요.
MediaPlayer 프레임워크를 사용하면 이러한 작업들을 매우 손쉽게 해낼 수 있습니다ㅎㅎ
하지만, 우리가 만든 앱이 사용자의 Apple Music 앱에 접근해서 정보를 가져오기 위해서는, 사용자에게 허락을 받아야 합니다.
만약에 허락 받지 않고 사용을 하려고 한다면,
[access] This app has crashed because it attempted to access privacy-sensitive data without a usage description. The app's Info.plist must contain an NSAppleMusicUsageDescription key with a string value explaining to the user how the app uses this data.
이런 에러를 만나게 될것입니다..ㅎㅎㅎ
에러를 자세히 읽어보면, Info.plist에 NSAppleMusicUsageDescription 를 넣어주라고 합니다.
넣어줍시다!!
저는 그냥 Get Library Data라고 적었는데....ㅋㅋㅋㅋ
이거 맞나요??? 저도 잘 몰라욤...
아무튼 이렇게 왜 사용해야 하는지 대충 이유를 적어줬더니! 잘 돌아갑니다.ㅎㅎ
SwiftUI를 하시는 분들에게!
SwiftUI 프레임워크로 앱을 생성하면, 처음에 info.plist가 찾을 수가 없더라고요..
저는 이번에 SwiftUI를 처음 접했었는데, SwiftUI에는 원래 info.plist가 없는 줄 알고, 다른 해결방법을 찾다가 시간을 엄청 날렸습니다..
근데!!! info.plist 만들어서 넣어주고, 그걸 참조하게 하면 됩니다..ㅎㅎㅎ
밑에 제가 참조한 방법을 남길게요ㅎㅎ
앱에서 유저에게서 권한을 가져오는 방법은 다른 권한을 요청하는 방법과 크게 다르지 않습니다.
저는 SwiftUI 프레임워크를 사용해서 앱을 제작했기 때문에 이렇게 했습니다!
근데 UIKit으로 만드시는 분들도, 코드만 이해하면 무리없이 하실 수 있을거에요ㅎㅎ
하나씩 설명해드릴게요.
enum AuthStatus {
case notYetDetermined // 권한 미정(초기값)
case permitted // 권한 수락 - 앱 로드
case notPermitted // 권한 거절 - 설정 창으로 이동
}
final class AuthViewModel: ObservableObject {
@Published private(set) var authStatus: AuthStatus = .notYetDetermined
init() {
getAuthrization()
}
private func getAuthrization() {
let status = MPMediaLibrary.authorizationStatus()
if (status == MPMediaLibraryAuthorizationStatus.authorized) {
self.authStatus = .permitted
} else {
MPMediaLibrary.requestAuthorization() { status in
DispatchQueue.main.async {
if status == .authorized {
self.authStatus = .permitted
} else {
self.authStatus = .notPermitted
}
}
}
}
}
}
일단 저는 getAuthrization 함수를 통해, authStatus 변수값을 다뤄주었는데요.
요 부분에서, 현재 status를 불러오고,
(유저가 이미 수락을 했으면 .authorized 상태겠죠??)
let status = MPMediaLibrary.authorizationStatus()
if (status == MPMediaLibraryAuthorizationStatus.authorized) {
self.authStatus = .permitted
}
그게 맞다면, authStatus를 enum의 .permitted로 바꿔주어서 허가 받았을 때의 작업을 수행해주도록 했습니다ㅎㅎ
자, 만약에 .authorized 상태가 아니라면, 어쨌든 권한을 유저에게서 받아와야 하기 떄문에,
다음과 같이
requestAuthorization 함수를 통해서 권한을 받아와 줍니다ㅎㅎ
else {
MPMediaLibrary.requestAuthorization() { status in
DispatchQueue.main.async {
if status == .authorized {
self.authStatus = .permitted
} else {
self.authStatus = .notPermitted
}
}
}
}
SwiftUI를 하시는 분들에게!
굳이 status를 main thread에서 변경해주는 이유는, 제가 authStatus를 @Published 상태로 선언했기 때문입니다.
@Published된 변수는 main 스레드에서만 변경이 가능하니깐요.
이스케이프 클로저 안에서 실행되는 동작들은 main thread에서 동작된다는 보장이 없기 때문에, main thread로 디스패치 시켜준 것입니다ㅎㅎ
'iOS 개발 > MusicKit' 카테고리의 다른 글
[MusicKit] MediaPlayer 프레임워크 (4) - MPMediaQuery로 Apple Music 라이브러리 가져오기 (0) | 2022.02.07 |
---|---|
[MusicKit] MediaPlayer 프레임워크 (2) (0) | 2022.02.05 |
[MusicKit] MediaPlayer 프레임워크 (1) (0) | 2022.02.05 |