【Swift】久々にiOSアプリを作った時の雑多なメモ

4, 5年振りにiOSアプリを作ってみました。iOS開発に関して色々と変わっていたことを中心に, すぐに忘れてしまう自分用にメモを残しておきます。

  • Swift
  • Swift対応ライブラリ
  • StoryBoard / AutoLayout
  • Firebase
  • CocoaPods
  • Ad-Hoc配布
  • iTunes-Connect

Swift

Swiftが出た頃には既にiOSアプリ開発から離れていたので, Swift2になっていたのも知らなかった。Playground以外で Swift を触ったのは今回が初めてだった。

所感としては Objective-C より記述がシンプルになった感じ。

今回作ったアプリは, ある構造体の配列に対してメンバ変数を key にして filter/sort などの操作を行い TableView で並べるだけのアプリなので, 下記のような書き方ができるのは良かった。

// Filter
let even = [1, 2, 3, 4, 5].filter({ (e) -> Bool in
    if e % 2 == 0 {
            return true
    }
    return false
})
print(even) // [2, 4]

// Reduce
let reduced = [1, 2, 3, 4, 5].reduce(0, combine: { (a: Int, b: Int) -> Int in a + b })
print(reduced) // 15

switch による柔軟なパターンマッチも便利だった。パターンマッチについては, Swift2のパターンマッチ構文集(ほぼ翻訳)が参考になった。

Swift対応ライブラリ

今回使ったSwiftのライブラリは以下。

  • AFNetworking
  • SwiftyJSON
  • ChameleonFramework/Swift
  • Charts

AFNetworking

AFNetworking は networking framework で, 以前に Objective-C で書いていた頃も使っていた。現在の AFNetworking3 は Swift にも対応しており, 基本的な部分でもそれほど変わっていないようだったので使ってみた。iOSから API を呼ぶだけにしか使ってないので細かい所はわからないけど, 特に使いづらい所はなかった。

SwiftyJSON

SwiftyJSON は API で取得した JSON を Swift でハンドリングするために使ったライブラリ。
let json = JSON(jsonObject) とシンプルに書ける。

ChameleonFramework/Swift

Chameleonは UIColor を拡張して FlatColor を簡単に扱える様にしてくれるライブラリ。
UIColor.flatGreenColor() の様に書けるので非デザイナーにとってはありがたかった。

Charts

グラフ表示には Charts を使った。Swift で綺麗なグラフが書ける。

細かい設定に関しては, [Swift] [iOS] チャート表示ライブラリ [ios-charts] 詳細な使い方 が参考になったが, 他にはあまり情報がない感じで, 結局ソースを眺めることになった。

グラフ中心に考えると JavaScript が使いたくなり React Native という選択肢もありだと思った。

StoryBoard / AutoLayout

今回は Tabbed Applicaiton で NavigationController を組み合わせた UI にしたかった。

手順としては, プロジェクト作成時に Tabbed Applicaiton を選択する。これに Tableview を組み込むには StoryBoard の ViewController を選択して Editor > Embed in > NavigationController を選択することで追加できた。

以前は StoryBoard ではなく, 個々の ViewController に対応する xib ファイルをいじったり直接コードで書いていたけど, StoryBoard が出始めた頃より使いやすさが大分良くなった印象だった。

AutoLayout も iOS のデバイスサイズが多様化したこともあり, 使わざるを得ない様な印象だった。以前はコードで書いてない部分で自動で調整される/されないと気持ち悪い感じがしていたが, 単なる食わず嫌いだったのかしれない…

Firebase

Google I/O 2016で ログ解析ツール Firebase Analytics や, Push Notifications が無料・無制限で使えると発表されたこともあり, 試しに組み込んでみた。Firebase Analytics だけであれば, Console でアプリを登録し, Podfile に Firebase/Core を追加してインストールし, 数行のコードを追加するだけで使えるようになる。

AdMob も Firebase に統合されたのだけど, 先に Google-Mobile-Ads-SDK を入れていた影響なのか, Firebase/Core と同時に Firebase/AdMob を入れたら下記エラーとなった。

Use of unresolved identifier 'GADRequest'
Use of unresolved identifiers 'GADBannerView' 

Firebaseの tutorial を見ても解決せず, 結局 Admob pods do not work after firebase integration (stackoverflow) を参考にして, pod関連のファイルを全て削除し, cocoapods をアップデートして pod init からやり直したら上手くいった。

import GoogleMobileAds

@IBOutlet weak var bannerView: GADBannerView!

bannerView.adUnitID = "ca-app-pub-xxxxxxxxxxxxxx/xxxxxxxx"
bannerView.rootViewController = self
bannerView.loadRequest(GADRequest())

CocoaPods

CocoaPodsは言わずと知れた, ライブラリとその依存関係を管理するツール。まだ生きていたのは嬉しかった。

$ sudo gem install cocoapods
$ pod --version
1.0.1
$ pod init

最終的な Podfile は以下となった。

source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '9.0'

target 'YourApp' do
  # Comment this line if you're not using Swift and don't want to use dynamic frameworks
  use_frameworks!

  pod 'Firebase/Core'
  pod 'Firebase/AdMob'
  pod 'AFNetworking', '~> 3.0'
  pod 'SwiftyJSON'
  pod 'ChameleonFramework/Swift'
  # pod 'Google-Mobile-Ads-SDK', '~> 7.0'

  target 'YourAppTests' do
    inherit! :search_paths
    # Pods for testing
  end

  target 'YourAppUITests' do
    inherit! :search_paths
    # Pods for testing
  end

end

下記で xcworkspace, Podfile.lock, Pods/ が生成される。

$ pod install
$ open yourapp.xcworkspace

Ad-Hoc配布

AppStoreで配布する前にテストなどの用途で複数のユーザに試してもらいたい場合, 事前にデバイス登録したユーザにAd-Hoc配布できる仕組みがある。

Ad-Hocで配布するには, Member Center で配布したいiOSデバイスのUUIDを登録し, Ad-Hoc配布用の iOS Provisioning Profile を作る必要がある。

次に, XCodeに iOS Provisioning Profile を登録・設定した上で Product > Archive で配布用のビルドを行う。

ビルドに成功して Export を選択すると, アプリ本体のipaファイルと manifest.plist が生成されるので, これらを https環境のサーバに配置する必要がある。

$ tree
.
└── ios
    ├── apps
    │   ├── app.ipa
    │   └── manifest.plist
    └── index.html

2 directories, 3 files

index.html の例。

<html>
<head><title>Ad-Hoc-Dist</title></head>

<body>
<a href="itms-services://?action=download-manifest&url=https://example.com/ios/apps/manifest.plist">Install Here</a>
</body>
</html>

詳しくは, AppStore 登録前の iOSアプリを Ad-Hoc で配布してインストールする方法 を参考に。

iTunes Connect

iTunes Connect ではアプリの登録・管理・配布申請や, 契約に関する情報登録などが行えるが, 以前と比べると機能が充実し, また使いやすくなっており AppStore 配布までのハードルが随分低くなったように感じる。

5年くらい前はサイト自体が英語表記のみで, Safari以外のブラウザ (Firefox / Chrome) からだと一部機能が上手く動かないこともあったと思う。今でも, 一部英語だけの部分は残っているが, 輸出コンプライアンスの確認など分かりづらい部分はほとんど日本語になっている。

また, アプリの審査の時間が短縮されており, 初回審査申請から審査開始, AppStore配布まで3-4日程度だった。

おわりに

今回, リハビリで作ったアプリは iTunes Store からダウンロードできます。


[1] 使うと手放せなくなるSwift Extension集 – Qiita
[2] Google I/O 2016 で「Firebase」の新バージョンが発表!プッシュ通知機能を iOS アプリで使ってみた
[3] Intro to Higher Order Functions in Swift 3