ポジティブ丸メガネ

3年目エンジニアです。

読んだマンガや小説の管理ができ、新刊発売日の通知が来るiPhoneアプリ「読んだ。」をリリースしました!

今までコツコツ作ってきたアプリがついにリリースされましたー!ブログでSwift系の記事を書いていましたが、大体はこのアプリを作るために必要な機能でした。

読んだ。

読んだ。

  • Seiya Mogami
  • 仕事効率化
  • 無料

機能

マンガや小説の買い忘れや間違って同じものを買ってしまったことはありませんか?

「読んだ。」は読んだマンガや小説の管理、そして読んだマンガや小説の新刊情報が知れるアプリです。

  • マンガや小説を本棚に登録することで、巻数や発売日の管理ができます。
  • 本棚に登録された書籍の新刊発売日がわかり、なおかつ通知が来ます。
  • 本棚に登録された書籍以外のマンガや小説の発売日の一覧が見れます。
  • 買い忘れがないように、このアプリから楽天ブックスで書籍の予約注文ができます。
  • 読んだ書籍をTwitterにシェアすることができます。

注意していただきたいのは、タイトルや著者名の入力です。正確に入力して頂く必要があります。

例えば、尾田栄一郎さんのワンピースの場合ですが、入力はタイトル:ONE PIECE、著者名:尾田栄一郎を入力していただく必要があります。ワンピースでは発売日に通知されない可能性が高いです。入力には、マンガや小説の背文字(画像参照)を参考に入力していただければ、発売日に通知がくるはずです。
f:id:seiya-orz:20160117202233j:plain

正確に入力できており、かつその書籍の新刊が発売される予定であれば、発売日一覧タブに表示されます。

ちなみにこの正確に入力する面倒さは今後改善予定です。

使ってる感想

自分で作っておいてなんですが、わりと便利だと思ってます。特に、発売日に通知が来るのがありがたい。

使い始めは読んだマンガや小説を入力するのがちょっと面倒ですが、一度入力してしまえば巻数の更新は楽ちん。買い忘れや重複して買ってしまうことがほんとになくなりました。

マンガや小説をたくさん読んでる人は、是非使ってみてください!

そしてよければ感想ください。レビューに書いていただいても構いません。

あ、デザイナーさんたちのなかでデザインやりたいという人がいればぜひお声がけください。独断と偏見でデザインしてるので全然自信ないです。

実装

ここからはエンジニアの方向けのお話。

読んだ書籍の表示はTableViewを使って行っています。
Swift: 初心者がTableViewを利用するときに参考にしたサイト一覧 - ぽじてぃぶしんきんぐ
Swift: tableViewを横スワイプして2つのボタンを出すときにハマったこと。 - ぽじてぃぶしんきんぐ
Swift: 好きなタイミングで画面遷移(コードで画面遷移)する方法。 - ぽじてぃぶしんきんぐ
Swift2:tableViewのセクションヘッダの背景色や文字色を変更する方法 - ぽじてぃぶしんきんぐ

読んだ書籍情報の管理は、はじめはRealmを使っていましたが、ちょっとトラブって結局Coredataを使っています。
Swift: 初心者のデータベース導入[Realm] - ぽじてぃぶしんきんぐ
Swift: CoreDataのモデルで、数値を扱うときにハマったことと、Realmとの比較(簡単に)。 - ぽじてぃぶしんきんぐ
Swift: CoreDataのレコード取り出し時に昇順、降順を指定する方法 - ぽじてぃぶしんきんぐ
SwiftのCoredata(データベース)のマイグレーションで少し苦労した。 - ぽじてぃぶしんきんぐ
次やるときはまたRealmに挑戦してみたいです。

このアプリのメイン機能である発売日の通知のために、書籍の発売日情報を取ってきています。これはWebスクレイピングして発売日情報のデータベースを作っています。
Swift:HTMLをParseする方法(WEBスクレイピング) - ぽじてぃぶしんきんぐ

本の注文は楽天ブックスAPIを利用して行っています。
楽天ブックス書籍検索APIをSwift2.0で使ってみた with SwiftyJSON - ぽじてぃぶしんきんぐ
JSONの処理に少し時間がかかるのでバックグラウンド処理にしてみた。 - ぽじてぃぶしんきんぐ

広告の表示はAdmobを利用して行っています。
Swift2.0とストーリーボードで自分のアプリにAdmobを導入してみた。 - ぽじてぃぶしんきんぐ
Admobの取得をviewDidLoad()に置いてると「this application is modifying the auto layout engine...」と出る件の対処法@Swift - ぽじてぃぶしんきんぐ

以上が「読んだ。」で使っている技術です。たぶん。

何か質問等あればお気軽にどうぞ!

Admobの取得をviewDidLoad()に置いてると「this application is modifying the auto layout engine...」と出る件の対処法@Swift

以前Admobを導入してみた記事を書きました。
seiya-orz.hatenablog.com

テスト運用していると、たまにWebThreadからExceptionを受け取って、アプリが止まることがありました。
そのエラーの内容は「This application is modifying the autolayout engine from a background thread, which can lead to engine corruption and weird crashes. This will cause an exception in a future release.」リリースした時にも起こるかもよ、とか言われてます。

