新米iPhoneアプリ開発者(自称)の開発奮闘記

iPhoneアプリ開発(自称)3ヶ月目の悪戦苦闘を記して行きます。

画像の一部の切り抜き

iPhoneで、ポイントカードやキャッシュカードをカメラで撮影して、そのカード部分だけ画像を切り取って保存するという処理を作る際に、こちらのサイトのコードを使わせていただきました。
ありがとうございました。

Swift3.0で画像の切り抜き

extension UIImage {
    func cropping(to: CGRect) -> UIImage? {
        var opaque = false
        if let cgImage = cgImage {
            switch cgImage.alphaInfo {
            case .noneSkipLast, .noneSkipFirst:
                opaque = true
            default:
                break
            }
        }

        UIGraphicsBeginImageContextWithOptions(to.size, opaque, scale)
        draw(at: CGPoint(x: -to.origin.x, y: -to.origin.y))
        let result = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return result
    }
}

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]を選択します。
56



















ヘッダファイル名はなんでも構いませんが、[Bridging-Header.h]としましょう。
ヘッダファイルが作られるので、一行 <CommonCrypto/CommonDigest.h> を追加してください。
56










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です。

56

livedoorブログでソースコードを表示する方法

livedoorブログでソースコードを表示するための方法が見当たらないので検索してみたところ、こんなやり方がありました。

【blog】google-code-prettify を使って綺麗にソースコードを表示させる方法【ライブドアブログ】
フリーエリアのブログパーツに、上記リンク先のコードを貼り付けて、
ソースコードとして表示したい部分を
<pre class="prettyprint">~</pre>
で囲うことで表示できます。

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ファイルを追加できない

Xcodeで[Product]→[Archive]がグレイアウトしていてクリックできず、ipaファイルを作成できないことがある。



意外に解決策は簡単。そんな時は、Xcodeのシミュレータを選択する画面で、[iOS Device]を選べば良い。これだけです。
iOSDevice