読者です 読者をやめる 読者になる 読者になる

アニマネ開発日誌

アニメアプリのアニマネの開発日誌です。

アニメアプリのアニマネver3.0で実装したことのまとめ

先日iOSアプリとして提供している、アニメアプリのアニマネをver3.0としてリリースしました。

app.animane.net

メジャーバージョンアップとなり、使い勝手が大幅に刷新されましたので、 記録として今回行った作業をまとめておこうと思います。

Xcode7,iOS9への対応

Swift2.0への対応

Xcodeの移行アシスタント(?)みたいなので自動置換し、 そのあとは軽く修正するだけですみました。

現在のアニマネのSwift比率は1割ぐらいで、Swift製のライブラリは利用していないため、 比較的軽い作業でした。

bitcodeをNOにする。

ビルド時に遭遇した問題です。

Xcode7でビルドすればエラーが出るのですぐに分かると思いますが、 リンクだけ張っておきます。

Storyboard Referenceの導入

Storyboardの肥大化は前から問題視していたので、3.0ではStoryboardの分割を進めていました。

ただ、普通に分割すると画面遷移がコードになってしまうため、ContainerViewの仕組みを使って従来通りsegueで遷移できる仕組みを作っていました。

しばらくはその方法で進めていたのですが、Xcode7でStoryboard Referenceが使えることを知り、こちらに切り替えました。
ver3.0からはiOS8以降の対応としたのも大きな理由です。

機能的には自前で実装したものとそれほど変わらないのですが、SDK標準ということで安心して使えます。

Storyboard Referenceについては、下記が参考になります。

UIToolBarのアニメーションが遅延する問題

UITabBarController + UINavigationControllerの組み合わせでUIToolBarをアニメーションすると、
黒い背景のView部分が先に表示され、少し遅れてツールバーが表示されるという謎の現象に遭遇。

StoryBoardのUnder Bottom Barsのチェックらへんが怪しかったのですが、 結局解決ができなかったので、同じような処理を自作しました。

Launch Screenにxibを指定していたのに、imageになっていたため修正。

これもよく分からない現象でしたが、修正後は特に問題なかったので深追いはしませんでした。

viewWillLayoutSubviews()あたりの調整。

XcodeのバージョンやiOSのバージョンが変わると毎度のことなのですが、
View周りの挙動が微妙に変わってレイアウトが崩れるので調整しました。

UX/UI周り

スワイプで移動するメニューの導入。

コンテンツの種類が増えて、UITabBarだけでは限界がきたので、SmartyNewsのようなUIを導入しました。

その際に比較したライブラリは下記にまとめています。

今回はRMPScrollingMenuBarControllerというライブラリを使ったのですが、 あとで知ったHMSegmentedControlも良さそうなので、比較して良さそうであれば乗り換えを検討しようかと思っています。

高さの計算方法を変更

iOS7のサポートを切ったので、UITableViewCellの高さを自動で計算する形に変更しました。

self.tableView.rowHeight = UITableViewAutomaticDimension;

画像をfadein

より自然な感じで見えるようにfadeinで表示させるようにしました。 Objective-Cですが、SDWebImageを使った場合はこんな感じです。

UIImageView * __block imageView = self;
[self sd_setImageWithURL:[NSURL URLWithString:url] placeholderImage:[UIImage imageNamed:@"noimage.png"]
               completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
                   if (image && cacheType == SDImageCacheTypeNone)
                   {
                       imageView.alpha = 0.0;
                       [UIView animateWithDuration:0.7
                                        animations:^{
                                            imageView.alpha = 1.0;
                                        }
                        ];
                   }
               }
];

ユニバーサルアプリ化

サポート対象をiOS8以降にしたため、Size Classを使って、ユニバーサルアプリ化しました。 ただ、まだany/anyしか使ってないので、その内iPad向けには最適化しようかと思っています。

ニュース記事のSQLite

アニマネではサーバー間の通信でJSONではなくSQLiteファイルを直接配信しています。

この辺はもう色々書いたので、ここでは特に説明しないのですが、 MessagePackで通信していたニュース関連をSQLiteで扱うように変更しました。

今後のニュース記事では除外サイトの指定や、特定サイトだけ閲覧できるようにするとか、 ユーザーカスタマイズの余地が大きく入るので、リニューアルを機にSQLite化しました。

サーバー側で絞込や並び替えを実装すればよいだけではありますが、 アニマネではサーバー側リソースをできるだけ使わない方針で開発しています。

ニュース記事については日毎にファイルを分割し、差分だけ更新できるようにしています。

データ量が少ないとJSONよりもファイルサイズが大きめになりがちでしたが、
データの正規化を行えばそれほど変わらないサイズまで縮小できました。

もちろん通信時にgzipで圧縮しているので、それ程ストレスなく使えています。

通信してもJSONとさほど変わらない速度で、データ取込み後は通信がない分高速なので、 密結合とバージョン互換のリスクを許容できれば個人的にはアリかなと思っています。

コンテンツ関連

動画配信情報のコンテンツを追加

ニコニコアニメチャンネルやGyao!バンダイチャンネルで配信されている情報を追加しました。

今のところはただそのまま掲載しているだけなので、 今後のアップデートで作品毎にまとめたりする予定です。

アニメ関連グッズのコンテンツを追加

アニメ関連グッズの価格比較サイトの情報を掲載しました。

AmazonやYahoo、楽天などの商品を独自のアルゴリズムで同じ商品をまとめて比較できるようにしたサイトです。

できるだけ最適化は頑張っていますが、サーバーが重いため、引っ越しも検討中です。 アフィリエイト報酬がもう少し増えればサクッと移行するのですが、先行投資しないとダメかな。。。

ビルド・申請関連

ファイルが大きいというwarning

一瞬ドキッとしましたが、特に問題ありませんでした。

ITMS-90474

iPadに対応する場合は、マルチタスクに関する対応が必要でした。

上記を参考に解決。

SFSafariViewControllerの試験導入

部分的に導入してみましたが、やはり使いづらい。

  • modalでないとまともに動かない
  • サイズ調整がまともに行えない

閉じるボタンが画面右上で押しにくいため、下記を参考にジェスチャーで戻れるように組み込んだけど、実機だと動かない。。。

http://www.stringcode.co.uk/push-pop-modal-sfsafariviewcontroller-hacking-swipe-from-edge-gesture/

解決には時間が掛かりそうだったので、今後の課題としています。

広告関連

とある広告SDKを削除

具体的な名前はだしませんが、とある広告会社のSDKを削除しました。

SDKを導入する際にURLスキームを追加する指示があったためです。

iOS9ではURLスキームを個別にinfo.plistに書かないと、canOpenURLが正常に動作しないようになりました。
これはアップルが個人のプライバシーに配慮した結果なんですね。

広告会社などがcanOpenURLを使ってユーザーにインストールされているアプリを調べていたりしたことに対する措置です。

それにも関わらず、SDKを組み込む際に大量にURLスキームをinfo.plistに記載する指示があったため、SDKを削除することにしました。

元々SDKがよく落ちて不満があった上に、報酬の最低支払金額が高く(Admobより高い)、
いつかは廃止しようとしていたのですが、広告のためのURLスキーム実装をデベロッパーに行わせるという方針をみてやめることにしました。

中国ではSDKが入っているアプリごと削除されたという事例もあるようですし、巻き込まれないための自衛の措置でもあります。

ただ、最低支払金額の半分ぐらいの金額はたまっていたので残念でなりません。

バナー広告をHTMLベースからSDKベースに変更。

2015年の春先頃から始まった、広告SDKのリジェクト祭り。

主にリワード広告やアイコン広告を導入しているSDKが名指しでリジェクトされ、 iOSの開発者の間ではちょっとした騒ぎになっていました。

アニマネでは複数の広告SDKを利用していた関係もあり、当時リリースしようとしていたバージョンが2ヶ月ぐらいリジェクトの影響で遅れました。

今後も同様のことがあるとダメージがでかいので、バナー広告に関してはSDKではなくHTMLベースのタグに切り替えていたのですが、 これが表示されなくなっていました。

広告配信のプラットフォームに利用しているDFPのバージョンを上げたことがきっかけで起こったようです。

DFPはDoubleclick for Publishers略で、簡単に説明するとAdmobメディエーションの上位版みたいな感じです。
広告配信プラットフォームとしては無料ということが信じられないくらい多機能なのですが、個人で利用している人はあまり見かけないかも。

非常に便利なのでそのうち記事にしたいと思いますが、今回のところは詳しい説明は省略します。

それで、広告が表示されなくなった件の深追いはしていないのですが、調べていると非SSL通信が遮断されているようでした。
iOS9のATSとは関係なさそうで、どうもDFPSDK内部の問題(仕様?)のようです。

どうにも手出しができないので、渋々SDKベースに切り替えると問題なく表示できました。

いくつかの広告会社のJSタグがhttpsに対応していないため、各広告会社の対応が終わればHTMLベースの配信に戻す予定です。

ネイティブ広告の露出を増加

ネイティブ広告のSSPを一社増やして、現在は4社で配信しています。

自作のメディエーションのような仕組みを使って各社の広告をなるべく被らないように、 アプリ全体に配信しています。

まだ色々と実験中なので、その内記事にしてみたいなと考えています。

あと、「PR」の文字に色を付けて目立つようにしてみました。 色をつけた方がクリック率が上がるようなら、色や文言を変えてA/Bテストをしてみる予定です。

iTunes Connectに申請するスクリーンショットの刷新

iPhone向けは下記の記事で紹介したもので作りました。

ユニバーサルアプリ化したので、iPad向けが必要になったのですが、 とりあえず今回は素のスクリーンショットで申請。

iPad向けのUIはそのうち最適化するので、その時に差し替えしたいと思います。

3.0ではコンテンツを追加しやすいUIとなったので、今後は声優情報なども追加する予定です。

今年のアップデートは本日12/1にリリースとなったver3.1が最後になる予定です。

あと、Android版は現在開発を進めていますので、段階的にリリースしていく予定です。 早ければ年内に最初のバージョンがリリースできるかも。

相変わらずマイペースな開発状況ですが、アニマネをどうぞよろしくお願い致します。