リリース済みiOSアプリのソースコード、全部見せます！

# 更新内容
2022年8月10日:GitHubに公開しているアプリをXcode13.4.1以降に対応（詳しくは[こちら](https://github.com/RyutaMiyamoto/Innovy "Innovy公開リポジトリ")を参照。）

# はじめに

今回、アプリのソースコードを公開しようと考えたのには以下の理由があります。

- 自分が作ったアプリを多くの人に見て欲しい。
- いろんな人の意見を聞きたい。
- コードを共有することでアプリを作る人の手助けがしたい。

この記事が皆さまのお役に立つことができれば幸いです😃

# アプリの紹介
Innovy（イノービィ）。
最新のサービスや技術の情報収集にアンテナを立てている20代〜30代（主に男性）向けのニュースアプリです。
※革新者（イノベーター）をイメージした名前にしました。

![AppIcon1024_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/160811/203eb665-a087-c7d5-d762-8ec5546e770e.jpeg)

ジャンル別の最新ニュースやユーザの反応を見ることができます。
また、ニュース読み上げ機能があるため、歩きながらニュースを確認することもできます。
アプリURL：https://itunes.apple.com/us/app/イノービィ/id1319179144

### スクリーンショット
![IMG_5140_4.jpg](https://qiita-image-store.s3.amazonaws.com/0/160811/ed3c3726-c922-6634-0da7-3d21050a8e1b.jpeg)

#### ①ニュース一覧画面
アプリのトップページでいろんなジャンルのニュースを確認できます。
ニュースをタップで詳細画面、横方向スワイプでジャンルを変更。

#### ②ニュース一覧画面（ニュース長押し）
ニュースを長押し後、「この位置から聞く」タップでニュースを選択した箇所から読み上げ開始。

#### ③ニュース詳細画面（記事読み込み中）
ニュースの詳細を確認できます。
この画面からニュースのクリップと、表示中ニュースに関するツイート確認ができます。

#### ④ツイート一覧画面
一覧から選択したニュースに関するツイートを確認できます。
ツイートボタンを押すことでツイートができます。

#### ⑤記事検索画面
過去のニュース検索ができます。

#### ⑥設定画面
現在場所の天気予報の確認と、アプリの設定変更をすることができます。

# 公開ソースコードとアプリの起動

まず以下のURLにアクセスします。

https://github.com/RyutaMiyamoto/Innovy

`Clone or download`→`Download ZIP`の順に押してプロジェクトをダウンロード。
そしてダウンロードしたzipファイルを解凍してください。
<img width="512" alt="スクリーンショット 2018-06-02 13.38.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/160811/d153df5f-e3f6-d8f3-8390-618ce33f4cb4.png">

次のcocoaPodsを使用してライブラリをインストールします。
cocoaPodsインストールする方法は[別の記事](https://qiita.com/ShinokiRyosei/items/3090290cb72434852460)を参照してください。
cocoaPodsインストール後はターミナルを開いて、Innovy-masterフォルダに移動し、`pod install`コマンドを入力してライブラリのインストールが終わるまで待ちます。

ライブラリのインストールが終わったらInnovy-masterフォルダを開いて`likeNews.xcworkspace`を開きます。
推奨環境：XCode9.3

<img width="629" alt="スクリーンショット 2018-06-02 13.40.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/160811/9525f431-af88-134c-0176-e2a9476f4dcd.png">

XCodeを開いたら`iOS Simulators`で適当な端末を選択して、`Runボタン`を押します。

<img width="917" alt="スクリーンショット 2018-06-02 13.50.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/160811/9adea365-f29c-8ab6-5d8c-e98f350de534.png">

シミュレータ＆アプリが起動したら成功です。
もちろんProvisioning Profileを設定すれば実機での動作も可能です。

<img width="208" alt="スクリーンショット 2018-06-02 14.33.22.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/160811/b8009f75-b0d8-8c12-3b0d-e7769012f20b.jpeg">

Firebaseのplistや、回数制限のあるAPIのAPIKeyなどはマスクしてありますので一部表示されないものがあります。
別途連絡していただければマスクしてある項目もお渡しします🙃
※ただし、（Facebookなどで）身元のはっきりしている方に限らせていただきます。

# アーキテクチャ紹介
Innovyではアーキテクチャパターンとして[MVVM（Model-View-ViewModel）](https://ja.wikipedia.org/wiki/Model_View_ViewModel)を採用しています。

例えばニュース一覧画面でユーザが最新ニュースの再取得の操作（画面を上方向に引っ張る）をすると以下のように動きます。
※コード上の`NewsListViewController`を`View`、`NewsListViewModel`を`ViewModel`、`NewsListModel`を`Model`として考えます。

![アーキテクチャ.jpg](https://qiita-image-store.s3.amazonaws.com/0/160811/29efe10f-5caa-8af5-7bea-b1334f2b346b.jpeg)

①. `View`がユーザによる更新操作を検知
②. `View`が`ViewModel`に更新処理を依頼
③. `ViewModel`が`Model`にニュース一覧取得を依頼
④. `Model`がニュース一覧取得APIを使用し、最新ニュースを取得
⑤. `Model`が`ViewModel`にニュース取得完了を通知
⑥. `ViewModel`が`Model`から取得したニュース一覧を元に`View`で表示するためのデータを作成
⑦. `ViewModel`が`View`にデータ作成完了を通知
⑧. `View`が`ViewModel`の情報を元に画面を更新

こうして最新のニュース情報がアプリに反映されるわけです😉


# アプリで使用しているライブラリ紹介
### [R.swift](https://github.com/mac-cain13/R.swift)
画像ファイル名やStoryboard名をプロパティとして取得できるようになるため、タイプミスによるエラーを防いでくれる。
画像ファイル名、アラート用メッセージ、xib名など至る所で使用。

### [Alamofire](https://github.com/Alamofire/Alamofire)
HTTP通信を楽に行うためのライブラリ。
通信を行うiOSアプリ開発において誰もが使用しているのではないでしょうか。
API通信部分で使用。

### [SDWebImage](https://github.com/rs/SDWebImage)
UIImageViewに対してURLを指定するだけで画像の読み込み、読み込み中表示、キャッシュまでしてくれるライブラリ。
記事画像の表示部分で使用。

### [Unbox](https://github.com/JohnSundell/Unbox)
Jsonをパースしてくれるライブラリ。
APIで取得したJsonをアプリ内部で使用するために取り出す箇所で使用。

### [Realm](https://github.com/realm/realm-cocoa)
アプリ版データベース。
データのアクセス構文がとてもわかりやすい。
記事情報の保存で使用。

### [CTFeedback](https://github.com/rizumita/CTFeedback)
お問い合わせ画面を簡単に作成できるライブラリ。
お問い合わせ画面で使用。

### [SVProgressHUD](https://github.com/SVProgressHUD/SVProgressHUD)
画面最前面に処理中を表すインジケーターを表示するためのライブラリ。
記事情報取得中に使用。

### [HockeySDK](https://github.com/bitstadium/HockeySDK-iOS)
アプリクラッシュ時のクラッシュレポートを収集してくれるライブラリ。
起動時に設定。

### [Firebase](https://github.com/firebase/)
アプリの利用状況調査、クラッシュレポート閲覧、プッシュ通知使用などのアプリ総合サーポートライブラリ。
起動時に設定。

### [NendSDK_iOS](https://github.com/fan-ADN/nendSDK-iOS)
広告を表示するためのライブラリ。
記事表示時に使用。

# API紹介
## 記事情報取得API（自作）(likeNews/getNews.php)
記事情報を取得するためのAPI。
一覧表示時に使用。

## ジャンル情報取得API（自作）(likeNews/getGenre.php)
ジャンル情報を取得するためのAPI。
ジャンルには「スタートアップ」、「サービス」、「デザイン」などがある。
起動時に使用。

## 記事スコア加算API（自作）(likeNews/updateNewsScore.php)
記事詳細を見た回数を加算するためのAPI。
記事一覧から任意の記事をタップし、記事詳細を開いたタイミングで使用。
これにより記事を表示した時に「他に○人の方がこの記事を注目しています！」を表示させることができる。

## [ツイート情報取得API](https://api.twitter.com/)
Twitterからツイート情報を取得する取得するためのAPI
記事詳細画面下部のツイートボタンをタップするとツイート一覧が表示されるが、その一覧取得時に使用する。

## [天気情報取得API](https://openweathermap.org/)
天気情報を取得するためのAPI。
緯度経度を指定すると、その場所の天気情報が取得できる。
設定画面で表示している天気情報表示時に使用。

## [位置情報取得API](https://geoapi.heartrails.com)
位置情報を取得するためのAPI。
緯度経度を指定すると、その場所の住所が日本語で取得できる。
天気情報APIでは住所が英語でしか取得できないため、別途このAPIで住所を取得する。
天気情報APIと一緒に使用。

# 終わりに

いかがだったでしょうか。

この記事を読んで皆さんのiOSアプリ開発のヒントになっていれば、これほど嬉しいことはありません😀
公開しているソースコードはMITライセンスです。（改変、再配布、商用利用など、どんなことにでも自由お使いください）

また「いいね」ボタンや、GitHubのスターを押してくれるととても励みになります😆

#### いいねボタン
<img width="59" alt="スクリーンショット 2018-06-02 15.00.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/160811/f96867f2-0dba-063c-0921-8e755caf1b36.png">


#### GitHubのスター
https://github.com/RyutaMiyamoto/Innovy
<img width="404" alt="スクリーンショット 2018-06-06 23.41.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/160811/3e35984d-0532-1b0e-39dc-a04bca3e15d0.png">


質問や、GitHubへのプルリクも大歓迎です🙂


※6月6日：ライセンスの記述を追加