このエラーは、要するに、バックグラウンドスレッドからレイアウトいじっちゃダメですよ、という話。

ただ、自分で書いている部分にレイアウトをいじっている部分は見当たらなく、なんとなくAdmobのせいなのではないか、と思い始めました。とくに、bannerViewに広告を挿しこんでいるのはバックグラウンドな感じがしましたし。

ということで調べてみると、たぶんこの記事が該当します。
groups.google.com

ということで解決策。

dispatch_async(dispatch_get_main_queue(), {
   //広告部分
   self.bannerView.adSize = kGADAdSizeSmartBannerPortrait
   self.bannerView.adUnitID = self.AdMobID  // テスト用ID
   self.bannerView.rootViewController = self
   let admobRequest:GADRequest = GADRequest()
   if self.AdMobTest {
      if self.SimulatorTest {
          admobRequest.testDevices = [kGADSimulatorID]
      } else {
          admobRequest.testDevices = [self.TEST_DEVICE_ID]
      }
   }
   self.bannerView.loadRequest(admobRequest)
})

このdispatch_async()内に広告取得にあたるコードを書き込むことで解決できるようです。今のところExceptionは発生していません。

Admobの公式に書いといてほしかった。もしかしたら書いてるのか?

おわり。

マカーの学生がEclipseからAndroid Studioに移行してアプリをリリースした話。

背景

1年半ほど前に、WindowsPCとEclipseを使ってAndroidアプリをリリースしていた。しかし、1年前に作業機をMacに変更したので、リリースしたアプリはほったらかしだった。ちなみにこれ(結局新しくリリースしたやつ、後述)。
ぷれれこ:録音機能付きプレゼンタイマー - Google Play の Android アプリ

今回なんとなく更新する気になった。そういえば以前自分で研究室後輩たちに向けてAndroid Studioがキテるから使えっていうプレゼンをしていたのを思い出した。今見るとクソみたいなプレゼンだ。

www.slideshare.net

せっかくなのでEclipseからAndroid Studioに乗り換えて、アプリをアップデートしよう。

Android Studio

Android Studio と SDK Tools のダウンロード | Android Developers
これ。なんか昔使ってみようと思ったことがあったはずなんだけど、そのときはメジャーバージョンがまだ出てなかったから使わなかったような気がする。今は2.0のベータ版が出てるみたいなので、時代の流れを感じる。

なんかよくわからんが、Gradleというのを使うらしい。ライブラリの管理とかをEclipseではGUIでポチポチやってたけどそれをコードで書いている印象(あってる?)。なにやらリリース版とデバッグ版とか異なる機能を持つAPKも作成できるらしい、すごい。

とりあえずダウンロードしてインストール。数回クリックしただけで終わった。
f:id:seiya-orz:20151222132334p:plain
なんでもうUpdateのお知らせ来てんだよ、最新版入れたんじゃねーのかよとか思いましたが、今回はスルー。

さてEclipseからプロジェクトを移行しよう。なんか色々外部ライブラリとか使ってるので、Import機能使うとバグりそうな気がした。

ということで、新規でプロジェクト作って順番に書き換えていくスタイルを採用。

Blank Activityでプロジェクト作って、元のプロジェクトからsrcやらresやらをドラッグアンドドロップすればなんかいい感じになった。

ただ、外部の.soファイルを使ってたんだけど、それがうまく読み込めてない現象が発生した。具体的には、System.loadLibrary()を読んでるとこで落ちてる。調べてみるとAndroid Studioでは、「app/src/main/jniLibs」に放り込む必要があるらしいが、放り込んでも落ちる。ふむ、もうちょっと調べてみるとjniLibs/armeabiに放り込む必要があったらしい。なんじゃこりゃ。とにかくやってみたらうまく動いたのでまあいいか。

移行で詰まったのはこれくらい。あとはIDEの使い方に慣れないといけない。

ということでコードをちょこちょこいじってアプリを修正。リリースできる段階に至った。

リリース

上のメニューのBuild/Generate Signed Apk... というところからリリース用APKを作成できるとあったので、やってみた。
qiita.com

前やった時のKeystoreファイルもちゃんと残してあるし、いけるだろ!・・・完全フラグでした。

なんかエラー出てて、作れない。AliasかPasswordが違うようだ。うーむ、わからん。Aliasはもう絶対わからん。無理だ。詰んだ。

しかたない、アプリの公開中止して、新しいアプリとしてリリースするしか無い!ということで、あたらしくKeystoreファイル作ってリリースしなおしました。くそう。今回はちゃんとAliasとPassword覚えました、大丈夫。

ということで、既存のユーザ様(100人くらいしかいないけど)には申し訳ないが、新しいアプリとして出したので、こちらをお使いいただきたい。ごめんなさい。
ぷれれこ:録音機能付きプレゼンタイマー - Google Play の Android アプリ

これからは、暇があればAndroidでもアプリを作ろう。せっかく環境整えたし。やっぱりiOSよりAndroidのほうが慣れてるからレイアウトを組んだりコードを書くのに詰まらないんだよなー。

おわり。