[Wikimonea]アプリの宣伝と開発を助けてくれた最高のライブラリの紹介[iOS]

# まずは宣伝．．．
5月中旬ごろにゼミの企画でiOSのアプリ開発をすることになり，その頃からアプリの企画を考え始めました．Swiftは本で勉強していたりしてたので基礎的な知識はありましたが，がっつり開発することがなかったので結構大変でした汗
僕が今回作ったアプリはWikimoneaというクイズアプリです．Wikipediaと某クイズ番組の名前を組み合わせてた造語です．
Wikipediaの特定の記事からランダムに１文引き抜き，その文章からどんな記事かを当てるクイズアプリです．まだまだ荒削りなアプリですが，もしよければ遊んでみてください！

[問題文が変わる新感覚クイズアプリ Wikimonea](https://itunes.apple.com/us/app/wikimonea/id1426376447?l=ja&ls=1&mt=8)

## アプリ全体の流れ
アプリ全体の挙動は下のようになっています


![学生アプリコンテスト.001.png](https://qiita-image-store.s3.amazonaws.com/0/193812/eddd80d0-5e2d-2f17-65c6-7d5c7188980f.png)

WikipediaのAPIを叩いて問題文を取得します
![学生アプリコンテスト.002.png](https://qiita-image-store.s3.amazonaws.com/0/193812/ec168110-9bbd-414e-9693-cbb903bfcf06.png)

取得したWikipediaの情報を整理（パース）して，問題文を作成します．
![学生アプリコンテスト.003.png](https://qiita-image-store.s3.amazonaws.com/0/193812/d963505f-da42-01b6-6e91-96cadc05ca13.png)

問題文はランダムに一文切り取っただけなので，適切な問題文になっているとは限りません．これからアプリのブラッシュアップをするため，回答に関するログを採取させてもらっています．
![学生アプリコンテスト.005.png](https://qiita-image-store.s3.amazonaws.com/0/193812/41c701cf-b772-7b23-4295-a5f97f61bc76.png)

Wikipediaのサーバーにクエリを投げて，本文をローカルでパースして問題を作成します．問題文がヘンテコだったり，まだまだ汚い状態なので，今後研究的な要素を含めてログを取らせて頂いています．最初にアンケートで得た年齢と性別以外の個人情報は取得していませんのでご安心ください！

## Wikipediaのパース方法
単純にWIkipediaのAPIを叩いて引っ張ってきた文章だけだとハイパーリンクや特殊な記法，書く人個人の癖などがありかなり汚い状態です．まずは正規表現などを用いてパースする必要があります．!

Swiftはあまり正規表現が強くありません．String型を拡張(extension)させて，他の言語のように簡単に正規表現を用いた関数を持たせました．以下の記事を参考にさせていただきました．良記事ありがとうございます！

[iOSエンジニアの正規表現入門]
(https://qiita.com/shoheiyokoyama/items/5dc67fdc9e06a9dc5728)

[Swift 3.0での基本的な正規表現を行うextension]
(https://qiita.com/KikurageChan/items/807e84e3fa68bb9c4de6)

## 使用したライブラリ

初心者の時はよく自分で全部実装するものだと思いがちですが，どこかのすごく優しい人が作ってくれたコード（ライブラリ）を使うと品質も高くかっちょいいアプリを作ることができるようになります．
果てしなく感謝しながら，ライブラリは積極的に使いましょう！

Wikimoneaで使用したライブラリについて紹介したいと思います．

### [!重要!]ライセンスについて
いきなりですが，皆さんに注意してほしい項目があります．現在，Githubで公開されているライブラリやOSSは基本的に完全無料で再利用可能なものが一般的ではありますが(MITというライセンスに該当します），一部には規約の厳しいものが存在する可能性があります(GNU GLPなど）．
特に，お金が入ったり商用利用にOSSを利用する際には細心の注意を払う必要があるので，十分にお気をつけください！

[OSSのライセンスを理解する（「使用」と「利用」の違い、知っていますか？）](https://qiita.com/bremen/items/c5aa9446e73aa4bc1de0)


### [CocoaPods](https://cocoapods.org/)
まずはライブラリの前にライブラリ管理ツールについて説明したいと思います．Swiftで一番有名なライブラリ管理ツールはCocoaPodsです．他にもいくつかあるそうですが，素直にこれを使うことをお勧めします．
他の言語では，pythonであればpip,Rubyであればgem,node.jsならnpmに該当します．
[【Swift】CocoaPods導入手順](https://qiita.com/ShinokiRyosei/items/3090290cb72434852460)


### [Alamofire](https://github.com/Alamofire/Alamofire)
APIを叩く系のアプリであればほとんどこのAlamofireが使われていると思います．通信周りを簡単にしてくれるライブラリです．

### [SwiftyJSON](https://github.com/SwiftyJSON/SwiftyJSON)
Swiftでは，ネイティブのコードでJSONをパースしようとするとだいぶしんどいです．SwiftyJSONを使用すれば，他の言語と同じような感覚で処理することができるようになります．Swift4以降では，Codableというプロトコルが標準になるので，SwiftyJSONの立ち位置が怪しくなりそうです．．．．

[Swift4 Codableがすごすぎた件](https://qiita.com/UJIPOID/items/2c436a80f1167f7bcac0)

### [SVProgressHUD](https://github.com/SVProgressHUD/SVProgressHUD)
Wikimoneaでは，問題に正解したり問題の取得中にSVProgressHUDを使用しました．あのくるくる回ったりするやつです．
![MixLeap.001.jpeg](https://camo.githubusercontent.com/6ed028acbf67707d622344e0ef1bc3b098425b50/687474703a2f2f662e636c2e6c792f6974656d732f32473146315a304d306b306832553356317033392f535650726f67726573734855442e676966)

ライブラリを導入すれば一行で使えるので本当に役立ちます！色々な表現が用意されていたり，使い勝手もとても良かったです！

### [BWWalkthrough](https://github.com/ariok/BWWalkthrough)
他の色々なアプリケーションでも，最初だけ表示させるチュートリアルがあるかと思います．これをネイティブアプリではWalkthrough(ウォークスルー）といいます．

![image.png](https://camo.githubusercontent.com/da60dc338f1325ad6f317e850d79ec135e64b116/687474703a2f2f7777772e7468696e6b616e646275696c642e69742f676966732f425757616c6b7468726f7567685f6d696e69322e676966)

豊富なアニメーションであったり，拡張性も高かったりととても使い勝手が良かったです！結構Walkthroughを自前で全て実装するのはハードルが高いですが，これを使えばサクッとWalkthroughを実装できます．また，カスタムも行いやすくWikimoneaの場合はアンケート機能を追加しました．


### [StoreKit](https://developer.apple.com/documentation/storekit)
これは外部のライブラリではなく，標準で備わっているライブラリです．これも最近のアプリでよく見るやつで，使用しているアプリの評価を促すやつです．こんなやつです．

![スクリーンショット 2018-08-08 0.03.41.png](https://qiita-image-store.s3.amazonaws.com/0/193812/9b6ed4d3-5522-0d1d-207c-022cfb7aaf37.png)

具体的なコードとしては

```swift
import StoreKit
```
でライブラリをインポートし

```swift

SKStoreReviewController.requestReview()
```
で簡単にレビューを促すことができます．StoreKitはappstoreに関わる機能を実現するためのライブラリなので課金周りでも使用されるとのことです．レビューを促す機能はあまりにも表示してしまうとうざいだけなので気をつけましょう．僕はメニュー画面で任意のタイミングで呼び出せるようにしました．

### [GoogleSpreadSheet](https://www.google.com/intl/ja_jp/sheets/about/)
これはもはやライブラリではないですが，とても良かったので紹介させていただきます．
上のアプリ概要でも紹介させてもらったように，回答に関するログをGoogleSpreadSheetで最終させてもらっています．これは，サーバーをリモートで持つのが辛かったり（金銭的な意味で），データベースの選択や設計がしんどかったためです．そもそも収集するデータの構造が複雑でないので，この方法で十分でした．
GoogleSpreadSheetとWEBAPIとして公開して，サーバーとして動かす方法は今回試してとても良かったです．通信量の制限や運営する上でしんどいところがあったら，他の方法も検討します．

#　デザインについて
### [Sketch](https://www.sketchapp.com/)
デザインツールといえばAdobeのイラストレーターが有名ですが，僕はSketchというアプリを使いました．学習コストも低く，豊富なプラグインもあったり，学生は半額で購入できるなどとても良かったです（使いこなせていませんが）！
プログラミングメインで，デザインはある程度かければ十分という方であればSketch最高ですよ！

### [human pictogram 2.0](http://pictogram2.com/)
あの非常口のキャラクターがいろんな状況を表現してくれます！再配布，販売をしなければ無料なのでかなり重宝しています！

![1.png](https://qiita-image-store.s3.amazonaws.com/0/193812/e8a5690f-3fdf-8b93-7e06-18ae535e5114.png)

#　最後に
補足事項などあれば適宜追加していきます．時間があるときにブラッシュアップしていきますので，またこれからもいろんなライブラリを使うことになるかと思います！それでは良き開発ライフを！！！