MILLEN BOX

音楽好きの元組み込みソフトエンジニアによるプログラミング(主にiOSアプリ開発)の勉強の記録

ほぼ初心者がiOSアプリをリリースするまでやってことまとめ [swift1.2] [swift2.0]

前回正式にお知らせ致しましたが、iOSアプリShootSpeedがリリースされました。
たくさんの方にダウンロード頂き感謝の気持ちでいっぱいです!

▶︎2本目のアプリShootSpeedをリリース!そしてそれをオープンソース化! - MILLEN BOX

また上記事のタイトルにもある通り、本アプリをオープンソースとしました。 (ソースは以下リンクから)

github.com

今回は、過去記事からリリースまでに行ったことの足取りを振り返りたいと思います。

あ、手前味噌ですがリリースアプリは以下のリンクから。宜しくお願いします!

ではいきましょう。

0. 説明の前に注意事項

今回は過去に投稿した記事から、どのように今回リリースしたアプリが作成されたかを追っていくものです。
しかし、今回は作成中にswiftが1.2から2.0へとアップデートされたため、記事によっては2.0にてそのままの書き方が使えないことがあります。
今思いつくものとしては以下。

記事のタイトルに、使用しているswiftのVerを記載していますので、申し訳ありませんがそれらを参考に対応頂けると有難いです。

1. はじまりはここから

▶︎swiftでタイマー処理がしたい [swift1.2] - MILLEN BOX

ボタンをタップする → 数値をカウントアップする という動作の実装は難なくできてました。
しかし今回は「10秒以内のタップ回数を計測」しなければなりません。
それを解決する為にタイマー処理についてお勉強し、連打アプリの原型を作成しました。
この記事ではタイマー処理の方法について主に記載しています。

2. 単体テストプログラムを仕込む

▶︎〜Tests.swiftって何?XCTestでの単体テストのススメ [swift1.2] - MILLEN BOX

タップすると数値をカウントアップし、それをViewに表示するという流れとなりますが、その際何桁目まで表示するのか という天井を設定しとかなければなりません。
そして天井を作成したことによって、天井に達した時に仕様通りにカウンターリセットがされているかを確認しとく必要があると思いました。

一方Xcodeには、XCTestという優秀な単体テストツールが標準で入っているという情報を入手した為、一度使ってみよう!と上記事を書きました。

3. ハイスコアを保存する

▶︎NSUserDefaultsを使ってゲームのハイスコアを永続化する [swift1.2] - MILLEN BOX

シュ⚪︎ォッチをモチーフとした連打ゲームですので、カウントアップした数値を既存の数値と比較し、高い方をハイスコアとして保存(永続化)しなければなりません。
上記事では、NSUserDefaultを使用した保存方法について記載しています。

4. Game Centerへの対応

対戦要素を加えたくてGame Centerへの対応を行いました。
Game Centerへの対応については4記事に渡りました。

▶︎SwiftでのGameCenterはじめの一歩。ログインを簡単に行う [Game Center初心者向け] [Swift1.2] - MILLEN BOX
▶︎Game Center 2歩目。非アクティブからの復帰時のGame Centerログインに対応する [Game Center初心者] [swift1.2] - MILLEN BOX
▶︎Game Center 3歩目。ハイスコアの送信に対応する [swift1.2] [Game Center] - MILLEN BOX
▶︎Game Center 4歩目(完結)。Leaders Boardでハイスコアの確認に対応する [swift1.2] [Game Center] - MILLEN BOX

Game Centerですが、想定していたよりも随分手間取ってしましました。
自分で作成した地雷に自分で引っかかる というようなことの繰り替えし。
しっかり理解していれば、そこまで時間がかかることはなかったのかもしれませんが...。 もう同じ轍は踏みたくないです。

5. Game Center対応中にハマったこと

▶︎Swiftで複数のソースファイルを使用する際の注意事項 [swift1.2] [XCTest] - MILLEN BOX
▶︎Game Center 番外編。Leaders Boardの表示がNo Scoreから変更されない! [swift1.2] [Game Center] - MILLEN BOX

