Think Big Act Local

iPhone開発を軸にブレブレの記事を書いていきます。

個人アプリの爆速開発を支えてくれたiOSの便利ライブラリを紹介する

先日 Go MemoというiOSアプリをリリースしました。

Go Memoは週末4日間くらいで作ってリリースしたアプリなのですが、こうしてスピードを出せたのは便利なライブラリのおかげです。

この記事ではGo Memoで使ったライブラリを紹介しようと思います。

f:id:himaratsu:20140815001206j:plain

便利なiOSライブラリ

AFNetworking

言わずとしれた定番ライブラリ。作者の mattt さんも非常に有名です。サーバーとのHTTP通信はほとんどこれに頼っていて、NSURLSession とか自分で書いてないです。

Go Memoでは foursquare API をたたく所で利用しています。

NSDictionary *params = ...;

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager GET:@"https://api.foursquare.com/v2/venues/search"
  parameters:params
     success:^(AFHTTPRequestOperation *operation, id responseObject) {
         // ... ここでレスポンスを処理 ...
     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
         // ... ここにエラー処理 ...
     }];

MagicalRecord

CoreDataを簡易に扱うためのライブラリ。データの永続化によく使われるCoreDataはとても便利なのですが、巨大すぎて使いこなすまでには時間がかかります(色々とクセがある)。
MagicalRecordはそんなCoreDataへのアクセスを簡易にしてくれるライブラリです。

Go Memo では登録した場所の情報をCoreDataに保存しており、MagicalRecordで扱っています。

// 登録したメモ(場所の情報)を全件取得
- (NSArray *)getAllMemos {
    [MagicalRecord setupCoreDataStack];
    _magicalContext = [NSManagedObjectContext MR_contextForCurrentThread];

    return [PlaceMemo MR_findAllSortedBy:@"postdate" ascending:NO]
}

MagicalRecordの概要を知るには以下の記事が良いと思います。

MagicalRecordは便利ですが、CoreDataの仕組みをちゃんと理解した上で使いたいと思う方もいると思います。そんな方にはこの書籍がおすすめです。

そもそもデータの永続化とは?の部分から丁寧に説明されています。

SVProgressHUD

ローディング中にインジケータを表示するライブラリ。通常のインジケータの他、ラベルつきのインジケータ、プログレスインジケータなどを簡単な記述で表示できるのが魅力です。

[SVProgressHUD show];     // 表示する
[SVProgressHUD dismiss];    // 隠す

なお、似たライブラリとして MBProgressHUD があります。リポジトリのstar数はこちらの方が多いようですが、僕は慣れで SVProgressHUD を使っています。

ユーザーの待ち時間の体験を少しでも良くするのに便利ですね。

UIAlertView+Blocks

UIAlertView で Blocks の記述を可能にするライブラリです。
通常の UIAlertView でユーザーに選択肢を提示させる場合 delegate を使うことになると思いますが、複数のアラートを扱う場合など tag で判定する必要がありコードが煩雑になってしまいます。

UIAlertView+Blocks を使えば処理を簡潔に書くことができます。

[UIAlertView showWithTitle:@""確認
                   message:@"本当に削除しますか?"
         cancelButtonTitle:@"キャンセル"
         otherButtonTitles:@[@"削除する"]
                  tapBlock:^(UIAlertView *alertView, NSInteger buttonIndex) {
                      if (alertView.cancelButtonIndex != buttonIndex) {
                          // 削除する
                          [self deleteMemo];
                      }
                  }];

UIKit の Blocks 拡張としては BlocksKit が有名ですが、BlocksKit は巨大すぎて別ライブラリと衝突することがあるため、最近は最低限のBlocks拡張を入れるだけにしています。

UIActionSheet+Blocks

UIAlertView+Blocks と同じ作者である ryanmaxwell さんのライブラリ。こちらは UIActionSheet を blocks で書けるようになります。

[UIActionSheet showInView:self.view
                withTitle:@"経路を別アプリで開く"
        cancelButtonTitle:@"キャンセル"
   destructiveButtonTitle:nil
        otherButtonTitles:@[@"iOSの地図で開く",
                                 @"Google Mapで開く"]
                 tapBlock:^(UIActionSheet *actionSheet, NSInteger buttonIndex) {
                     if (actionSheet.cancelButtonIndex != buttonIndex) {
                         if (buttonIndex == 0) {
                             [self openNativeMap];
                         }
                         else if (buttonIndex == 1) {
                             [self openGoogleMap];
                         }
                     }
                 }];

やはり処理がまとめられるので便利です。

SDWebImage

iOSにおける画像フェッチャーの決定版的なライブラリです。キャッシュ処理やWebからのロードの処理、読み込み失敗時の扱いなどを非常に良い感じに行ってくれます。

// 画像をURLから読み込み
// キャッシュにあればキャッシュから、なければURLから取得する
[cell.photoImageView setImageWithURL:[NSURL fileURLWithPath:_memo.imageFilePath]];

SDWebImage については id:ninjinkun さんのスライドが大変参考になります。

MBPhotoBrowser

写真をフルスクリーン表示したりするのに便利なライブラリです。ナビゲーションバーを隠したり、グリッド表示に切り替えたりなど、色々と細かな設定も可能です。

f:id:himaratsu:20140815004451j:plain

呼び出し箇所
MWPhotoBrowser *browser = [[MWPhotoBrowser alloc] initWithDelegate:self];    

UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:browser];
[self presentViewController:nav animated:YES completion:nil];
delegateメソッド
#pragma mark -
#pragma mark MWPhotoBrowserDelegate

- (NSUInteger)numberOfPhotosInPhotoBrowser:(MWPhotoBrowser *)photoBrowser {
    return self.foursquarePhotos.count;
}

- (id <MWPhoto>)photoBrowser:(MWPhotoBrowser *)photoBrowser photoAtIndex:(NSUInteger)index {
    if (index < self.foursquarePhotos.count)
        return [self.foursquarePhotos objectAtIndex:index];
    return nil;
}

FontAwesomeKit

FontAwesomeiOSでも扱えるようにするライブラリです。Go memoではトップページ左上のギアアイコン(設定アイコン)に使っています。
呼び出し方も簡単で、以下のようにコールするだけです。

FAKFontAwesome *icon = [FAKFontAwesome gearIconWithSize:20];
self.leftBarButtonItem.image = [icon imageWithSize:CGSizeMake(20, 20)];

FontAwesome を扱うライブラリは他にも存在しますが、他のライブラリではアイコンをUILabel として扱うのに対して、UIImage のオブジェクトを生成できる点が嬉しくて今回はこれを選びました。

アイコンを自分で作るのは大変、という方は FontAwesome に頼りましょう。

参考

まとめ

以上、8つのライブラリを紹介しました。
どれもドがつく定番ライブラリだけあって非常に便利で、開発効率を爆上げしてくれます。ライブラリに依存しすぎないよう気をつけつつ積極的に利用していきたいですね。

また、自分でも便利ライブラリを作って公開したい機運が高まってきたので頑張ります。

宣伝

今回の題材となった Go Memo のダウンロードはこちらから:

https://itunes.apple.com/jp/app/id903841654?mt=8&at=10l8JW&ct=hatenablog

関連リンク

これからiOS開発を勉強する方へ

↓ステップごとの説明が丁寧で、大変分かりやすいオススメの記事です。

Swiftで初めて動きのあるゲームを開発する人向けチュートリアル(なんとかストライクを例にStep by Step解説) - こんにゃくマガジン

関連書籍

有名なOSSの中身、使い方などが紹介されています。ボリューミー !