ios上传图片demo
A. 如何发布IOS应用程序到苹果APP STORE
要发布iOS应用程序到App Store首先需要一个iOS developer帐号,账号是收费的,$99美元/年。即便是免费应用也需要一个开发者账号,注册Developer账户这里就不详细介绍了。
然后自然是将App准备好。确保iOS应用程序已经在模拟器(Simulator)中做了全面的测试确认没有已知Bug了。
App发布的工作一切准备好了之后,就可以发布应用到App Store了,应用发布概括起来需要以下几个流程:
1. 注册App ID,在Xcode中指定Bundle Identifier
2. 创建发布证书(Distribution Certificate)
3. 创建Distribution Provisioning Profile
4. 用Distribution Profile为应用签名
5. 打包App
6. 在iTunes Connect上传App
以上大部分的操作是在Provisioning Portal、XCode、Keychain Access工具和iTunes Connect中完成的。
上传App必须在Xcode软件里执行(也就是要有MacAir, MacMini等运行Moc OS X Mountain等10.x的系统,最好是10.7等最新版的。
XCode这个Object C的集成开发环境目前版本是4.3.2。
其他操作都可以在普通浏览器里完成。
B. iOS WKWebView与H5交互,JS调OC传值、OC调JS传值、进度条加载等(干货满满)
WKWebView是苹果在iOS 8之后推出的框架,关于它比webview的优势这里就不讲了。主要说一下与JS交互的问题,其实WKWebView已经内置了JS与OC的互调、传值等方法,使用起来也非常方便,下面就来细细的探讨一下以及自己遇到过的坑...
首先来看下WKWebView的初始化相关设置:
一、导入相关头文件、设置相关代理和属性
二、WKWebView初始化
注意:
楼主遇到的第一个坑:如果JS给OC传值为空,必须写成: postMessage(null),如果什么都不写,方法是调不通的。
1、在viewWillAppear中配置, addScriptMessageHandler name: "这里就是JS的方法,方法名必须统一"
楼主遇到的第二个坑:配置完后必须在 viewWillDisappear 中 remove,否则会造成循环引用,导致crash
2、实现 WKScriptMessageHandler 协议
以上就是JS调OC,JS向OC传值...
楼主这里举三个例子:
1: webview加载完成前,将用户信息传给js
2: webview加载完成,将相关信息传给js
3: 调用相册或相机时,将选择的图片请求后台接口,后台返回图片地址,将该地址回传给H5,H5将图片显示到页面上
第一个例子: webView加载完成前传值
因为 evaluateJavaScript 方法默认是在加载完成后调用,所以直接在页面开始加载中调用是传不过去的,这个时候怎么办呢? 我们可以让js端写两个方法, 第一个方法是js端开始向oc端发起信息需求的方法名,当oc端收到该方法名的时候,就去调用js端第二个获取传值的方法,把信息传递过去。
先让JS端写个方法调OC,OC实现方法后在这个方法内部给JS传值
在WKScriptMessageHandler协议中,实现该方法,然后在方法内部给JS传值
注意: 以上就是在Webview加载完成前传值,如果打印没报错,证明传参成功,如果web端没收到,让他把获取到值的方法写到页面中即可。
第二个例子: webView加载完成,传值给js
第三个例子: 传图片地址给js,js拿到后显示图片
1:拍照事件
1.1:将拍的照片请求上传图片接口,成功返回图片地址,并传值给H5
2: 从相册中选取照片
2.2:将相册中选取的照片请求上传图片接口,成功返回图片地址,并传值给H5
注意: getPhotoCallback 即为调用的方法名,后面传值格式必须为: ('') , 这里遇到了第三个坑, 如果方法名写为: 名称.名称 (例如:hello. getPhotoCallback),这种是调不通的,可以写成hello_getPhotoCallback的形式,一般的话最好还是定义一个完整的名称。 刚开始这个问题卡了比较久,一直调不通,在此记录一下.....
在 viewDidLoad 中注册进度条监听
开始加载网页
加载完成
加载失败
页面跳转失败
progressView懒加载
添加监听观察者
最后别忘记 removeObserver
Demo地址: https://github.com/zhwIdea/WKWebViewAndJS
C. 如何在IOS上发布APP
1、上架App Store
App Store是唯一的官方应用商店,如果自己不知道怎么上架,可以借助第三方开发者服务平台进行上架。应用规范的情况下,加急三天就可以上架。
不过苹果审核向来是比较严格的,上架前最好确定自己的应用没有违规、敏感信息。否则提交也审核不过,反而浪费时间。
D. IOS 解决问题:相似、截屏照片清理和图片压缩
用来提供相册的清理相似图片、清理截屏图片、压缩图片三个功能。
额外需要引入的框架:
Photos 引用了系统的 AssetsLibrary 框架,需要额外导入,否则会报错:
引入方式:
作用是无需创建实例,通过类方法直接调用。
在这个方法中加载的图片包括相似图、截屏图以及可瘦身的图片,所以是公共部分。
第一步: 加载照片之前首先要清除旧数据。
第二步: 判断相册授权状态。如果相册授权状态为没决定,则开启权限提示,在 info.plist 中添加上 Privacy - Photo Library Usage Description ,提示语句可为:获取相册权限。
如果相册授权状态为拒绝,则弹出提示框,点击前往设置则跳转到设置APP开启权限。
第三步: 如果已经授权则直接获取相册中的数据。
第四步: requestImageWithIndex: 方法通过图片索引位置来获取 assetArray 中对应的图片。这个方法在 index+1 后不断递归调用自己,直到遍历完整个 assetArray 。传入缩略图和原图后,即进入了本文章的关键部分,即图片的处理流程了。
第五步: 图片的处理方法 dealImageWithIndex: 对传入的缩略图和原图进行三步处理,分别判断其是否为相似图片、截屏图片、可以瘦身的图片,如果是则将其加入到对应数组中保存作为数据源。处理完一张图片后将 index+1 ,再调用 requestImageWithIndex: 处理下一张图片,这是个递归过程,直到全部图片处理完成。
因为图片资源数组 assetArray 是按照创建时间排序的,所以可以通过和上一个图片的创建时间相比较来对图片按照是否为同一天创建的标准来分组显示。如果是同一天创建的图片,则将其分为一组。是否为同一天的比较方法如下:
第六步: 图片加载完成,计算相似、截屏、可瘦身的图片的数量和可节省内存的大小,最后将各类可节省内存的大小加起来得到总的可节省内存的大小。
其中获取图片数量及可以节省的内存空间大小的 getInfoWithDataArray: 方法的实现如下:
在 ClearPhotoManager 中定义:
当我们在相册新增加了一张图片的时候,控制台输出如下:
在 ClearPhotoViewController 中使用:页面显示前或者相册发生变动了则更新数据源
在 中使用:删除后通知更新相册和数据源
在 ThinPhotoViewController 中使用:压缩后通知更新相册和数据源
删除一张图片后的内存变化:
注意:这里进行了个小实验,可以看到即使照片相同,但是如果创建日期不同的话,APP也对它进行了单独分组,因为我们是按照日期的标准来划分组的。实际使用过程中,这种情况很少,因为会产生相似图片的原因大都是复制和连拍,而复制的图片、连拍的图片日期都是相同的。
属性的懒加载方法实现如下:
这里用到了图片相似度算法,其原理包括五步:
1、缩小尺寸
2、简化色彩
3、计算平均值
4、比较像素的灰度
5、计算哈希值
该算法的具体实现我们不用去关心,只需要导入 ImageCompare.h 这个文件即可。在该文件内部用到了:
所以还需要导入这个框架: opencv2.framework 。这两份文件在我的 demo 里都已经提供了。
如果上一张图片存在并且是现在的图片的创建时间是同一天,而且还满足相似度算法,则更新相似图片数据源,否则说明和上一张图片并不相似。
其中以创建日期作为字典的 key ,其方法 stringWithDate: 的实现如下:
这是最关键的一步,也是非常绕脑袋的一步,理解的关键是分清楚下面的数组和字典的作用和区别:
similarArray的内容打印结果如下:
similarArray中每一个lastDictionary打印结果如下:
lastDictionary的allValues: