Categories: 勉強会

#potatotips 17は美人司会者のもと、WANTEDLYで開催!iOS/Android開発Tipsのまとめ!

iOS/Android開発のTipsを出し合う勉強会の#potatotips 17に参加してきたので、そこで発表された開発Tipsをまとめました。

[iOS] Swift-Result<T>型で結果を返すのは邪道かどうか

  • RedditAPISwiftラッパーがないのでswiftでAPIのラッパーを作ってみた -> reddift
    • ダウンロード後のコールバックをブロックで渡す
  • エラーオブジェクトをひとつにまとめる genericを使う
  • result型を作ってSuccessとFailureを定義すればひとつのオブジェクトで成功とエラーを内包できる
  • 演算子定義と組み合わせると綺麗だけどぱっと見よくわからないコードになる
  • 議論
    • Result<A>とかで書くと綺麗
    • 他の書き方もある -> flatMaps
    • 読みやすいか、書きやすいか、デバッグしやすいかを議論したい

[Android] Fragment in Fragment

nankiti様

  • 初心者がAndroidを作って詰まったところ
  • 親Fragmentによって子のFragmentの状態を変えたかった
  • 子Fragmentの実装で、標準のライブラリで横にスクロールできるListView, GridViewがないのと、端末サイズに依存する点が苦戦した

[iOS] Libraries for the Swift

  • Swiftライブラリまとめ
  • HTTP + JSON
    • Alamofire 採用
    • SwiftyJSON 採用
    • Argo
    • JSONExport
      • GUIのツールで、JSONをぱーすしてクラスを自動的にしてくれる
      • Relamで保存できるコードもできるらしい
  • Promise / Future
    • ReactiveCocoa
    • SwiftTask 採用
    • BrightFutures
    • FutureKit
  • Reactice
    • ReactiveCocoa
    • ReactiKit 採用
    • jspahrsummers/RxSwift
    • kzaher/RxSwift
      • Rxでやるならこっちのほうがおすすめ
  • ViewBinding
    • ReactiveCocoa
    • SwiftBond 採用
      • モデルのデータとviewを簡単に書き換えられる
      • 配列をかきかえる
    • ReactKit
  • FunctionalToolKit
    • Dollar and Cent 採用
    • Swiftz
    • ExSwift
  • Date Helper
    • SwiftMoment 採用
    • Timepiece
    • AFDateHelper
    • Tempo
  • Logger
    • XCGLogger 採用
    • Swell
  • ReactiveCocoaはずっとBetaだったので採用を見送った

[Android] Intro to Moshi

  • MoshiはJsonライブラリ
    • ベースがokio
  • githubにサンプルコードあります
  • ISO8601というFieldにアノテーションを自分でつける
    • アノテーションとJSONアダプターを登録すると自動的に登録したJSONアダプターを使ってくれる
    • dateなどの処理をアノテーションでできる
  • JsonReader
    • GSONよりつかいやすい
  • getPathというのをつかうと、どこをみているかがわかるのでエラーをみやすい
  • Lenient Mode
    • 普通のMoshiはRFC4627だが、備考に書いてある様々なことが許容されるようになる
    • JSONにコメントとかかける!
    • Double.Nanとかよめたりする
  • まとめ
    • 直感的でつかいやすい
    • アノテーションいい
    • 機能がいくつか足りないのでこれから増えるかな
  • 議論点
    • okioをベースなのでパフォーマンスが気になる
    • メモリどれくらいだろ
    • デフォルトのJSONシリアライザーはRetrofitとOkHttpがベースになるのだろうか

[iOS] Share Data Across Extension and App with Realm

  • Extensionでデータ交換は軽い使い方でも便利だよというおはなし
  • AppGroupをXcodeで設定してDeveloperCenterにも登録しておく
  • RealmはAppGroupコンテナの場所にファイルを作って共有する
    • defaultRealmでやるか、パスを指定してインスタンスを生成する
  • MemoryUsageLimitations on App Extension
    • Extensionはメモリのリミットがかなり厳しい
    • Watchは24Mくらいが上限
    • 一部のデータだけ共有するようにする
    • 別のパスにRealmを作って共有したりする
      • ファイルを切りかえるのはCoreDataやマジカルレコードはできなくはないけど少し大変
      • Realmだったらアカウントを変えたらファイルをかえるというのも簡単

[Android] Google Mapsを使ったアプリを作ってみた

  • 嫁に企画をもらって、位置を知らせるアプリを作ってみました
  • GoogleMapsAPIが使えるまでは結構大変
  • GoogleMapsAPIはMapViewクラスとMapFragmentクラスがある
  • APIを使うのにアプリ署名が開発と本番で必要です
  • マーカーを打つのに、GooglePlayServicesLocationAPIsを使うとらくです
    • 自分のいる場所を知る際はPRIORTY_HIGH_ACCURACYという優先度で位置を取得しましょう

[iOS] いつかくるそのときのためにApplePay対応のやりかた

  • 端末内のセキュアエレメントにカード情報を保持できるので他サーバに情報を渡さなくてすむ
  • iPhone6や、iPadAir2とかでしかないとつかえないなど様々な条件クリアが大変
  • Passbookの上にクレジット.デビットカードが追加される
  • 決済システムはメルカリはBraintreeを使っている
  • 対応手順
    • Merchant IDをDevCenterで追加する
      • エンタープライズのアカウントじゃないとでないのが味噌
    • ApplePayをXcodeで有効にする
    • 使えるかどうかの確認を行う
    • ApplePayボタンの設置についてはガイドラインがあるので注意
    • 有効にする方法がイマイチ謎
    • US発行の小レジットカードじゃないと登録できない
    • Enterpriseじゃないとだめ
  • 宣伝:がうるんというプッシュ通知サーバを公開しました(なんかよさそう!)

[iOS] プレゼンテーションがもっと楽しく – 画面タッチを可視化するTouchVisualizer –

  • TouchVisualizer
    • アプリのプレゼンテーションを視覚化したいということで作ったライブラリ
  • 一行で動くライブラリです
  • DEMO
    • タッチした場所のタッチ半径や、移動距離などをとることができる
    • 複数指感知する
  • UIWindowのイベントを取り出して、処理している
  • Other
    • COSTouchVisualizerと名前がかぶっちゃいました

[Android] Null, the Abyss

  • 多くのクラッシュの原因はぬるぽ
  • ぬるぽを避ける簡単な方法はifでnullをみるだけだが、if文かいているとコードが汚くなる
    • nullが帰らないメソッドもあるのでやり過ぎ注意
  • annotationをつかってNullがはいったりとか、nullはいらないとかを宣言できるのでLintが警告してくれる(@Nullable)
    • ただ、実際Nullがはいるかは実行時にしかわからない
  • NullObjectというデザインパターンを使う
    • Nullの代わりにからオブジェクトを使う
    • ぬるぽにならないが、しらないとわからない
    • 例えばgetメソッドを呼ぶ際に、nullを返すのではなく、Nullと定義したオブジェクトを返す
    • なにかよくわからないことがあったらNullを返すのではなく例外をなげるか、空の何かを返すようにする
  • Null abyss in Android
    • サポートライブラリにnullを帰ってくるものがある
    • getMediaSession()など

[iOS] 意外と苦労する、一部の画面のみランドスケープ表示を許容する方法

  • 一部の画面だけ回転をきょようさせるのはつらい
    • 全部許容 or 一部非許容は簡単
  • AppleがAPI的にこうすべきという愚直な方法
    • 各UIViewControllerのsupportedInterfaceOrientationsで制限
  • 統一的な方法としてよくみかける微妙な方法
    • カテゴリ拡張でオーバーライドもどきすれば1箇所でできるが、いつ動かなくなるかわからない
  • AppDelegateのapplicatoin:supportedInterfaceOrientationsForWindow:に処理を集約するやり方
    • いちいちViewControllerで縦画面制限をしなくていいが、ViewControllerの最前面の画面をたどる必要がある
    • アプリの画面構成に依存してしまいそう
  • 今回はAspectsによるMethodSwizzlingでやってみた
    • GAなどでも使われる

[Android] Dagger2でDI

satoshun様

  • DI使うとクライアント側の負担が大きくなるのでDagger2で解決しよう!
  • 最後にComponentを使うときはコンポーネントを1つ以上もてます
  • Dagger2を使うことで設定を利用から分離できる
  • Dagger2は1よりもパフォーマンスはいい

[Android] SQLiteDatabaseを無理矢理覗く〜開発中だからできる荒技〜

  • デバイス内のDBを確認する方法について
  • 1つのJavaファイルをひとつ作って、バックドア的にサービスを動かしてそこからtelnetでつないで覗いてみる
    • telnetだけでは使いづらかったのでRdbAssistantというGUIクライアントを作った

DEMO

  • リアルタイムにDBのデータが見れました
  • 見るだけでなくSQL実行すればデータを弄ることもできます
  • まとめ
    • ServerSocketが使えるので、バックドアを簡単に作れるので、そこ経由でいろいろやれば痒いところに手が届く
      • GCMやBluetoothまわりなど

[iOS] AppStore申請を一式まるっと自動化する

  • 使えるツール
    • xcodebuild/xcrun
    • deliver
      • KrauseFx氏がつくったCLIコマンド
      • iTunesConnectにメタデータやバイナリを登録
    • selenium
      • Webブラウザを外から操作
  • deliver
    • スクリーンショットとかサイズで判断してくれたりする
    • 言語ごとにファイルを用意したりする
    • 申請は手でやったりしている

[Android] border-left: 1dp solid #666666;

  • 左と上がない1pxのボーダーラインをどうひくか
    • borderがいらない辺にネガティブオフセットをつける
    • Javaで書くときも同じように書く
  • CSS Likeにかけるライブラリをつくりました
  • ViewBorderHelper
  • まとめ
    • Viewのborderを扱うのは面倒なのでいいかんじのヘルパを使ったややこしさを隠蔽しよう!

[iOS] Timepiece

naoty has 160 repositories available. Follow their code on GitHub.
naoty - Overview - GitHub
  • TimePiece
    • 直感的にNSDateを行えるライブラリです
  • NSDateを取るときに以下のように直感的に書ける
    now + 1.minute // 1分+
    1.minute.later // 1分後
    now.endOfMonth // うるう年も考慮した月末をかえしてくれる
    3.dayas.ago.stringFromFormat("yyyy-MM-dd") // 3日後の日付を取得できる
    
  • pod ‘Timepiece’ でインストールできます

[iOS] fastlaneとCircleCIではじめるアプリ配布の定期実行

  • アプリ配布の定期実行をやってみた
    • fastlaneを使って、workflowとしてかためて、CircleCIで定期実行した
  • fastlaneを利用したアプリ配布
    • iTunes Connectから最新のprovisioning profileがおとせる!
    • 操作ごとにActionを利用する
      • 既成のActionが豊富にあるので簡単に作りやすい
    • 独自にcertificateを埋め込むなどActionを定義もできる
  • 補足
    • Actionの仕様がドキュメントと異なることがあった
    • CircleCIの最新版Xcode対応早かった
    • CIでのコード署名は難易度が高い

[Android] Kotlin使ってQiitaクライアント作った時の話

  • Kotlinを使ってハマった話
  • LeakCanary
    • メモリリークライブラリ
  • EventBus
    • greenrobotの方を使った
  • KotterKnife
    • ButterKnifeのKotlinバージョン
    • ほぼButterKnifeと同じように使える
    • bind(inject)メソッドで明示的にインジェクトしない
    • falgment使用時にはonCreatViewでview使うとぬるぽになるので注意
  • Retrofit
    • entityを作る際にdataクラスにすると便利
  • Dagger2
    • フルコットリン無理でした
    • kotlinで ComponentとかModuleとか書いてもgenerateできない

[iOS] 殺しても死なないアプリ 〜Core Bluetooth の「状態の保存と復元」機能〜

  • BackgroundModuleにBluetoothにチェックを入れるだけ
  • セントラルやペリフェラルでやりたいことはひと通りできる
  • 制約
    • スキャン感覚が長くなる
    • スキャン開始時のサービスしてが必須
    • アドバタイズ感覚が長い
    • ローカル名がアドバタイズされなくなる
  • バックグラウンドでアプリが停止するとバックグラウンドタスクも終了する
  • 状態の保存と復元
    • 代わりにBLE関係のタスクを実行する用システムに要求する
  • アプリのすべてが復元されるわけではない
  • 続きは本で!(壮大なステマ!!!)

さいごに

今回も様々なTipsやライブラリが発表され、実に刺激的でした。
現場ですぐに使えそうなライブラリやツールが発表されていたので早速やってみようかなとおもいます。

AndroidのNullについてはちょうど先日Nullチェックが冗長的だなぁと思っていたので、NullObjectや@Nullableは使えそうだなと感動しました。

5分すぎたらに司会(美人)の鳴らす鐘の音はSansanの時と比べたら小さいものでしたが、もっと激しく鳴らしてもきっと大丈夫です!

補足:司会者(美人)様は草はやすのがお好きなようなので以下に草植えとくんで是非新しい草をお使いください。

ʬʬʬʬʬʬʬʬʬʬʬʬʬʬʬʬ

お詫び
そ自分大変なことに気づいたのですが、ブログまとめ枠で参加したと思ったら申し込みできてなくて勘違いで参加してました!!すいません!!潜入枠でいってました!!お詫びとしてまとめさせていただきました。

mogmet

View Comments