1.info中写上

<key>NSCameraUsageDescription</key>
<string>需要您的同意才能读取媒体资料库</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>需要您的同意才能读取媒体资料库</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>需要您的同意才能读取媒体资料库</string>
<key>Privacy - Photo Library Usage Description</key>
<string>需要您的同意才能读取媒体资料库</string>

2.保存

import Photos

//操作结果枚举
enum PhotoAlbumUtilResult {
case success, error, denied
} //相册操作工具类
class PhotoAlbumUtil: NSObject { public typealias completion = ((_ result: PhotoAlbumUtilResult) -> ())
//判断是否授权
class func isAuthorized() -> Bool {
return PHPhotoLibrary.authorizationStatus() == .authorized ||
PHPhotoLibrary.authorizationStatus() == .notDetermined } //保存图片到相册
class func saveImageInAlbum(image: UIImage, albumName: String,
completion: completion?) {
//权限验证
if !isAuthorized() {
completion?(.denied)
return
}
var assetAlbum: PHAssetCollection? //如果指定的相册名称为空,则保存到相机胶卷。(否则保存到指定相册)
if albumName.isEmpty {
let list = PHAssetCollection
.fetchAssetCollections(with: .smartAlbum, subtype: .smartAlbumUserLibrary,
options: nil)
assetAlbum = list[0]
} else {
//看保存的指定相册是否存在
let list = PHAssetCollection
.fetchAssetCollections(with: .album, subtype: .any, options: nil)
list.enumerateObjects({ (album, index, stop) in
let assetCollection = album
if albumName == assetCollection.localizedTitle {
assetAlbum = assetCollection
stop.initialize(to: true)
}
})
//不存在的话则创建该相册
if assetAlbum == nil {
PHPhotoLibrary.shared().performChanges({
PHAssetCollectionChangeRequest
.creationRequestForAssetCollection(withTitle: albumName)
}, completionHandler: { (isSuccess, error) in
self.saveImageInAlbum(image: image, albumName: albumName,
completion: completion)
})
return
}
} //保存图片
PHPhotoLibrary.shared().performChanges({
//添加的相机胶卷
let result = PHAssetChangeRequest.creationRequestForAsset(from: image)
//是否要添加到相簿
if !albumName.isEmpty {
let assetPlaceholder = result.placeholderForCreatedAsset
let albumChangeRequset = PHAssetCollectionChangeRequest(for:
assetAlbum!)
albumChangeRequset!.addAssets([assetPlaceholder!] as NSArray)
}
}) { (isSuccess: Bool, error: Error?) in
if isSuccess {
completion?(.success)
} else{
print(error!.localizedDescription)
completion?(.error)
}
}
}
}

3.使用

PhotoAlbumUtil.saveImageInAlbum(image: image, albumName: "APP") { (result) in
DispatchQueue.main.async {
switch result{
case .success:
//"保存成功"
break
case .denied:
//没有权限,去设置里打开权限
let a = MyAlertController()
a.addOKView("去设置"){ (a) in
let url = URL(string: UIApplicationOpenSettingsURLString)
if let url = url, UIApplication.shared.canOpenURL(url) {
if #available(iOS 10, *) {
UIApplication.shared.open(url, options: [:],
completionHandler: {
(success) in
})
} else {
UIApplication.shared.openURL(url)
}
}
}
a.addCancelView()
a.show(self,title: "没有相册权限",message: "请您到 \"设置\" -> \"APP\" 开启相册权限", style: .alert )
break
case .error:
//"保存失败"
}
}
}

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. Oracle中创建Job实现自动插入值操作

    在PL/SQL Developer中创建Job --临时测试表 create table test_job ( id ), c_date date ); --临时序列 create sequence ...

  2. CSS居中问题:块级元素和行级元素在水平方向以及垂直方向的居中问题

    元素的居中问题是每个初学者碰到的第一个大问题,在此我总结了下各种块级 行级 水平 垂直 的居中方法,并尽量给出代码实例. 首先请先明白块级元素和行级元素的区别 块级元素 块级元素水平居中 1:marg ...

  3. Vs2013 & .net framework 4.5.1 预览介绍

    微软发布了vs2013 preview 和fw4.5.1 下面简单介绍一下与大家共享 Developer productivity X64 edit and continue 在2013里面 可以在x ...

  4. C++异常安全

    转自:http://www.cnblogs.com/zgfLawliet/p/3417308.html   异常安全的代码是指,满足两个条件 1异常中立性 : 是指当你的代码(包括你调用的代码)引发异 ...

  5. 微软Azure虚拟机备份服务在中国发布

    近期,Azure虚拟机备份服务在微软智能云上发布. 相关功能阐述: Azure IaaS虚拟机备份服务针对Windows操作系统,提供了应用一致性的备份技术:同时针对Linux操作系统,提供了文件系统 ...

  6. mongodb数据库集合操作

    1:更新update update() 方法用于更新已存在的文档.语法格式如下: db.collection.update( <query>, <update>, { upse ...

  7. GPDB 5.x PSQL Quick Reference

    General \copyright show PostgreSQL usage and distribution terms \g [FILE] or ; execute query (and se ...

  8. 上传附件(图片base64)封装方法

    上传附件(图片base64)封装方法 php 上传附件,base64 项目中封装的接口: public function error($msg){ header("Content-type: ...

  9. python 枚举类

    枚举类 Enum类 from enum import Enum Month = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Ju ...

  10. January 16 2017 Week 3 Monday

    In love, folly is always sweet. 恋爱中,干傻事总是让人感到十分美妙. Love can easily get us in over our heads, so it i ...