HackerQuest

No app, no life

趣味と実益を兼ねてプログラマをやっている者👨‍💻

potatotips #65 参加ブログiOSまとめ枠

potatotips #65 参加ブログiOSまとめ枠

2019/10/1(THU) ヤフー株式会社で行われたpotatotips #65の参加ブログです。 今回、偉大なる会社の先輩方のお力添えで、新卒ながら旗振り役を経験させていただきました。

イベント: https://potatotips.connpass.com/event/145538/

タイムスケジュール

ダークモード対応

発表者: たなたつさん

ヤフー乗換案内アプリはiOS13リリース初日にダークモード対応したそうです! その中でのつらみを今回発表してくださりました!

現在修正済みの問題

  • iOS11でColor Assetsの色が取得できない問題

現在でも起きている問題

昔からある問題

  • スプラッシュスクリーンの画像が更新されない問題

自分が悪いのかそれとも...の問題はとてもつらみが深そうです。

ダークモード対応時はiOS12以下での動作確認を忘れずにしようと思います。

fatalError("init(coder:) has not been implemented")

発表者: 日向さん(@coffeegyunyu)

potatotipsに3連続参加らしいです!

iOS は 2.2、Android Donut からの歴戦の猛者です。

マンガBANGを作っているらしいです。

class ViewController: UIViewController {
  let id: String?
  init(id: String?) {
    self.id = id
    super.init(nibName: nil, bundle: nil)
  }
  
  required init?(coder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
  }
}

コード上でinit()を実装すると実装を強要される、このrequired init?(coder:)はなんなのかってことです。

コードでもinit?(coder:)で落ちますよね〜

NSCodingプロトコル適合クラスが実装しなければならないもの

アーカイブに格納されたオブジェクトから元のオブジェクトに戻す時init?(coder:)が呼ばれる

ちゃんと調べたことありませんでした。

init?(coder:)が呼ばれるとき

  • StoryboardからUIViewControllerが作られる時
  • NSKeyedArchiverから encode(with coder:)でアーカイブに格納されたオブジェクトから、元のオブジェクトに戻す時、init?(coder:)が使われる。
  • Restorationから ホームに戻るたびにencodeRestorableState(with coder:)によってアーカイブが作られ、アプリがKillされた場合も前の状態で復元することができる

つまり、init?(coder:)ではアーカイブ前の状態に戻す処理が必要となる!

required init?(coder:)はStoryboardだけのものではなかった!ということで、コードで実装する際も適切に実装して行こうと思います。

詳しくは以下のQiitaの記事から! https://qiita.com/coe/items/9723381ec0046fd8d8ad

広告実装、こうすると幸せだよ

発表者: ryokosugeさん (@ryo_kosuge)

  • バナー実装について
    • refresh rate はいじらないほうが良い
      • refresh rateを短くすると インプレッション数が増えるが、click数が減るため価値の薄い枠となってしまう!
    • Scroll View でのバナー実装
      • 適切なタイミングで広告表示のリクエストを飛ばさないと refresh rateと同じでインプレッション数だけが増えて、価値の薄い枠となってしまう...
      • そもそもCellでバナーを表示すること自体、スクロールがカクついたりするためよくないらしい...
      • 解決方法 一度生成したら使い回す手法を取り入れる!
  • 動画リワードについて
    • 動画広告の在庫があまり多くないことを考慮する必要がある
    • 異なるAd Networkを利用する https://nend.net/
    • SSP (Supply Side Platform)の利用

個人アプリでバナー実装や動画広告をよくわからないまま利用していて、よくない使い方をしていることがわかりました。

CombineでAPIクライアントを作る

h_crane(くれいん)さん (@hcrane14) Qiita: https://qiita.com/H_Crane/items/4778d7951cd0e1611f5b

iPadで発表してくださりました!

 iOS13から追加されたLow Data ModeはユーザーがLow Dataを設定しているときは、通信が少ない処理をしてあげるなど対応ができる!

Combineの書き方がRxSwiftと似ているらしいです。

RxSwiftを今からやっておくと、将来Combineを実戦投入するときに恩恵を受けられそう!

自分はRxSwiftを使ったことがなかったので、これからやってみようと思います。

特定のViewControllerを表示するときだけTabBarを隠したい

発表者: 武田さん

  • UIKit tips
  • 前提 Navigation ControllerとTabBarがあるシーン

hidesButtomBarWhenPushed -> trueでタブが消える

let viewController = SecondViewController()
viewController.hidesBottomBarWhenPushed = true
navigationController?.pushViewController(viewController, animated: true)

push時点でNavigationControllerのスタックの中に1つでもhidesButtomBarWhenPushedtrueのViewControllerがあるとTabBarが隠れてしまうそうです。

そのため、Push時とPop時にhideBottomBarWhenPushedの値を制御する必要がありますね.

TabBarを隠して、画面にある情報をできるだけ多く表示したいというシーンで有効的に使って行きたいです!

Android Tips

Androidのほうはご紹介のほうだけさせていただきます。

5分でわかる Kotlin Contracts

発表者: 熊本さん(@kumamo_tone)

TargetSdkVersion29で BottomNavigationが点滅する件

発表者: 養命酒さん 養命酒(Yu Mitsuhori) (@1013Youmeee) | Twitter

GitHub Actionsを用いたDeployGateアプリ配布の自動化

発表者: ホリエさん ホリエ (@Horie1024) | Twitter

懇親会

懇親会

Ryo Tsuzukihashi