1.info中写上

  1. <key>NSCameraUsageDescription</key>
  2. <string>需要您的同意才能读取媒体资料库</string>
  3. <key>NSLocationWhenInUseUsageDescription</key>
  4. <string>需要您的同意才能读取媒体资料库</string>
  5. <key>NSPhotoLibraryUsageDescription</key>
  6. <string>需要您的同意才能读取媒体资料库</string>
  7. <key>Privacy - Photo Library Usage Description</key>
  8. <string>需要您的同意才能读取媒体资料库</string>

2.保存

  1. import Photos
  2.  
  3. //操作结果枚举
  4. enum PhotoAlbumUtilResult {
  5. case success, error, denied
  6. }
  7.  
  8. //相册操作工具类
  9. class PhotoAlbumUtil: NSObject {
  10.  
  11. public typealias completion = ((_ result: PhotoAlbumUtilResult) -> ())
  12. //判断是否授权
  13. class func isAuthorized() -> Bool {
  14. return PHPhotoLibrary.authorizationStatus() == .authorized ||
  15. PHPhotoLibrary.authorizationStatus() == .notDetermined
  16.  
  17. }
  18.  
  19. //保存图片到相册
  20. class func saveImageInAlbum(image: UIImage, albumName: String,
  21. completion: completion?) {
  22. //权限验证
  23. if !isAuthorized() {
  24. completion?(.denied)
  25. return
  26. }
  27. var assetAlbum: PHAssetCollection?
  28.  
  29. //如果指定的相册名称为空,则保存到相机胶卷。(否则保存到指定相册)
  30. if albumName.isEmpty {
  31. let list = PHAssetCollection
  32. .fetchAssetCollections(with: .smartAlbum, subtype: .smartAlbumUserLibrary,
  33. options: nil)
  34. assetAlbum = list[0]
  35. } else {
  36. //看保存的指定相册是否存在
  37. let list = PHAssetCollection
  38. .fetchAssetCollections(with: .album, subtype: .any, options: nil)
  39. list.enumerateObjects({ (album, index, stop) in
  40. let assetCollection = album
  41. if albumName == assetCollection.localizedTitle {
  42. assetAlbum = assetCollection
  43. stop.initialize(to: true)
  44. }
  45. })
  46. //不存在的话则创建该相册
  47. if assetAlbum == nil {
  48. PHPhotoLibrary.shared().performChanges({
  49. PHAssetCollectionChangeRequest
  50. .creationRequestForAssetCollection(withTitle: albumName)
  51. }, completionHandler: { (isSuccess, error) in
  52. self.saveImageInAlbum(image: image, albumName: albumName,
  53. completion: completion)
  54. })
  55. return
  56. }
  57. }
  58.  
  59. //保存图片
  60. PHPhotoLibrary.shared().performChanges({
  61. //添加的相机胶卷
  62. let result = PHAssetChangeRequest.creationRequestForAsset(from: image)
  63. //是否要添加到相簿
  64. if !albumName.isEmpty {
  65. let assetPlaceholder = result.placeholderForCreatedAsset
  66. let albumChangeRequset = PHAssetCollectionChangeRequest(for:
  67. assetAlbum!)
  68. albumChangeRequset!.addAssets([assetPlaceholder!] as NSArray)
  69. }
  70. }) { (isSuccess: Bool, error: Error?) in
  71. if isSuccess {
  72. completion?(.success)
  73. } else{
  74. print(error!.localizedDescription)
  75. completion?(.error)
  76. }
  77. }
  78. }
  79. }

3.使用

  1. PhotoAlbumUtil.saveImageInAlbum(image: image, albumName: "APP") { (result) in
  2. DispatchQueue.main.async {
  3. switch result{
  4. case .success:
  5. //"保存成功"
  6. break
  7. case .denied:
    //没有权限,去设置里打开权限
  8. let a = MyAlertController()
  9. a.addOKView("去设置"){ (a) in
  10. let url = URL(string: UIApplicationOpenSettingsURLString)
  11. if let url = url, UIApplication.shared.canOpenURL(url) {
  12. if #available(iOS 10, *) {
  13. UIApplication.shared.open(url, options: [:],
  14. completionHandler: {
  15. (success) in
  16. })
  17. } else {
  18. UIApplication.shared.openURL(url)
  19. }
  20. }
  21. }
  22. a.addCancelView()
  23. a.show(self,title: "没有相册权限",message: "请您到 \"设置\" -> \"APP\" 开启相册权限", style: .alert )
  24. break
  25. case .error:
  26. //"保存失败"
  27. }
  28. }
  29. }

