iOS Swift共享音频文件的应用程序扩展名

问题描述

我已将共享扩展名“ importVoiceExtension”添加到我的应用程序“ Voices IOS”中。我遵循了this videothis article的指示。不同之处在于我正在尝试从其他应用程序导入音频。我已经测试了从Telegram和本地Voice Memos应用程序导入音频。在两种情况下,我都会得到相同的错误控制台输出。

从可能共享的应用程序列表中选择我的应用程序后,控制台输出

2020-10-05 19:46:26.663509 + 0200 importVocieExtension [6447:334202] [核心] SLComposeServiceViewController获得了NSURL 文件:/// private / var / mobile / Containers / Data / Application / 327CB198-929F-4CF8-BEAB-6D8FB6B658BB / tmp / 23469605-7FC0-489E-8C3A-934075E4D375 / file 对于public.file-url错误:(空)2020-10-05 19:46:26.677640 + 0200 importVocieExtension [6447:334145] [核心] SLComposeServiceViewController的附件为粗糙类型0 2020-10-05 19:46:26.677697 + 0200 importVocieExtension [6447:334145] [core] SL

ComposeServiceViewController不为符合public.file-url的itemProvider附加

然后,我可以按下“发布”按钮以触发以下功能:

    override func didSelectPost() {
        // This is called after the user selects Post. Do the upload of contentText and/or NSExtensionContext attachments.
    
        let attachments = (self.extensionContext?.inputItems.first as? NSExtensionItem)?.attachments ?? []

        let contentType : String = "com.apple.m4a-audio"
        
        for provider in attachments {
            print("provider: \(provider)")
            if provider.hasItemConformingToTypeIdentifier(contentType) {
                provider.loadItem(forTypeIdentifier: contentType,options: nil,completionHandler: {(maybeURL,error) in
                    // Handle the error here if you want
                    guard error == nil else { print("Error loading item data from provider in extension"); return}
                    print("data: \(maybeURL)")
                    let url = maybeURL as! URL
                    print("url: \(url)")
                    let audioData: Data
                    do {
                        audioData = try Data(contentsOf: url)
                    } catch {
                        print(error)
                        return
                    }
                    print(audioData)
                    let voiceTitle = self.getCurrentTimeStamp().appending(".m4a")
                    let targetURL = self.getVoiceURL(audioFileName: voiceTitle)
                    print(targetURL)
                    self.persistentContainer.saveVoice(voiceName: voiceTitle)
                    do {
                        try audioData.write(to: targetURL)
                    } catch {
                        print(error)
                    }
                })
            }
        }
        self.extensionContext!.completeRequest(returningItems: [],completionHandler: nil)
    } 

调用此函数后,将获得以下控制台输出:

提供者: {types =( “ com.apple.m4a-audio”, “ public.file-url”)}

数据: 可选(文件:///private/var/mobile/Containers/Data/Application/308E02A5-E421-4042-B0CC-9E3C2E714DCC/tmp/NSIRD_Voice%20Memos_yGgO4L/Universita%CC%88tstrasse%207.m4a) 网址: 文件:///private/var/mobile/Containers/Data/Application/308E02A5-E421-4042-B0CC-9E3C2E714DCC/tmp/NSIRD_Voice%20Memos_yGgO4L/Universita%CC%88tstrasse%207.m4a 错误域= NSCocoaErrorDomain代码= 257“文件 由于您没有“Universitätstrasse7.m4a”,因此无法打开 允许查看。” UserInfo = {NSFilePath = / private / var / mobile / Containers / Data / Application / 308E02A5-E421-4042-B0CC-9E3C2E714DCC / tmp / NSIRD_Voice Memos_yGgO4L /Universitätstrasse7.m4a,NSUnderlyingError = 0x280990060 {Error Domain = NSPOSIXErrorDomain代码= 1“不允许操作”}}

基本上,这表明我无法访问该文件。我不明白为什么在调用函数之前会收到错误消息。另外,由于视频和文章执行相同的“ Data(contentsOf:url)”操作并成功,所以我不明白为什么在我的情况下它不起作用。唯一的区别是我不处理图像。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...