在IOS 13中选择“保存照片”后没有调用UIActivityViewController.completionwithitemshandler。
我的代码非常简单:
activityVC.completionWithItemsHandler = {(activityType: UIActivity.ActivityType?, completed: Bool, returnedItems: [Any]?, error: Error?) in
let result: [String: Any] = [
"completed": NSNumber(value: completed),
"app": activityType?.rawValue ?? ""
];
}
它只在我第一次保存照片时被调用,但是每次在弹出窗口中单击“保存照片”之后,我都需要知道结果,但是处理程序没有被调用。如何解决这个问题?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
遇到您描述的问题,可能是由于iOS系统对权限管理或UIActivityViewController的行为有所改变。在iOS 13及以后的版本中,苹果对隐私和权限管理进行了更严格的控制,特别是涉及到文件访问和照片保存等操作。
这里有几个可能的解决方案和检查点,希望能帮助到您:
确保您的应用有相应的权限:首先,请确认您的应用已经获得了保存照片到相册所需的权限。这包括在Info.plist中添加NSPhotoLibraryAddUsageDescription
键,并在需要时通过代码请求用户授权。
使用PHPhotoLibrary保存图片:考虑到直接使用UIActivityViewController
的不确定性,您可以考虑改用Photos
框架中的PHPhotoLibrary
来手动保存图片,并通过其提供的完成回调来获取操作结果。示例代码如下:
import Photos
func saveImageToPhotos(image: UIImage, completionHandler: @escaping (Bool, Error?) -> Void) {
PHPhotoLibrary.requestAuthorization { status in
guard status == .authorized else {
completionHandler(false, NSError(domain: "", code: 1, userInfo: [NSLocalizedDescriptionKey: "Permission not granted"]))
return
}
let request = PHAssetChangeRequest.creationRequestForAsset(from: image)
PHPhotoLibrary.shared().performChanges({
request
}, completionHandler: { success, error in
completionHandler(success, error)
})
}
}
检查是否是模态呈现问题:在某些情况下,如果UIActivityViewController
是以模态形式呈现的,且没有正确处理模态视图控制器的生命周期,可能会导致回调不被调用。确保您正确地呈现和dismiss该视图控制器。
测试其他Activity Types:尝试使用不同的UIActivity.ActivityType
,比如分享到其他应用,看是否能正常触发completionWithItemsHandler
。这有助于确定问题是否特定于“保存照片”这一操作。
查看iOS日志:同时,检查Xcode的调试输出或设备的日志,看看是否有任何相关的错误信息或警告,这可能会提供问题的线索。
如果以上方法都不能解决问题,建议查阅Apple的官方文档或开发者论坛,看是否有其他开发者遇到了类似问题并找到了解决方案。此外,考虑到技术更新迭代,也请检查您的代码与当前使用的Xcode和iOS SDK版本兼容性。