Перетащите, катализатор

Я пытаюсь использовать методы перетаскивания, чтобы перетащить файл .mp3 из Finder в свое приложение (используя Mac Catalyst). До сих пор мне удалось получить (я думаю) необработанные данные из mp3-файла в массив, но я не уверен, как действовать дальше. В конечном итоге я хочу воспроизвести файл .mp3, который был добавлен в приложение с помощью AVAudioPlayerNodes. Это правильный путь, или я должен вместо этого попытаться получить URL-адрес файла, а затем скопировать его в свое приложение? Любая помощь будет потрясающей. Спасибо.

Код: методы делегирования

func dropInteraction(_ interaction: UIDropInteraction, sessionDidUpdate session: UIDropSession) -> UIDropProposal {
      if session.localDragSession == nil {
          print("yes")
          return UIDropProposal(operation: .copy)
      }
        print("no")
      return UIDropProposal(operation: .cancel)
    }

    func dropInteraction(_ interaction: UIDropInteraction, performDrop session: UIDropSession) {
        print("somethng happened")
        session.loadObjects(ofClass: MP3Class.self) { objects in
            for url in objects as! [MP3Class] {
                print(url)
                print(objects)
            }
        }
    }

    func dropInteraction(_ interaction: UIDropInteraction, canHandle session: UIDropSession) -> Bool {
        return session.canLoadObjects(ofClass: MP3Class.self)
    }

    func customEnableDropping(on view: UIView, dropInteractionDelegate: UIDropInteractionDelegate) {
        let dropInteraction = UIDropInteraction(delegate: dropInteractionDelegate)
        view.addInteraction(dropInteraction)
    } 

Пользовательский класс mp3:

class MP3Class: NSObject, NSItemProviderReading {
    let data: Data?

    required init(mp3Data: Data, typeIdentifier: String) {
        data = mp3Data
    }

    static var readableTypeIdentifiersForItemProvider: [String] {
        return [kUTTypeMP3 as String]
    }

    static func object(withItemProviderData data: Data, typeIdentifier: String) throws -> Self {
        return self.init(mp3Data: data, typeIdentifier: typeIdentifier)
    }
}

person patturik    schedule 11.06.2020    source источник


Ответы (1)


Хорошо, мне удалось заставить его работать. Так что это было довольно просто, просто нужно было создать каталог в папке документов в методе PerformDrop, а затем вы можете просто записать данные в путь к файлу, поэтому для меня это было:

        do {
            try url.data!.write(to: filePath, options: .atomic)
            print("succes")
        } catch {
            print("Failed while storing files.")
        }

В котором filePath ссылается на файл .mp3. Вот и все. Я думал, что, может быть, я не смогу воспроизвести mp3 таким образом, но он работает как шарм. Единственное, что еще не работает, это получить то же имя файла, что и исходные данные. Но я уверен, что есть трюк и для этого:)

person patturik    schedule 13.06.2020