Разрешение доступа к библиотеке мультимедиа Apple получено программно - PullRequest
1 голос
/ 04 апреля 2020

Буду признателен за помощь, даже если это, может быть, тривиальный вопрос.

Я написал приложение SwiftUI, которое читает медиатеку с устройства и воспроизводит ее в зависимости от пользовательских настроек. Это нормально.

Проблема, с которой я столкнулся, заключается в том, что если вы устанавливаете приложение в первый раз, пользователю необходимо предоставить разрешение на доступ к библиотеке мультимедиа. Похоже, это диалоговое окно, созданное системой, но я не вижу, какой шаг также вызывает его. Я попытался создать сгенерированный код запроса доступа, но это, похоже, не вызывает всплывающее окно, но все еще появляется только на более позднем этапе процесса загрузки приложения. Кажется, код распознает, что пользователь отреагировал на всплывающий запрос на доступ и выбрал правильный вариант переключения.

Что он, похоже, не делает, так это то, что он по-прежнему не может читать медиа-библиотеку. MPMediaQuery возвращает nil.

Я подозреваю, что он каким-то образом связан с тем фактом, что запрос доступа не выполняется в главном потоке, но я недостаточно опытен в программировании на Swift, чтобы понять, в чем проблема. Я был бы очень признателен за некоторые полезные советы.

Вот мой код:

import MediaPlayer
import SwiftUI
import Foundation

class Library {
    var artists : [Artist] = []
    @EnvironmentObject var settings : UserSettings
    var counter : Float = 0

    init() {

        switch MPMediaLibrary.authorizationStatus() {
        case .authorized:
            print("authorized")
        case .denied:
            print("denied")
            return
        case .notDetermined:
            print("not determined")
            MPMediaLibrary.requestAuthorization() { granted in
                if granted != .authorized {
                    return
                }
            }
        case .restricted:
            print("restricted")
        @unknown default:
            print("default")
        }

        if MPMediaLibrary.authorizationStatus() == .notDetermined { return }

        let filter : Set<MPMediaPropertyPredicate> = [MPMediaPropertyPredicate(value: MPMediaType.music.rawValue, forProperty: MPMediaItemPropertyMediaType)]
        let mediaQuery = MPMediaQuery(filterPredicates: filter )
        var artistsInCollection : [Artist] = []

        guard let _ = mediaQuery.items?.count else { return }

        for item in mediaQuery.items! {
            //here I do something but that's not relevant to my question
        }
        self.artists = artistsInCollection
    }
}
...