Пустой экран MPMediaPickerController, различные ошибки, правильный файл Info.plist (iOS 13.1.3) - PullRequest
1 голос
/ 21 октября 2019

Я пытаюсь позволить пользователям выбирать песню из своей музыкальной библиотеки. Итак, проблема: MPMediaPickerController отображает белый экран и блокирует приложение после новой установки приложения и только после того, как пользователь предоставит разрешение. Выход из приложения и его перезапуск не воспроизводят ошибку (возможно, потому что разрешения уже предоставлены). Удаление приложения и переустановка воспроизводит ошибку.

  • Я убедился, что мой файл Info.plist содержит правильную информацию
  • Я убедился, что средство выбора носителя отображается наосновной поток
  • Я попытался создать свойство в моем ViewController для надежной ссылки на экземпляр MPMediaPickerController, чтобы убедиться, что он не удаляется из памяти (почему бы не попробовать?)
  • Iу меня есть действующая подписка Apple Music, и я вошел в iCloud с действительным Apple ID
  • Мое устройство зарегистрировано в iTunes Connect (или как его там) и имеет действительный профиль обеспечения
  • Это на iOS 13.1.3.

Вот как я инициализирую средство выбора (я также пытался назначить свойство на контроллере представления):

let picker = MPMediaPickerController(mediaTypes: .music)
picker.allowsPickingMultipleItems = false               // I've tried commenting this out
picker.popoverPresentationController?.sourceView = cell // I've tried commenting this out
picker.delegate = self                                  // I've tried commenting this out
picker.prompt = "Choose a song"                         // I've tried commenting this out
self.present(picker, animated: true, completion: nil)

Вотсоответствующая строка в моем файле Info.plist:

<key>NSAppleMusicUsageDescription</key>
    <string>Use tracks from your iTunes library as wakeup sounds</string>

В консоли я получаю следующие ошибки:

[MediaLibrary] SQLite error 14 detected while opening database '/var/mobile/Media/iTunes_Control/iTunes/MediaLibrary.sqlitedb'
[MediaLibrary] DISK IO ERROR: attempting to close and re-open connection for recovery.
[MediaLibrary] [_handleDiskIOError] checking database consistency
[Service] Failed to obtain service proxy to perform integrity check. err=Error Domain=NSCocoaErrorDomain Code=4097 "connection to service on pid 0 named com.apple.medialibraryd.xpc" UserInfo={NSDebugDescription=connection to service on pid 0 named com.apple.medialibraryd.xpc} There was an error waiting for a reply from the media library service. Error Domain=NSCocoaErrorDomain Code=4097 "connection to service on pid 0 named com.apple.medialibraryd.xpc" UserInfo={NSDebugDescription=connection to service on pid 0 named com.apple.medialibraryd.xpc}
[MediaLibrary] [_handleDiskIOError] failed to re-open database connection
[MediaLibrary] [_handleDiskIOError] FAILED TO HANDLE DISK IO ERROR
[MediaLibrary] [_handleDiskIOError] SHM file not found—unable to unlink
[MediaLibrary] [ML3DatabaseConnection] Unable to open database connection to path /var/mobile/Media/iTunes_Control/iTunes/MediaLibrary.sqlitedb. unable to open database file
[Service] Could not attempt recovery at path: /var/mobile/Media/iTunes_Control/iTunes/MediaLibrary.sqlitedb There was an error waiting for a reply from the media library service. Error Domain=NSCocoaErrorDomain Code=4097 "connection to service on pid 0 named com.apple.medialibraryd.xpc" UserInfo={NSDebugDescription=connection to service on pid 0 named com.apple.medialibraryd.xpc}
[xpc.exceptions] <NSXPCConnection: 0x281a5f3c0> connection to service on pid 466 named com.apple.Music.MediaPicker.viewservice: Exception caught during decoding of received selector remoteMediaPickerDidPickMediaItems:, dropping incoming message.
Exception: Exception while decoding argument 0 (#2 of invocation):
<NSInvocation: 0x283203a00>
return value: {v} void
target: {@} 0x0
selector: {:} null
argument 2: {@} 0x0

Exception: Could not open database file at /var/mobile/Media/iTunes_Control/iTunes/MediaLibrary.sqlitedb (errno = 1)

Моя догадка? Некоторая проблема синхронизации состояния гонки с SQLite, находящимся в другом потоке, это проблема, только когда пользователь ожидает предоставления разрешений. Это даже поправимо на моем конце?

Я бы не хотел иметь белый экран смерти! Есть предложения?

1 Ответ

3 голосов
/ 21 октября 2019

Возможно, в прошлом вам не удавалось представить медиасборщик без предварительного запроса и получения авторизации от пользователя, но в iOS 13 это уже не так. Вы должны явно убедиться, что у вас есть полномочия, прежде чем представлять средство выбора медиафайлов:

let status = MPMediaLibrary.authorizationStatus()
switch status {
case .authorized:
    // ok to present the picker
case .notDetermined:
    MPMediaLibrary.requestAuthorization() { status in
        if status == .authorized {
            // get on main thread, ok to present the picker
// ...

Если вы предоставляете средство выбора в то время, когда у вас еще нет разрешения, оно будет зависать, как вы описали.

Вы также нуждаетесь в записи Info.plist , как вы описали, но одного этого недостаточно. Прежде чем вы сможете представить сборщик, вам понадобится запись Info.plist и разрешение пользователя. Без первого вы потерпите крах. Без последнего вы получите замороженный белый экран. С обоими все будет хорошо.

...