プログラマー技術調査室

うだつのあがらないプログラマーが技術調査結果を掲載するブログです。

アプリがダウンロードされない!

先日よりアファーメーションのアプリを配信開始しました。
ニッチな分野のアプリですので結果のほうは長い目でみようと思っておりましたが・・・

先日のダウンロード件数、まさかの0件!

頑張って作った手前、さすがに心が折れそうです。
iTunesConnectのキャプチャを撮る気力もありません。

自前のブログでサラっとしか宣伝してないのですが、まあ新着アプリ効果で10ダウンロードくらいは行くだろうと思っていました・・・

が、甘かった!

実際使って頂ければアホみたいに使いやすいと分かるはずなんです。
私自身も使うものですから、使いやすさにはこだわっています。
しかしこれでは使う以前の問題ですね。

確かに、改めてAppStoreの紹介をみてみると何の「売り」もない手抜きアプリに見えます。

どうしたものか・・・

とにかく前向きに考えましょう。
初日ダウンロード0件となると、悪い意味で気楽ですからね。
潜在的な顧客はゼロと過程したうえで、ちゃんと宣伝して出来るだけの事はしてみようと思います。

アプリの審査が通りました(最短)

現在、早朝2時20分・・・
タイトルの通りです。
iPhoneのメール受信音で目が覚めて、気になったので確認してみると「Ready for Sale」(配信準備完了)の文字が。

iTunesConnectでAppleに審査申請したのが先日の20時過ぎですので、わずか6時間で審査完了となりました。

まじですか・・・
別に特急審査を依頼した訳ではないのですが・・・

日本ではゴールデンウィークですけど、アメリカも連休とかあるんでしたっけ?
連休前にちゃっちゃと終わらしちゃったとか?
ともかく、こんなこともあるんですね。驚きました!

だからといって何故こんな時間にブログ記事を書いているかといいますと、今回はアプリ配信のタイミングを「自動的に配信する」にしていたんですね。
んで審査はもっと時間がかかるだろうとタカをくくっていたものですから、アプリのサポートページを全然作っていなかったんです。

さっきあわてて作りました(^^;;;

アプリ名は「アファほじょ」です。
以下リンクです。

f:id:itsearcher:20160504103813p:plain

暗示療法のアファーメーションを補助するアプリでして、ご存知ない方には何のアプリかさっぱりだと思いますが、興味のある方はダウンロードよろしくお願い致します。

iアプリ「アファほじょ」のサポート

Phone/iPad用アプリケーション「アファほじょ」のサポートページです。
「アファほじょ」は、アファーメーション補助用アプリです。


f:id:itsearcher:20160504020732p:plain

↑ 画像クリックでAppStoreへGO! ↑

基本的にアプリ利用者をサポート対象としております。
無料でご利用いただけますので、利用を検討されている方はお気軽に使ってみて頂ければと思います。

不明点、バグ報告、ご要望等などありましたら、ページ最下部の「コメントを書く」からコメントのご記入をおねがいします。

Apple審査の都合上、バグの対応にはある程度の時間がかかってしまいます。
即時対応が出来ない事ご容赦ください。

アプリに広告実装してわかったこと

忙しくてアプリ開発が中断しておりましたが、今日から再開します。

現在作っているアプリは、前回の反省点をふまえて無料配信+広告収入タイプとしています。

広告表示は初挑戦になるのですが・・・
難しい、というかダメですねこれ。バグだらけです。

シミュレーターで動作テストしているためかもしれませんが、ある会社の広告は、機種によって広告サイズが調整されたりされなかったり。

別な会社の広告は、広告サイズ調整はできたものの、機種によって広告が出たり出なかったり。

どの会社のSDKにも言えるのですが、マニュアル通りにコーディングしても正しく動作しない!

とりあえず広告サイズの調整は諦めました。
これ以上コレに時間かけるのは無駄です。
全機種最小サイズ固定でいきます。

広告会社を選定、登録手続き、SDK導入するだけでもかなりの時間が取られるのに、あげく動作がおかしいと本当に時間の無駄になってしまいますね。

広告に関する会社ごとの注意点をまとめたら有益な情報になりそうですね。
開発が一段落したらまとめてみます。

DBファイル暗号化におけるラッパークラスの注意点

iOSでデータベースを使う場合、多くの人がSQLiteを選択します。
(というか私は他の選択肢を知りません・・・)

swiftSQLiteを扱う場合、直接扱うには情報不足ですので大抵の方がオープンソースのラッパークラスを利用すると思われます。
私も利用しております。

本日の話題はラッパークラスの注意点です。


私の開発したアプリ「マイナンバー暗号化」では、開発初期はSwiftDataというラッパーを利用させて頂いておりました。

github.com


SwiftDataは数あるラッパークラスの中でもswiftでコーディングされたものですので、Objective-Cを習得していない私には魅力的なラッパーでした。


しかし、とある重大な問題が発生しSwiftDataの利用を断念、FMDBに乗り換えざるを得ませんでした。

github.com


その理由というのは「データベースファイルの暗号化」です。
SwiftDataではデータベースの暗号化に対応できなかったのです。

もう少し正確に言うと、swiftXcode?)デフォルトのSqliteライブラリのバージョンが古いため、データベース暗号化に対応できないようなのです。

