HackerQuest

No app, no life

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

potatotips #66 iOSブログまとめ

@tsuzuki817

今回参加させていただいたイベントURL : https://potatotips.connpass.com/event/149806/

potatotips #66 にiOS ブログまとめ枠として参加させていただきました!
会場はあのyappli様のオフィスである住友不動産六本木グランドタワー です。(人生初六本木)

とりあえずエレベーターがめちゃくちゃ広くて景色最高でした。

f:id:tsudukihashi0817:20191112201345j:plain]

会場についたら、もうオシャレ...

f:id:tsudukihashi0817:20191112201347j:plain

ちゃんと、ポテチが用意されていました笑
f:id:tsudukihashi0817:20191112201351j:plain

GitHub : https://github.com/potatotips/potatotips/wiki/potatotips-66

発表のまとめ

SwiftライブラリのObjC対応における落とし穴と回避策

iOS枠のトップバッターはSCENEE(@scenee) さん

Swift 5.1 AVI/Module Stability キーワード

  • BridgingHeader
  • Umbrella header

@objcを付与するだけだと、思っていましたがそれだけでは不十分なケースがあるそうです。ライブラリの設計次第!

注意!

  • String Enumが付与できない。
  • Swiftで定義したクラスはobjcでサブクラス化できない!

解決策: objc で string enum を定義し Umbrella headerでそれをインポートしてライブラリのコードで使う!

自分自身objc対応をやったことがないので新しい用語が知れて新鮮でした!

ただ理解できないところも多々あったので、これからたくさん調べます!

参考: github.com

Bad practice for tax hike handling

続いてiOS 枠 二人目! corin (@corin8823) | Twitterさんです。 資料はこちら!

アプリ開発者が増税対応に追われるというなかなか恐ろしい話です笑 キーワード

これが買い切り型 f:id:tsudukihashi0817:20191112135803p:plain 自動サブスクリプション f:id:tsudukihashi0817:20191112135806p:plain

重要なこと

  • アップルからのメールはちゃんと読むこと
  • アイテム名に金額を入れないこと
  • ドキュメントはちゃんと読むこと

Advanced guard of DeallocationChecker

r_plus (@r_plus) | Twitterさんの発表です!

資料はこちらから!

こちらのviewがメモリリークしているかどうかをチェックするためのライブラリに関するtipsです!

github.com

キーワード

  • Swizzle
  • Mirror
  • AssociatedObject

個人的には時間が足りなくなってからの、マシンガントークがとても面白かったです笑

メモリリークの調査をするときにこのライブラリを使ってみようと思います。

試して感覚を掴んでみるUICollectionViewCompositionalLayout & Combine

fumiyasac@UI実装であると嬉しいレシピブックVol.1&2著者 (@fumiyasac) | Twitterいつもレシピ本にお世話になっています。

資料とコードサンプルはこちらから!

キーワード

  • UICollectionViewCompositionalLayout

複雑なレイアウトをつく際に役立つUICollectionViewCompositionalLayout!

どんなに複雑なレイアウトも細かく分割していけば怖くないよね、的な理論だと自分は思いました。

スライドがよくまとまっていて、この先何回も見ると思います笑

Mastering share sheet preview

ezura (@eduraaa) | Twitterさんの発表です!

資料

キーワード

  • share sheet
  • UIActivityItemSource
  • LPLinkMetadata

ezuraさんの調査結果によると以下のようになっているそうです! 

UIActivityItemSource > String > URL > Data(Image等) めっちゃありがたいですね:bow

共有するときに、いい感じにshare sheet をカスタマイズできるようにしっかり実装できるようにしないとですね!

SwiftUI の @State, @ObservedObject, @EnvironentObject

発表  Monkuma 👾 (@kumamo_tone) | Twitterさんです! キーワード

  • @State
  • @ObservedObject
  • @EnvironmentObject

相変わらず、わかりやすい発表でした。

個人的に@EnvironmentObjectはシングルトンぽくて使いやすいのですが、使い過ぎには気をつけようと思いました。

自分がちょうど今作っているアプリで利用しているところで、理解がめっちゃ深まって最高でした!

やはり自分は実際にコードを書いたか、書いてないかで理解にだいぶ差が出るみたいです。

資料

iOS13とフォントのお話

twitter.comさんの発表です!

資料

今まではアプリごとにしかカスタムフォントが使えなかった! しかし、iOS13 からフォント管理できるようになったとのこと!

フォントに関するAPI が充実したそうですが、ドキュメントはまだ反映されていないのでコードを直接見るしかない現状です...

japanese.engadget.com このアプリが世界でも有数のフォントのダウンロードができるアプリらしいです。

しかし現在はダウロードしたフォントをアップルの純正アプリ以外では使えないそうですが、

何やら使っているアプリがあるので、方法がなくはないといった現状です笑

そのうちAPI の実装がされるという噂... 早くされて欲しいですね...笑

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

懇親会

懇親会

iOSDC2019初参加!

iOSDC2019に 初参加しました!

2019.9.6(金) 9.7(土)の二日間、一般参加させていただきました。

f:id:tsudukihashi0817:20190909053030j:plain

iosdc.jp

1日目

オープニングから勢いがすごくて、圧倒されてしましました...

www.youtube.com

エヴァ風でテンション上がりましたね!

www.youtube.com

ライブラリのインポートとリンクの仕組み完全解説

ライブラリのインポートとリンクの仕組み完全解説 by Kishikawa Katsumi | トーク | iOSDC Japan 2019 #iosdc - fortee.jp

内容が結構が結構難しくて、ちゃんと理解できていなかったので、自分でも ライブラリを作ったりしてみようと思いました。

Swiftクリーンコードアドベンチャー

Swiftクリーンコードアドベンチャー ~日々の苦悩を乗り越え、確かな選択をするために~ by shiz | トーク | iOSDC Japan 2019 #iosdc - fortee.jp

発表がすごく丁寧で、発表の仕方の参考になりました>< 普段からClean Architectureを利用しているため、アーキテクチャの適用の仕方なども参考になりました。

FatViewControllerを安全に書き換える方法が見つからなかったので、どういう痛みを許容するか考えた

FatViewControllerを安全に書き換える方法が見つからなかったので、どういう痛みを許容するか考えた by ダンボー田中 | トーク | iOSDC Japan 2019 #iosdc - fortee.jp

ダンボー田中さんの発表はとても場慣れしている感があって、自然体ですごいなぁって思いました(コナミ感) テストのデッドロック問題など、実際に自分も遭遇したらどうしようと思える問題を取り上げていました。 問題に対するアプローチを、適切に言語化していて自分も言語化する能力を鍛えないといけないと、改めて思いました。

また、髪の毛が金色でかっこよかったです。

2日目

iOSアプリに「意識」は宿るのか?ディープラーニングの先にある人工知能(AI)

fortee.jp

f:id:tsudukihashi0817:20190909053324j:plain

fortee.jp

脳科学からディープラーニングに到るまでの流れはとても興味深かったです。 アプリに意識が宿るまでの課題を具体的にあげていて、wktkしました!

今こそwatchOS

f:id:tsudukihashi0817:20190909053326j:plain

部屋が満員で立ち見も限界まで人がいて、すごい人気でした! watchOSが出てから最新のwatchOSまでを事細かく解説して、勉強になりました。 絶対にapple watch買って開発します!

まとめ

いろいろと難しいし、自分の勉強不足を痛感しましたが、いつもお世話になってるiOSエンジニアの方々に出会えて最高でした! 来年も、参加しようと思います! また、自分もいつかスピーカーとして参加できるように、活動をしていきたいです。

Ryo Tsuzukihashi