「自分で作成した地雷」の主なものが上記リンクです。
特に"Swiftで複数のソースファイルを〜"の方は、解決までかなりの時間を要しました。
ですので原因が分かった時のスッキリ感は忘れられません。
ちなみにこの記事は、わかりにくい私の文章の中で輪をかけて分かりにくい仕上がりになっております。

6. コスリ機能の追加

▶︎連打アプリをコスリ対応するには? [swift1.2] [GestureRecognizer] - MILLEN BOX

コスリ機能を対応させてことにより、このアプリへの愛が出てしまいリリースへと繋がっています。
コスリ機能はUIPanGestureRecognizerを使用することで実現しています。

7. Viewの点滅を繰り返す方法とそれを停止させる方法

▶︎Viewの点滅を繰り返す方法とその終了方法 [swift1.2] [animateWithDuration] - MILLEN BOX

記録を更新した時にディスプレイ部分を点滅させる必要がありました。
点滅させ続ける方法については、以前から個人的に多用している animateWithDuration を使用することで実現できました。
しかしそれをどうやって停止させればよいか分からず(animateWithDurationのパラメーターではRepeatの終了タイミングを設定できない)、色々ネットを徘徊した結果の備忘録がこれです。
今回は終了したいタイミングで別アニメーションを実行してRepeatを無効にする方法(力技)と対象のViewのCALayerで removeAllAnimations をすることで停止する方法を紹介しています。

8. SNSへのシェア機能を付ける(スクリーンショット付)

▶︎スクリーンショットをUIImageに保存する方法 [swift2.0] [UIImage] [UIView] [スクリーンショット] - MILLEN BOX
▶︎Social.frameworkを使ってシェア機能付ける [swift2.0] [Social.framework] [SLComposeViewController] - MILLEN BOX

TwitterFacebookのシェア機能を追加しました。
アプリでシェアしたものは、

  • 文章
  • ハイスコア
  • アプリのダウンロードアドレス
  • ハイスコアのスクリーンキャプチャ

です。
スクリーンキャプチャについては2番目のリンク記事で方法を残しました。

9. ボタンを鳴らした時にクリック音を、ハイスコア更新時にはめでたいサウンドを鳴らす

▶︎お手軽にクリック音付きボタンを作成する [swift2.0] [UIButton] [AudioServicesPlaySystemSound] - MILLEN BOX

ちょっと調べると今回の用途では AudioServicesPlaySystemSound を使用してシステムサウンド(iOS端末に予め入っているサウンド)を使用するのが一番お手軽だ という結論に至りました。
上記事はそれを備忘録として纏めたものです。

10. アラート表示用のViewで簡単な操作マニュアルを表示させようと思ったが...

▶︎iOSバージョンによって異なった処理でアラートを表示する [swift1.2] [UIDevice] [UIAlertController][UIAlertView] - MILLEN BOX

ボタンを押す → 簡単なマニュアルを表示したアラートを表示 というものを実装しようとしましたが、そこで少し問題が...。
iOS7まで広く使われていたUIAlertViewはiOS8以降は非推奨となり、その変わりにUIAlertControllerというクラスを使用することが推奨となったことを知りました。
現状、iOS8以降でもUIAlertViewは使用できますが、今後のためと勉強のために使用しているiOS Verによって、表示処理を変更しました。

11. AdMobバーナー広告を表示する

▶︎SwiftでAdMobバーナー広告を表示する [swift1.2] [AdMob] [GoogleMobileAds] - MILLEN BOX

AdMobバーナーの表示方法について、自分で作成した地雷により今回がっつりハマってしまいました。
後々に見返せれるように、備忘録として記事を残しました。 あとswift2.0対応でBitcodeをOffにしないとビルドが通らなくなりました。
参考xyk.hatenablog.com

12. 表示しているデバイスのスクリーンサイズによって広告表示サイズを変更

▶︎使用しているデバイスの画面サイズを取得する方法 [swift1.2] [UIScreen] - MILLEN BOX