FMDBObjective-Cでコーディングされたラッパーでして、こちらは最新のSqliteライブラリを別途組み込むことによって問題を回避していたと記憶しています。

このエラーに関する詳細情報はラッパー差し替え前のソースコードが残っていないため確認できないのですが、2日くらい調査した結果として無理だったと記憶しております。


ちなみにデータベースファイルの暗号化にはSQLCipherを利用させて頂いております。

www.zetetic.net


詳細な情報を提示できず中途半端な記事となってしまいますが、同じ問題にぶち当たった方の参考になればと思い書きました。

SwiftDataでも暗号化可能でしたらご指摘のコメント頂ければ助かります。

Int64をAnyObjectに変換する

今日はちょっとびっくりした事が。
Int64型の変数をAnyObject型の変数に代入しようとするとエラーが出たのです。

let int64Value: Int64 = 0
let anyObjectValue: AnyObject = int64Value

エラー:
Value of type 'Int64' does not conform to specified type AnyObject


AnyObject型って普通は変換なしで代入できるのですが・・・
では明示的に型変換してみるとどうか?

let int64Value: Int64 = 0
let anyObjectValue: AnyObject = int64Value as AnyObject!

エラー:
Cannot convert value of type 'Int64' to type 'AnyObject!' in coercion


だめです。
色々と調べてみて、以下のように書けばオッケーとわかりました。

let int64Value: Int64 = 0
let anyObjectValue: AnyObject = NSNumber(longLong: int64Value)


NSNumber型はObjective-Cのデータ型っぽいですね。
swiftでコーディングしているとObjective-Cで書かざるを得ない場面が多々あります。Objective-Cができれば断然楽でしょうね。
自分はできません・・・

文字列の右端の空白を削除する

swiftってRTrim関数が無いみたいですね。

入力値の末尾の空白を削除するのって、ビジネスアプリケーション開発では一般的な仕様だと認識していましたが、標準関数に無いということはローカルな文化なのかもしれません。


という訳で、とりあえず今回の要件は「文字列の右端の空白を削除する」です。
両端ではありません、右端だけです。

"  test  ""  test"という具合に変換したいのです。

swiftには両端を削除する標準関数は存在しますが、右端だけ、左端だけ、という関数は存在しないようです。

自力で作ってみました。

let targetString: NSString = "   Test    "
var checkString: String
var rtrimLength: Int = 0

for var i = targetString.length - 1; i >= 0; i -= 1 {
    
    checkString = NSString(string: targetString.substringFromIndex(i)).substringToIndex(1)
    
    if ((checkString != " ") && (checkString != " ")) {
        
        rtrimLength = i + 1
        break
        
    }
    
}

if rtrimLength > 0 {
    
    print(targetString.substringToIndex(rtrimLength))
    
}


以上です。
もっとスマートなやり方があったら教えて下さい。

余談ですが、String型とNSString型の違いがわずらわしいです。
機能的にはNSStringに統一してほしいですねえ・・・