swift3.0 保存图片到本地,申请权限的更多相关文章

  1. Android6.0动态申请权限

    先直接看代码: public void onClick(View v){ onCallPermission(); } public void onCallPermission(){ if (Build ...

  2. 说说Android6.0动态申请权限的那些坑

    白天在做SDK23版本的适配,遇到了不少坑,现在抽空记下来,以此为戒. 首先要知道哪些坑,就得先了解一些定义和基本使用方式. 那么先介绍一下动态申请的权限分组情况. 下面的权限组是由谷歌官方定义的,目 ...

  3. Android6.0动态申请权限那些坑--以及避免用户选择不再提示后无法获取权限的问题

    Android 6.0 为了保护用户隐私,将一些权限的申请放在了应用运行的时候去申请, 比如以往的开发中,开发人员只需要将需要的权限在清单文件中配置即可,安装后用户可以在设置中的应用信息中看到:XX应 ...

  4. swift3.0 CoreGraphics绘图-实现画板

    swift3.0对绘图的API进行了优化,看起来更swift了. 看下UI的构造.设置画笔粗细.清空面板和保存到本地 下面直接看画板文件 这里我做的比较复杂,记录触摸到的每个点,再连成路径,其实直接用 ...

  5. Android笔记之使用ImageView加载网络图片以及保存图片到本地并更新图库

    ImageView显示网络图片 findViewById(R.id.btnLoad).setOnClickListener(new View.OnClickListener() { @Override ...

  6. 使用 swift3.0高仿新浪微博

    项目地址:https://github.com/SummerHH/swift3.0WeBo 使用 swift3.0 高仿微博,目前以实现的功能有,添加访客视图,用户信息授权,首页数据展示(支持正文中连 ...

  7. Android开发在Activity外申请权限调用相机打开相册

    问题描述: 最近在项目中遇到一个需要调用相册和打开相机的需求,但是,在Android 6.0以后,调用相册属于危险权限,需要开发者动态获取,这就意味着我们申请权限是与Activity绑定的,但如果一个 ...

  8. Android无需申请权限拨打电话

    Android打电话有两种实现方法: 第一种方法,拨打电话跳转到拨号界面.源代码如下: Intent intent = new Intent(Intent.ACTION_DIAL); Uri data ...

  9. Swift3.0变化分享

    Swift 3.0 做出的改变很大,在这篇文章中,我将尽我所能,利用代码样例给大家解释Swift 3.0最重要(要命)的改变,希望大家能够做好升级Swift 3.0 的准备.Swift 3.0的改变不 ...

随机推荐

  1. ubuntu 18 设置语言环境

    1. 查看语言环境 ubuntu系统中,存在两个系统变量:$LANG和$LANGUAGE 分别控制语言环境和地区,这两个变量是从/etc/default/locale中读取的: 方法一: echo $ ...

  2. Maven 安装与使用(一)

    1. 安装 参考:http://maven.apache.org/install.html A. win7环境下,官网下载maven安装文件 B. 解压缩maven文件 C. 确认已配置好JAVA环境 ...

  3. QT5.3 杂记

    Qt5下,QWidget系列从QtGui中被剥离出去,成为单独的QtWidget模块.随着Qt Quick2的引入,QtDeclarative也逐渐和QWidget系列也脱离关系. 最终:在Qt5下的 ...

  4. linux 设置git记住密码

    linux下: 1.在~/下, touch创建文件 .git-credentials, 用vim编辑此文件,输入: https://{username}:{password}@github.com 注 ...

  5. sqlserver批量删除表

    --批量删除表 ) DECLARE tmpCur CURSOR FOR SELECT name FROM sys.objects WHERE TYPE='U' AND name LIKE N'%_Qu ...

  6. HTML 水平线hr

    HTML 水平线 <hr /> 标签在 HTML 页面中创建水平线. hr 元素可用于分隔内容. 实例 <p>This is a paragraph</p> < ...

  7. css属性值语法解读

    //margin 形式语法: [ <length> | <percentage> | auto ]{1,4} //合法实例: margin: style /*单值语法 */ 举 ...

  8. dll的制作

    https://blog.csdn.net/guanchanghui/article/details/1621031

  9. Oracle sql trace用法

    sql_trace是oracle提供的一个非常好的跟踪工具,主要用来检查数据库的异常情况,通过跟踪数据库的活动,找到有问题的语句. 一.概述:    SQL_TRACE是Oracle的一个非常强大的工 ...

  10. 【海龟汤策略】反趋势交易策略源代码分享(基于BOTVS)

    策略介绍: 海龟之汤,简称“龟汤”,是个与海龟交易法则相反的交易策略,它利用了跟势交易(特别是海龟方式)在很多假突破方面的缺陷来获利(把海龟做成汤吃掉).上世纪八十年代早期,有个非常著名的交易员团体— ...