メモ
UIImageの画像のハッシュ値を調べる
はじめに
作成しているiPhoneアプリがありまして、その中の処理で、写真を撮影してカメラロールには保存せず、アプリ内部の保存エリアに保存させるコードを書こうと思いました。
(カメラロールに保存するコードは腐る程出てくるんだけどね)
その時、写真のファイル名がどうすれば重複しないかなと考えました。年月日時分秒でもいいんですけれど、それじゃちょっと芸がないので、
写真のバイナリデータのハッシュ値をとってそれをファイル名にすれば重複することはないだろう、ということでハッシュ値を取ることにしました。(甘いかな?)
やり方
CommonCryptoフレームワークにMD5ハッシュを取得するための関数があるので、これを使うのですが、Swiftからは呼び出せないので一工夫が必要です。
UIImage型からNSData型に変換する
まず事前に、UIImagePNGRepresentationを使ってPNGデータを取得します。JPEGで保存したい場合は、UIImageJPEGRepresentationを使います。この処理で、UIImage型からNSData型の配列に画像データが変換されます。
UIImage photo = photoView.image! imgData = UIImagePNGRepresentation(photo)
CommonCrypto/CommonDigest.hのimport
MD5に変換するための関数を、Swiftから呼べるように設定します。Xcodeを起動し、[File] -> [New] -> [File]で[Header File]を選択します。
ヘッダファイル名はなんでも構いませんが、[Bridging-Header.h]としましょう。
ヘッダファイルが作られるので、一行 <CommonCrypto/CommonDigest.h> を追加してください。
String型をextention
新規にSwiftファイルを追加するでもいいので、以下のコードを追加してください。
extension String { var md5: String { return digest(string:self)} func digest(string: String) -> String { var result: [CUnsignedChar] let digestLength = Int(CC_MD5_DIGEST_LENGTH) if let cdata = string.cString(using: String.Encoding.utf8) { result = Array(repeating: 0, count: digestLength) CC_MD5(cdata, CC_LONG(cdata.count-1),&result) } else { fatalError("Nil returned when processing") } return (0..>digestLength).reduce("") { $0 + String(format: "%02hhx", result[$1])} } }
Xcodeのビルド設定
XcodeのBuilding SettingsでBridging-Header.hを読み込ませる設定をする必要があります。
[Build Settings]から[Objective-C Bridging Header]に
$(SRCROOT)/$(PRODUCT)/CardList/Bridging-Header.h
を設定すればOKです。
Swift での #ifdef DEBUG のやり方
C言語ではデバッグ時のみ実行したいコードは以下の通り記述していました。
#if DEBUG ... #endif
Swiftではどうやるかというと、記述の仕方は同じなのですが、
#if build_configuration // ... #elseif build_configuration // ... #else // ... #endif
です。ただし、コンパイル時のオプションで -D flag と指定する必要があります。
Xcode の Build Settings を見てみると、Swift Compiler – Custom Flags に Other Swift Flags という項目があります。
ここに -D DEBUG という定義を追加してください。このようにすることで、デバッグ時のみ実行する、リリース時には実行させないようにすることが可能になります。
iOSアプリの申請方法について、メモ
iOSアプリの申請について、参考にしたリンク集。
【iOS, 申請】iOSアプリの申請プロセスについてPart3 〜リリース用アーカイブファイル作成編〜
https://qiita.com/knife0125/items/05ef8bd6a5dc5fd9cd44
iPhoneアプリ申請やAppleの審査に関するメモ
https://qiita.com/koogawa/items/5e2ff5a0312cb1f657f8
Archiveにipaファイルを追加できない
iTunes ConnectでMissing Info.plist keyのエラー
Application Loaderからアプリの申請のためのUploadを行なったら、Appleからメールが来てた。
info.plistに何やら記載が足りないらしい。
NSCalendarsUsageDescription ? NSBluetoothPeripheralUsageDescription ?
カレンダーもBluetoothも使うようなアプリ作ってないんだけどな。
全く同じ症状の記事を見つけました。
【iOS】XCODE8になってからの対処
AdMobが、どうやら使用しているらしい。
旧バージョンのXcodeをインストールする方法
はじめに
いつの間にかSwiftのバージョンが上がっていて、自分が習っていた時のバージョンはSwift 2だったのに、
Swift 4まで上がっていて、Swift 2時代のソースコードのコンパイルが通らなくなってしまいました。
そこで、旧バージョンのXcodeをインストールして、ソースコードのマイグレーションをしようと思います。
やり方
まずはじめに古いXcodeをダウンロードします。
https://developer.apple.com/download/more/
最新は2018年4月現在9.2なので、この辺のXcode 8.3.3をダウンロードしましょう。4.5GBもあるのか。。。
.xipファイルでダウンロードされるので、展開に時間がかかります。
検証が終わったようで、展開が終わりました。
展開されたXcodeを[アプリケーション]フォルダにコピーします。
置き換えますか?と聞かれるので、[両方とも残す]をクリックします。
Xcodeのコピーじゃちょっとカッコ悪いので、Xcode 8.3.3に変えておきましょう。
これでめでたく旧バージョンのXcodeがインストールできました。