端末によってAdMob広告の横が途切れるような現象が見られたので、4.7インチや5.5インチのディスプレイサイズとそれ以外で広告の表示領域を変更したくて上記事内容を調査しました。
他はゲーム内にハチさんの画像を表示しているのですが、3.5インチディスプレイのみ他に比べ小さい割合で表示する時に使用しています。(広告と被ってハチが表示されなかった為、リジェクト要因を減らす目的で追加)

13. 他言語対応

▶︎iOSアプリの他言語化対応方法 [Xcode6.4] - MILLEN BOX

ShootSpeedは一応全世界で販売したいと考えていました。
その為、日本語で表示されている箇所については、iOSの言語設定が日本語以外の時には英語で表示したいと考えました。
上記事はその方法を纏めたもの(参考にしたリンク+自分がハマった注意事項)を備忘録として残したものです。

14. お絵描き作業

▶︎ファミコンのボタン(っぽいもの)を描く!! (Pixelmator3.3.3) - MILLEN BOX

機能的には、13まででほぼほぼ仕上がっています。
しかし私は、ボタンに関しては絶対自分の納得できるものを作成したいと考えていました。
その思いが上記事に詰まっています。
因みに本当にデザインに関しては勉強したことなければ、今回も全く何かを読んだ訳ではありません。
似たようなアプリを見つけてはボタンを凝視し研究しました。(悪く言えばパクリですよね...。)
A/Bボタンだけでなく、スタートボタンもほぼ同じ要領で書いています。
またデジタル数字なんかも作成しましたが、ここでは割愛しました。

15. 作成したボタン画像を貼り付ける

▶︎UIButtonに画像を貼り付ける (Storyboard編) (Storyboard) - MILLEN BOX
▶︎UIButtonに画像を貼り付ける (ソースコード編 UIViewContentModeで丁度よく) (swift2.0)(UIViewContentMode)(AspectFit) - MILLEN BOX

14で作成した画像を貼り付ける方法として、上記事に纏めました。
ShootSpeedでは、ソースコード上で貼り付ける方法をとっています。
理由としては、コスってカウンタを上昇させて間も、ボタンの押し下げを画像に反映させたかったためです。

16. コスリ機能の不具合(指を離してもボタン押下状態の画像から切り替わらない)対応

▶︎GestureRecognizerを使用している場合の指を離した時の認識方法 [swift2.0][GestureRecognizer][.Ended] - MILLEN BOX

6と15にて実装したコスリ機能ですが、特定の条件化で指を離した場合、ボタンの画像が押した状態から通常状態に切り替わらない不具合があることがわかりました。
UIPanGestureRecognizerに処理を持っていかれているため、私の考える既存のやり方では指を離したことが認識出来なかったのです。
その不具合の対策として分かったことをまとめたのが以下の記事です。
UIPanGestureRecognizerに処理が持っていかれている時に、どのようにして指を離したことを認識するかについて書いています。

17. バックグラウンドの処理を無効にする

▶︎バックグラウンド動作を無効にする [Xcode] - MILLEN BOX

SNSのシェア機能でつぶやく内容をどうしようと考えていた時、バックグラウンドで動いていることを考慮することが何かと面倒くさいことに気づきました。
今回のアプリは非常にシンプルなものなので、思い切ってOFFにしました。

18. 番外編 Autolayout

▶︎大嫌いだったAuto Layoutさんだが、この7つの記事のお陰で和解が出来そう。 - MILLEN BOX

AutoLayoutって知識として知るというよりは、使って使って身につくもんなんかな と最近感じています。
私は上記事であるような流れで知識をつけて、その後で本で少し勉強したら、突然手が勝手に動くようになっていました。
今のところ、私のやりたい範囲では不自由ない感じです。
その時読んだ本というのは以下です。
AutoLayoutを練習する意味でとてもいい本だと思います!(何より安い!)

http://www.amazon.co.jp/iOSアプリ開発-AutoLayout徹底攻略-Mynavi-Advanced-Library-巧尚-ebook/dp/B00XKGB2K8www.amazon.co.jp

以上です。
アプリを出したい!けど一歩が進まないという人の参考になれば、本当に嬉しいです。