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: