【发布时间】:2019-02-25 05:22:32
【问题描述】:
我的目标(除了学习如何编写 iOS 应用程序扩展)是允许用户使用包括照片在内的各种应用程序的共享按钮共享图像并自动重命名它们。最后,我想将图像保存到应用程序的“文档”文件夹中以供进一步使用。
我在尝试使实际的 didSelectPost 部分正常工作时遇到了一些问题,因为与我见过的 Objective-C 示例不同,loadItem 操作返回 NSURL 而不是 UIImage .尝试将 NSUrl 复制到我的应用程序文档文件夹时出现错误:
错误域=NSCocoaErrorDomain Code=260 "文件“IMG_0941.JPG” 无法打开,因为没有这样的文件。” UserInfo={NSFilePath=file:///var/mobile/Media/PhotoData/OutgoingTemp/B79263E5-9512-4317-9C5D-817D7EBEFA9A/RenderedPhoto/IMG_0941.JPG, NSUnderlyingError=0x283f89080 {错误域=NSPOSIXErrorDomain 代码=2 "没有这样的文件或目录"}}
当我在“照片”应用中按下照片上的分享按钮,点击我的扩展程序,然后按下“发布”按钮时,就会发生这种情况。
无论是在模拟器还是真实设备上运行,我都会遇到同样的错误。
这是我迄今为止的整体进展:
override func didSelectPost() {
// This is called after the user selects Post. Do the upload of contentText and/or NSExtensionContext attachments.
let inputItem = extensionContext?.inputItems.first as! NSExtensionItem
let attachment = inputItem.attachments!.first!
if attachment.hasItemConformingToTypeIdentifier(kUTTypeJPEG as String) {
attachment.loadItem(forTypeIdentifier: kUTTypeJPEG as String, options: nil) { data, error in
var image: UIImage?
if let someUrl = data as? NSURL {
do {
// a ends up being nil in both of these cases
let a = NSData(contentsOfFile: someUrl.absoluteString!)
image = UIImage(data: a as! Data)
// let a = try Data(contentsOf: someUrl)
// image = UIImage(contentsOfFile: someUrl.absoluteString)
} catch {
print(error)
}
} else if let someImage = data as? UIImage {
image = someImage
}
if let someImage = image {
guard let compressedImagePath = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first?.appendingPathComponent("theimage.jpg", isDirectory: false) else {
return
}
let compressedImageData = someImage.jpegData(compressionQuality: 1)
guard (try? compressedImageData?.write(to: compressedImagePath)) != nil else {
return
}
} else {
print("Bad share data")
}
}
}
// Inform the host that we're done, so it un-blocks its UI. Note: Alternatively you could call super's -didSelectPost, which will similarly complete the extension context.
self.extensionContext!.completeRequest(returningItems: [], completionHandler: nil)
}
请注意,我将img 变量转换为NSURL。我尝试将其转换为 UIImage 但这会引发异常。
我还想对图像做一些其他的事情,比如读取它的 EXIF 数据,但现在这就是我所拥有的。任何建议都会很棒,因为我真的很难集中精力学习这个环境。
我尝试过类似但不成功的帖子,请注意它们都是Objective-C:
iOS Share Extension issue when sharing images from Photo library
Share image using share extension in ios8
How to add my app to the share sheet action
[edit] 匹配其中一个更好答案的布局,但仍然没有运气。
【问题讨论】:
标签: ios swift ios-extensions share-extension