尝试将图像保存到照片库时,iOS 10 应用程序崩溃

Posted

技术标签:

【中文标题】尝试将图像保存到照片库时,iOS 10 应用程序崩溃【英文标题】:iOS 10 app crashes when trying to save image to photo library 【发布时间】:2017-02-06 04:43:37 【问题描述】:

我正在尝试将图像保存到 Swift 3 中的照片库(我正在使用 Xcode 8)。

ViewController 代码:

func shareImage(image: UIImage) 
    let items = [image]

    var activityVC: UIActivityViewController = UIActivityViewController(activityItems: items, applicationActivities: nil)
    let excludeActivities: [UIActivityType] = [UIActivityType.airDrop,
                                               UIActivityType.assignToContact,
                                               UIActivityType.addToReadingList,
                                               UIActivityType.copyToPasteboard]

    activityVC.excludedActivityTypes = excludeActivities

    self.present(activityVC, animated: true, completion: nil)

当我运行应用程序并单击按钮截取屏幕截图(将其转换为图像,...,一切正常),应用程序请求访问照片库的权限,我点击“确定"按钮,然后应用程序崩溃。图片未保存在照片库中。

我从 Xcode 得到的唯一线索如下:

2016-09-28 11:24:27.216043 Ajax Kids[4143:1545362] [error] error: -addPersistentStoreWithType:SQLite configuration:(null) URL:file:///var/mobile/Media/PhotoData/Photos.sqlite?readonly_shm=1 options:
NSPersistentStoreFileProtectionKey = NSFileProtectionCompleteUntilFirstUserAuthentication;
NSReadOnlyPersistentStoreOption = 1;
NSSQLitePersistWALOption = 1;
NSSQLitePragmasOption =     
    "journal_mode" = WAL;
;
 ... returned error Error Domain=NSCocoaErrorDomain Code=256 "The file couldn’t be opened." UserInfo=reason=Failed to access file: 1 with userInfo dictionary 
reason = "Failed to access file: 1";

2016-09-28 11:24:27.216433 Ajax Kids[4143:1545362] [Migration] Unexpected error opening persistent store <private>, cannot attempt migration <private>)
2016-09-28 11:24:27.216568 Ajax Kids[4143:1545362] [Migration] Failed to open store <private>.  Requires update via assetsd (256: <private>)

有人知道如何解决这个问题吗?

提前致谢!

更新

在社交媒体上分享图片效果很好,因此问题被指定为将图片保存在照片库中。

【问题讨论】:

尝试保存图片时分享代码 @OlegGordiichuk 这就是我为共享/保存图像而编写的所有代码。例如,操作系统负责保存代码或在 Facebook 上发布图像。这是您不需要使用 UIAcrtivityViewController 编写的代码。 您应该在 plait 文件中添加权限 @OlegGordiichuk 去过那里,做到了:隐私 - 照片库使用说明已添加并填写在 info.plist 中 @OlegGordiichuk 是的,(顺便说一句:隐私 - 照片库使用说明(在 info.plist 的属性列表中)与 NSPhotoLibraryUsageDescription 完全相同(在 info.plist 的源代码中)) 【参考方案1】:

在新的 InfoPlist.strings 文件中添加新记录。

<key>NSPhotoLibraryAddUsageDescription</key>
<string>$(PRODUCT_NAME)</string>

UPD: ios 11 密钥

【讨论】:

这是完美的安德烈,太棒了。谢谢 在 iOS 11 上,您必须添加一个新属性来保存图像。请参阅下面的答案。 在 iOS 11 上,关键更改为 NSPhotoLibraryAddUsageDescription,不错的 Tiois【参考方案2】:

我在我的特定案例中找到了罪魁祸首。我们正在使用 Leanplum 进行分析和推送通知。 Leanplum.syncResourcesAsync 方法导致打开照片库崩溃。花了几天时间才找到,因为我不知道 Leanplum 正在做任何事情来挂钩用户的照片库……这本身就是令人担忧的。

我们没有使用此特定方法带来的功能,因此只需删除该方法调用,照片库就会停止崩溃。

【讨论】:

【参考方案3】:

尝试像这样强制请求权限:

phphotoLibrary.requestAuthorization  status in
  if status == .authorized 
    //do things
  

不要忘记import Photos。希望这会有所帮助。

【讨论】:

【参考方案4】:

在 iOS 11 上,有一个名为 NSPhotoLibraryAddUsageDescription 的新属性,类似于 NSPhotoLibraryUsageDescription。见https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html

【讨论】:

@Tiois 我无法将照片保存在照片库中。我没有收到任何错误。它显示“图像已保存”。但是在照片库中没有照片。 @EktaPadaliya 可能您使用的是空的 UIImage,请确保您使用的是正确的 UIImage(包含您的图像)。

以上是关于尝试将图像保存到照片库时,iOS 10 应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

使用照片框架将带有名称的图像保存到相册

在 Flutter 中将视频文件保存到设备

将相机捕获的图像保存到ios中的文档目录中[重复]

无法使用自定义元数据保存图像

无法将图像添加到 iOS 模拟器

Swift iOS:将视频保存到库