ぼっち開発者向けニュースアプリ開発

(iOS編)

2014.11.4 社内勉強会

Demo

企画

  • 自分が欲しいと思うもの

  • 技術動向を踏まえたもの

  • 類似アプリが存在するもの

技術調査

類似アプリを実機で動かしてみる

  使用しているライブラリを確認する

  ※ライセンスページを確認する

 

ソースコードを探す

※製品レベルのものもGitHubに存在する

※AppStoreに公開されているものが良い

※3ヶ月以内に更新されてるとなお良い

 

 

・HackerNews

  (https://github.com/mmackh/Hacker-News-for-iOS)

・NAVERまとめのまとめ

         (https://github.com/kurimon/navermm_ios)

・Newspaper

        (https://github.com/lchoung/Newspaper)

開発スタイル

・iOS

  • 定番CocoaPodsを活用
  • GitHub、AppCoda、Ray Wenderlich
  • Storyboardとxibを併用

・APIサーバ側

  • Rails4でJSON APIを用意
  • Werckerを用いてCI
  • Herokuで運用

アーキテクチャ

JSON API

XML API

Push Notification

 

画像/音声

・画像

  • flat icon (http://www.flaticon.com/)
  • FreePick.com(http://www.freepik.com/)
  • 少し加工したいときは、PIXLR EDITOR

・音声

  • プッシュ通知のサウンドをカスタマイズしたいとき等に使用
  • 魔王魂(http://maoudamashii.jokersounds.com/)

Menu bar

  • sekitaka/ScrollMenuBarDemo
  • 外観や座標、radiusはカスタマイズした

Slide Panel

  • https://github.com/gotosleep/JASidePanels
  • READMEだけ見ても、よくわからない

Side Panel

- (void)awakeFromNib
{

    [self setLeftPanel:[[UIStoryboard storyboardWithName:@"Settings" bundle:nil]
       instantiateViewControllerWithIdentifier:@"SettingsViewController"]];
    [self setCenterPanel:[[UIStoryboard storyboardWithName:@"Main" bundle:nil] 
       instantiateViewControllerWithIdentifier:@"FeedsViewController"]];
}
  • 既存プロジェクトの場合は、上位のViewControllerを用意する
  • RootVC, CenterVC, LeftVCという構成

Push Notification

  • Parse.comを用いて実装
  • リンクエラーが出てハマった

Push通知音をカスタマイズ

  • Parse独自のフォーマット
  • ドキュメントは充実している
export APPLICATION_ID='Your Application ID'
export REST_API_KEY='REST API KEY'

curl -X POST \
  -H "X-Parse-Application-Id: ${APPLICATION_ID}" \
  -H "X-Parse-REST-API-Key: ${REST_API_KEY}" \
  -H "Content-Type: application/json" \
  -d '{
        "where": {
          "deviceType": "ios"
        },
        "data": {
          "alert": "Hello World!",
          "sound": "happy01.mp3"
        }
      }' \
  https://api.parse.com/1/push

SDK導入時のハマりどころ


Undefined symbols for architecture i386:
  "_FBTokenInformationExpirationDateKey", referenced from:
      -[PFFacebookTokenCachingStrategy cacheTokenInformation:] in ParseFacebookUtils(PFFacebookTokenCachingStrategy.o)
      -[PFFacebookTokenCachingStrategy expirationDate] in ParseFacebookUtils(PFFacebookTokenCachingStrategy.o)
      -[PFFacebookTokenCachingStrategy setExpirationDate:] in ParseFacebookUtils(PFFacebookTokenCachingStrategy.o)
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)

http://stackoverflow.com/questions/23724116/how-to-use-cocoa-pods-and-the-parse-sdk-without-getting-linker-errors

 

サムネイル画像のフェードイン

    NSString *thumbnailUrl = 
        [NSString stringWithFormat:@"%@%@", 
          THUMBNAIL_BASE_API_URL, dicRow[@"link"]];

    //Using SDWebImage, load image asynchronously
    [cell.thumbnailImageView sd_setImageWithURL:[NSURL URLWithString:thumbnailUrl] 
      placeholderImage:nil 
      completed:^(UIImage *image, 
                             NSError *error, 
                             SDImageCacheType cacheType, NSURL *imageURL) {
        
        if(image && cacheType == SDImageCacheTypeNone){
            cell.thumbnailImageView.alpha = 0.0;
            [UIView animateWithDuration:1.0f animations:^{
                cell.thumbnailImageView.alpha = 1.0f;
            }];
        }
    }];
  • SDWebImageを使用

・今後やってみたい事

  • CoreDataを使用した"あとでみる"機能
  • 動画、勉強会情報の発信
  • 機械学習による記事のレコメンド
  • サムネイルのクオリティ向上
  • Swiftの勉強(Swiftでのサンプルが増加)

・開発フローの改善

  • クラッシュレポート
  • 静的解析
Made with Slides.com