Skip to content

Instantly share code, notes, and snippets.

@dokimyj
Last active September 19, 2021 09:52
Show Gist options
  • Save dokimyj/b343d5d3418da7d7e157e382c99203a8 to your computer and use it in GitHub Desktop.
Save dokimyj/b343d5d3418da7d7e157e382c99203a8 to your computer and use it in GitHub Desktop.
iOSDC Japan 2021

iOSDC 2021 1日目 (2021/09/18)

Xcode Source Editor Extensions

  • DI Helper for swift
    • Xcode Source Editor Extension
    • Mac App Store にある「コード自動生成ツール」 → ローカルの Xcode に設置するだけで依存性注入!

参考: https://github.com/kazuhiro4949/DIHelperForSwift

  • Access Level Changer for Xcode
    • private/internal/public など? → 合った
    • swift refactoring tool
    • internal → public 一括変更 →便利そうだけど、セキュ的に大丈夫?という質問の連発

参考: https://github.com/kazuhiro4949/AccessLevelChanger

  • 構成

    • macOS app
    • Xcode Source Editor Extension
    • SwiftSyntax
  • 作り方

    • Xcode で「Xcode Source Editor Extension」テンプレート選択
    • source editor command の perform メソッドで実行される
    • SwiftSyntax をターゲットの Frameworks/Libraries に入れる
      • SwiftSyntax の導入は必ず調べながら (+1 の導入 F/wがあるらしい)
  • 他の手法との比較

    • コード自動生成自体は色々ある
    • Source Editor Xtension は Swiftファイルのみ制御
    • Xcode Template はコードにより複雑になるかも
    • Run Script とその他 はビルド時しかできない

日本語の改行見直し方

  • まずは資料: https://speakerdeck.com/trickart/split-japanese-sentence-for-uilabel-and-swiftui-text

  • レイアウトでの改行の地獄

    • 反応型表示とは?
    • adjustFontSizeToFitWidth を trueにしたら解決(?)
    • ↑こうすると文字サイズの調整が地獄
    • さらに、逆方向(小→大)は空白まで問題になる
  • NSLineBreakMode (元 英語用)

    • byClipping
    • byCharWrapping
    • byWordWrapping →日本語では適用できない 😇
  • Word Joiner

    • \u{2060}で単語扱いの切り目を
    • 手作業より、MeCab を利用する形態素解析を!
  • obj-c++ とは?

    • Obj-C + C++
    • 拡張子 .mm
    • Swift → Obj-C++ → C++ になるよ
    • Mecab 自体が C++ なので、この説明が必要
  • Wrapper の書き方

    • Obj-c++ で
    • ↑をやったことを Swift Package 化
    • cSettings で define, linkerSettings でリンカーライブラリ設定
  • 辞書データ

    • 辞書データを Bundle して Swift Package 化

参考: https://github.com/trickart/muscat

Discord で突っ込まれた「NLTagger」

  • 日本語の品詞が「Others」のため、使えない

SwiftUI は?

  • lineBreakModeがなくても使えた

辞書データ

  • Muscat では MecabIPAdic を使ってる
    • mecab-ipadic-NEologd を使ってもいいよ

実は前にあったツール

  • Google の Budou(py)
    • 単語区切りに HTML を…
    • なのでマスカット〜

質問タイム

  • コピペできるようにしたテキストはどうする?
  • 性能的には?
  • 基本は nMB ぐらいだが、アプリに Bundle してから容量は nnMBになってしまう

アプリ間連携 (Medpeer スポンサートーク)

  • kakari サービス
    • 薬局のシステム - 患者側のアプリ連携
    • 指定薬局専用のように見えてるらしい
    • つまり、薬局の顧客管理アプリ
  • kakari for clinic
    • kakari から情報を引継ぎ、簡単に連携するようになった
    • Firebase Dynamic Link を利用した (今見るとこれ Deeplink だ)
    • データ引継ぎは kakari 本家が設置されているかによって

Private Relay からの Apple Privacy

  • まずは Speakerdeck: https://speakerdeck.com/kichiemon/apple-privacy

  • IP隠し

    • 情報暗号化・DNS の2つリレーで通信
  • Privacy Enhancement

    • カスタマサクセスとしての Apple の提供
    • 法律、機能の追加
    • 信頼性の判断基準
  • Apple の Privacy 理念

    • 「基本人権」
    • 実は 2010 D8 Conf から言われていた Steve Jobs から
    • Apple の Privacy 4原則
      • Data minimization: 最小限にとって利用も簡潔に、データは必要性とセットで
      • Ondevice Processing: 端末外にデータを持ち出すな(持ち出しても端末で処理終えてから)
      • Transparency Control: 見えない所で情報収集は NG
      • Security Protection: 流出は絶対防いで行こう(必ずローレベルから点検すべき)
  • App Dev 側からの心持ち

    • ガイドラインは「軸」: 政府・業界団体・Apple Store のガイドラインに従おう+WWDC参考しよう
    • 設計時にプライバシーの観点を: データの生涯周期をちゃんと決める計画を、ユーザーに一々説明
  • 最後に: 情報保護は共同責任、みんなが頑張らなきゃ(by Apple)

参考:Apple UIKit のユーザープライバシー

In App Purchase Status

まずは Speakerdeck: https://speakerdeck.com/ohayoukenchan/iosdc2021-zhi-rarezaruke-jin-sutetasu

  • ゴール: Offer とは?

  • Offer の二種類

    • お試しオファー
      • 新規 Subscription 獲得
      • iOS 10 以降
    • Promotion Offer
      • 既存の方の維持・戻ってこい
      • iOS 12.2 以降
  • Promotional offers が Trials に紐づく場合

    • Trial Offer 途中に Promotional Offer を入れたら→ 13ヶ月無料
    • 既存課金者の Promotional Offers を入れたら→ 課金した期間が終わったらその続きとして
  • ↑で紐づかない場合

    • 無料から同じ期間: Cross-grade になり、前の subscription が取り消しになっちゃう
    • 有料から同じ期間: 上記の Cross-grade になり、前の subscription が取り消しになったら、返金が行われる
    • 有・無料問わず期間が異なる: 紐づく場合と同じく、前の subscription が終わってから
  • 結論: だからお知らせをちゃんとするし、期間を全部別にすれば良いかも?

  • Promotional Offers が別 Promotion に紐づく場合

    • 期間問わずに前の Promotion が終わってから
    • Pending の「別Promotion」が複数になると最新のやつのみ残り、他は飛ばれてしまう

Swift 5.5 の Concurrency

  • これは資料をちゃんと読み取り、その中で基礎から深堀りしないと… https://speakerdeck.com/inamiy/iosdc-japan-2021

  • 今までの async 計算

    • completion handler で測った (fetch - response)
    • flatMap(計算結果によりその結果を持ってくる) -> js の Promise.then()
    • Promise/future
  • await/async の形

    • try await function(arg)
  • Monad (flatMap 型)

    • protocol/extension として Functor[Map] の subprotocol
    • monad.flatMap{ f($0).flatMap(g) }
    • callback 重ねから簡単化できる形だった
    • ?.is == .flatMap(\.is)
    • throws -> try でも計算できていた → async -> await 型に書き換えられる
    • Result<value, error>doAsync.do の中身は <- に変わった
  • 継続と継続渡しスタイル(CPS)

    • callback (->)
      • func cpsfunction<R>(a: A, completion: D -> R) -> A -> R の形らしい(不可解 🤪)
      • CPS では completion リターンにより逆順で伝わる形
      • Monad でも使えるらしい
    • Structured Concurrency で、キャンセルがうまくいけた (リソース管理場面で有利)
      • Lifecycle 管理の場面で、TaskGroup 配下の Task 毎に生存期間区切りができている
    • CallCC
      • callback の例外処理、goto 処理、defer 処理などで使われる
      • 非常に危ない黒魔法(?)
      • <- shift / <-reset で非同期処理
  • Coroutine

    • Java の Runnable/Thread?
    • pause/send などで制御
    • 非同期では suspend/resume を使う
    • AsyncCoroutine の場合、<- await 中身を suspend にしている

結論: async/await を理解するにはコルチーンを、コルチーンの理解には Monad と CPS(継続) などの理解が必要

吐きそう…

参考: https://medium.com/flawless-app-stories/swift-monad-functor-applicative-806bb34c68c5 Monad と Functor ってなに?という記事

韓国語で「Swift Concurrency Roadmap」という、昔のことを語っている記事 https://medium.com/@jungkim/%EC%8A%A4%EC%9C%84%ED%94%84%ED%8A%B8-%EB%8F%99%EC%8B%9C%EC%84%B1-%EB%A1%9C%EB%93%9C%EB%A7%B5%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC-about-swift-concurrency-roadmap-ccf651c09c4c

App Size Optimization

  • どのファイルを計測するか?
    • App Store の ipa 情報、テストアプリの情報、.app というバンドルの情報があるが
    • 端末用の .ipa を獲得し、容量を測る必要がある(App Store の情報もズレがある)
  • リリース済みアプリのサイズを確認する
    • Xcode Report Tool の App Size Report で、アプリを組み込んでからのリポートで確認できる
    • ↑を使えば、開発中で端末の種類別の容量リポートが取得できる
    • CI で xcodebuild からも OptionsPlist.plist で を設定すれば
  • ipa の内部を確認する
    • ipa は実は zip なので、解凍して中身確認ができる
    • 不要なファイルやリソースを確認する
      • README, swiftlint/swiftgen などのツール、デバッグ用のモジュール
    • 解凍した後の .app バイナリを解析する
      • Bloaty: Google 製のバイナリサイズプロファイラ CLI
  • 具体的にどうやってアプリのサイズ削減ができるか?
    • App Thinning: デバイスでの動作に必要要素のみ入れる
      • Fastlane から export_options({thinning: "<thin-for-all-variants>"}) を!
      • 社内で試した感想: 0.1MB も変わってなかった
    • Enable Bitcode: xcodeproj で ENABLE_BITCODE: yes
      • ただ、fastlane download_dsym が AppStoreConnectAPIKey に対応しないから 直接ダウンロード必要
    • リソース系1: Asset Catalogs 採用
      • メタデータタグ付け
    • リソース系2: Image Format
      • PNG は 8bit を利用しよう
      • ベクター画像に iOS13 で利用可能な svg を採用し、pdf の 10% まで削減しよう
      • 32bit PNG を使うには「Web用に保存」を使おう
    • リソース系3: On-demand Resource としてリソースを
    • その他
      • Compile Option: SWIFT_OPTIMIZATION: -OsizeASSETCATALOG_OPTIMIZATION_OPTION: space
      • なるべく Swift 純正を使おう: RxSwift→Combine, Realm→CoreData

LT会

Nearby Interaction を利用した空間認識
  • iOS14 から登場した Frameworks
  • NIDiscoveryToken 取得し、お互いの位置を交換し、NISession を開始、NISessionDelegate を取得
  • 9m まで検知可能、xyz 軸取得可能
  • 1peer 1session 原則
  • 分厚い iPhone ケース使うと取りづらい
  • iOS15 ではサードパーティからも使えるし、 CoreBluetooth を使ってトークン取得もできるらしい
ZOZOTOWN アプリトップのクラッシュデバッグ
  • 画面全体をスクショでクラッシュしたらしい
  • 結構前からあったけど、再現も特定もできなかった
  • 「使い続けるとアプリ落ちる」という手がかり
  • もしmemory leak?
  • 重要なのは「リリース後の観測」
  • 技術の刷新を意識しましょ〜
M1 チップの脆弱性、M1racle
  • M1 の修正不可の脆弱性!
  • register の中のデータを使ったら発生
  • Missing Register Access Control による
  • A14系全部
  • VM やめましょう
  • Malware が入っていたら予想しないクラッキングが発生するだけ
  • つまり、「致命的ではない」
Tesla API を Hack
  • NOT A HOTEL app が Tesla API を使ってる
  • BMW アプリの一部 API が公開されているが、本家機能はあんまり…
  • Tesla Unofficial REST API
  • 社長の Tesla を乗っ取って試した
  • NOT A HOTEL app のうちで上記の Tesla API v2 を使って乗っ取った
iOSDC デザインスポンサー
  • pixiv のデザインスポンサー
  • ロゴとサイトを作るらしい
  • プラチナスポンサーになるらしい
  • 5月末から始まり、最終は6月末に完成
  • サイトのデザインは↑の後すぐ、7末に修正終えて 8頭にリリース
  • デザイナーエンジニアーとりまとめの総務
  • iOSDC の紹介からしないとデザイナーとデベロッパー取りむずい
iOS15 以降の Notification
  • Push の今まで: iOS10 の Extension, 目立たない配信など
  • iOS15 新機能: Summary, 集中、Interruption
    • 指定した時間にくる Summary
    • 集中モードでフィルターできる
    • 4つのレベルで重要度によるプッシューの区分を
  • 新機能からの影響
    • ユーザーの目に触れにくくなりそう
    • Push が中心であれば、機能が壊れるかも?
    • バッジだけくるやつ→自動で集中モードに入ってから…
  • どうしよう
    • Time sensitive が重要
    • Relevance Score の設定を検討
    • Interruption Level の優先順位を再構成
Safari Experimental Features 深堀り
  • 14.7.1 基準
  • 実験 WebKit
  • デフォルト 36/82
  • HTTP/3: UDP で速度向上
  • WebGL 2.0
    • WebGPU: ↑からの Metal ベースの w3c 仕様策定のもの
    • Web Share API lv.2: 画像のウェブ上即時シェアができたのはこれのおかげ
    • element: <model> <source src='xxx'> </model>
SwiftUI.Text 分析
  • SwiftUI で一部 Bold にするに何を使う?
    • Text('hoge').bold() は hogeが長くと問題→ + Text(' ') などで補う
    • iOS13から
  • イメージをテキストにラッピングするには
    • Text(Image(systemName: <image名>)
    • iOS14から
  • Formatで金額を区切り
    • Text('\(amount)円')
    • iOS13から
    • iOS15からは「FormatStyle」が使える( .month, .date, .time など)
500 エラーの見せ方について
  • 説明しない系、エラーをちゃんと見せてない系、イライラするでしょ
  • メンテナンスなど「メッセージ」を表示したら
  • 500 のなか、アクションを見せるパターン

→ とにかく「説明+ネクストアクション+最新状況」をちゃんと魅せる

Siri
  • スマートリモコンスイッチボット
  • 専用のアプリからスマホリモコンが家電を
  • Siri に対応する、ショットカットから使える
  • Homebridge でスイッチボット API 叩く
  • ↑でできないこと
    • 今のステータス取れない(実装したらできるやつもある)
    • OSSだが、実装無理の部分もある (意外と複雑な仕組みで、OSS と合わない場合)

UITest から SwiftUI アプリを安定化する

  • まずは資料: https://speakerdeck.com/nanashiki/iosdc-2021

  • Xcode 12.5.1 の iOS 14基準

  • .alert の罠

    • Vstack で2つ並んで書いたら使えない
    • .alert の位置により、childview のアラートが出なくなる
    • 解決: enum に定義して適用させる
  • sheet, fullscreencover の並かぶりは 14.5 から治ったらしい

  • XCUITest の例

    • ログイン・ログアウトの UI テスト作成
    • メッセージの投稿 UI テスト
    • E2E は実際に操作しながら
    • Mock では Mock の結果を想定してテスト
  • UI の難点

    • E2E: Tutorial など、一回のみの画面が多く、そこで引っかかる
    • Mock: POST通信が難しい, JSON 担保できない、導入障壁が結構高い
  • SwiftUI の一番長所

    • Xcode Previews で開発毎に直ぐ画面見れる
    • APIClientMock を利用し、通信結果の表示を Xcode Previews で確認できる
  • SwiftUI と UITest

    • launchArguments = ["-MockAPI"] で UITest から app.launch すればおk
    • 遷移時のバグ担保できるから安心
    • ただ CI に時間かかる、Xcode アップデートにより壊れるか恐れ
    • iOS 14.5 で↑の壊れる現象が…

結論: SwiftUI は Xcode Preview を使うために使ったらしい

iOSDC 2021 2日目 (2021/09/19)

ランタイムデバッグのススメ

参考: https://github.com/noppefoxwolf/DebugMenu

  • Runtime Debug: 実存しないこと
  • 実機デバッグすることは非推奨
    • ただ、ハードウェア利用
  • 普段の開発フロー上で実機デバッグ
    • Compile 直後
    • Beta あげて Testflight など
  • 問題点
    • 人件費になる: 時間、リスク、金銭的な問題
    • 定性的な意見: 定量的に言って欲しい
  • 人件費コスト削減の仕業
    • 環境の確認: 必ず必要最小限の情報のみ書くこと
    • デバッグメニュー: 本番では表示しないこと(#if DEBUGなどで)、でも機能は最強
    • 接続環境の制限: 環境の変更までできるように
    • 各種操作のしやすさを考慮: Shortcut アプリを活用しよう
    • 動作検証: UX 検証(触り心地の改善可能性)→パラメータ変更ができるように
  • 定性的な意見の仕業
      1. 裏付け: 録画などを取れるように実装して、どの部分がどう見られるかを記録するように (AppFeedback sdk)
      1. 定量化: ↑の録画の際は端末パフォマンス状態とともに見えるように(FPS, CPU%, 熱など) → Dashboard 導入

Swift concurrency

まずは 資料: https://speakerdeck.com/shiz/hello-swift-concurrency-world

  • async/await: 非同期処理を同期と同じく順番で行けるように

  • 従来の callback: 結果リターンまで待つやつだが、そのリターンの処理も completion という手動

  • 書き方

    • async/await を throw 前、パラメータ後ろに書くだけ
    • await 前のところで suspend (必要によって)
    • URLSession, SwiftUI などフレームワークでも使われる
    • resume で結果返して再開させるのもできる
  • パフォマンス向上ができる Thread model

    • 従来の GCD: queue→スレッド→処理
      • 問題: スレッドがフールになると新スレッドを生成→メモリ漏水・Scheduler 負荷・Deadlock 恐れ
      • ↑を "Thread Explosion"
    • Swift Concurrency: 固定コア数で協調 Thread-pool を用意し、並列で非同期処理を並ぶ
      • システムの判断により、suspend/resume を行う
      • suspend の際、解放されたスレッドは問題のない限り、おてすきの他の同時処理を行う
  • Task とは

    • async の束
    • 同時並行処理を実行・管理する API 保持
  • Structured concurrency

    • Child task を生成し、同時実行するタスクを分け、結果をまたないようにする
    • async let
      • 普段の await は初期化時に init する必要があるから結果を待つ → 非効率
      • child task に async コードを割り当て、実際変数が使われる時まで完成させる(合間に同時処理)
    • TaskGroup
      • async let が使いづらい場合 (動的な初期化など)
      • taskgroup を作成し、その中で addTask で同時実行処理を予め指定
      • 注意: cancel の挙動
  • Unstructured Concurrency

    • await はすぐできないから Task.init から
    • @MainActor でスケジューリングの優先順位を前に引き持てれる
    • 独立タスク生成: Task.detached(priority: .background)
    • ↑の detached のなかでも Taskgroup 使える
  • Actor+Sendable

    • データ競合(Batting)の対応
  • Actor とは

    • actor <classname> {} → そのコンポーネントを使う際は await <コンポーネント名>
    • actor isolated: actor から mutable メンバーを更新される
    • actor は serial 処理: 協調 Threadpool で一つの指定スレッドのみに動くように制限される
    • Actor reentrancy: suspend 中に他のデータの処理ができるため、効率的(しかも優先順位逆転も発生しない)
    • ↑ 注意点: await 複数→動作保証しない
  • MainActor

    • 上記した @MainActor を await で呼ぶ
    • 型と Property にもつけれる
    • DBActor - MainActor 間 Context Switch が発生するため、過剰に発生しないように注意
  • nonisolated 宣言

    • Actor 内部でも await なしで使えるように
    • protocol にもつけれる: メンバーに直接アクセスできない sync にアクセスできるように
  • isolated 引数

    • 引数につけたら 上記の protocol へアクセスできる
  • Sendable

    • 安全なデータ転送を保証する
    • Public は明示的に表示、final はメンバ全員 immutable で暗示的, non-public は暗示的
    • @Sendable で function にもつけれる
      • detached につける場合、self/await 必要になる

LINE モバイルの MXとは

  • Closing the Distance
  • LIFE ON MARS ではなく LIFE ON LINE
    • 24/7 ラインで全ての生活をするよね、になるように
    • Top 4 国からほぼ2億ユーザー
  • Smart Portal という Super Application 志向
  • 10年間 1repo...
    • まだ obj-c 未移行ところがある
    • iOS 15 正式リリース=13~15 のみサポート
  • iOS 11 + iPhone X の対応(画面サイズ+ホームボタン)
    • 画面多すぎ
    • kisekae 対応
    • Notch で挫折
    • 6月からできたはずの対応がなぜ?(これは韓国の開発文化が悪い気がした)
  • EarlyBird TF (新 OS 対応集中的対応)
    • iOS12: 通知グループ化など, Context Menu/Dark Mode も 2週でできた :sugoi:
    • iOS13:
    • iOS14: Widget, PIP, ATT 対応も早めにできた
    • iOS15: 通知, Concentration モード, Siri Suggestion, Quicknote, Safari extension
  • MX 組織の紹介
    • MobileExperience Team: iOS/Android/Dev/Multi-device Experience
    • Multi-Device: Pad など特殊端末の体験らしい…

DateComponents

  • 時間の基礎

    • 基準点(UNIXEPOCH)からの経過時間
  • Date

    • init(timeInternvalSinceNow): 今から
    • init(timeIntervalSince1970): UNIXEPOCH から
    • init(timeIntervalSinceReferenceDate): 特定の基準日
    • init(): 今いつ?
    • ただ、Swift では時間の点�(秒しか知らん!)
  • 日時計算の難点

    • Date() + 10: 10秒後
    • Date() + 60: 1分後
    • Date() + (606024): ×
    • Date() + (606024*30): ×
    • 問題:閏年、月の最終日、サマータイム、閏秒(1分=61秒の場合もある!)
  • それで専用 Calendar がある

    • Calendar(identifier: .gregorian) が普通
    • calendar.date(byAdding: .month, value: 1, to: Date()): 1ヶ月後を測る
  • 問題:生年月日を Date で?

    • Date() だけではフォーマット合わせるのができない
    • それで DateComponents が出た
  • DateComponents の init

    • 引数 16個: 日時の要素群だから
    • Calendar, TZ, Era(期限前・西暦), yyyy-mm-dd-hh-MM-ss-nanosec, weekday, qarter, weekofmonth, weekofyear, weekofyear 専用 weekofyear
  • どう使う?

    • 日時
      • DateComponents -> Date にする DateComponents(year, month, day).timezone = JST などにするとおk)
      • 逆に Date -> DateComponents にもできる
      • DateComponents.isValidDate: 今初期化した日付って有効?
      • ↑の方法で "2021年の 262日目は?" として month を設定しないまま初期化すると、基本 1月なので全部無効になる
      • calendar.date(byAdding: 1ヶ月など)
    • Pattern Match
      • DateComponents(hour: , minute: , weekday: ) によって Notification Trigger できる
  • Tip

    • DateComponents は文脈によって読まれる意味が違う
    • ↑だから struct でどの役割かを予め決めて使いましょう
    • DateFormat = Stringから、DateComponents = 時間データから
  • DateComponentsFormatter は「量中心」でフォーマットするの(詳細は Formatter を調べよう) https://developer.apple.com/documentation/foundation/datecomponentsformatter

SwiftUI+GraphQL で CDestruction

  • ヤフー→へい

  • CD(Continuous Destruction)

    • フィードバックからの UI 変更、API 変更
    • どう早めに Destruct するか
  • Apollo-iOS(GraphQL) を API クライアントとして使ってる

  • 変更に対応しやすい=ユーザーに価値を届けやすい(反応性)

  • SwiftUI

    • 宣言 Syntax + Xcode Preview
    • レイアウト変更の修正時も UIKit・AutoLayout より簡単・わかりやすい・バグセーフ
    • 表示の確認する際も Xcode Preview により開発しながら起動できるので、アプリビルド・起動が不要
  • Design System

    • Design basis をまとめるスタイルガイドライン
    • デザインパターンのコンポーネント化
    • JS の Storybook を調べてみたら参考になるらしい(コメントから)
  • GraphQL

    • Scheme による If 形
    • Sequelize と似てる感じ? (query { nodes <見たいデータ> {<where条件>} })
    • REST との比較

      • 通信処理が複雑化される REST と違い、簡単に入力できる
    • 具体的な仕組み

      • API 変更は Bitrise で差分をチェックし、Slack に通知
      • Apollo が Swift へのコードを自動修正してくれる
      • データ関連の変更の手間が減る
    • Fragment Colocation

      • View とセットとして Query(Frag) を用意
    • 実践 SPM 構成

      XCFramework は Framework 達を一つにまとめたらしい

      • Package.swift での制限してから xcproject が減る

        • Products(Library, Framework)
        • Dependencies(サードパーティ定義)
        • Targets(Module, デフォルトパスで Sources配下の一つずつ認識)
      • @_exported import <import するモジュール>: nested import

      • Module/Framework を自在で構成できる

      • Project Minimalize できる

      • XCFramework はどうなる?

        • バイナリとして配布したい
        • target に .binaryTarget を使う
        • xcframework or 含む .zip ファイル
        • リモートファイルを指定したら checksum 提供義務
      • SPM サポートしないリポジトリは

        • OSS なら Package.swift PR 作ろう
        • Cocoapods 併用
        • M1 は工夫しましょう
      • Resources in SwiftPM

        • Bundle.module を使ってアクセス
        • bundle にリソースを追加→accessor が入る
      • Localize

        • LocalizableString に辞書を書く
        • .module は基本導入(ただ、.module は public に後悔しちゃだめ)
        • Bundle はどこへ?: xcframework とともに提供されるので、Init.module としてアクセスしないと…
      • Multi module

        • コンパイル時間短縮
        • Xcode Preview 安定化
        • Mini App 作りやすい(発動条件がある場合有用)
        • App Clip サポート
      • 注意点

        • Common/Misc module は作らないでね: 共通化は最小単位で分割するから…
        • 避けれないリソースの重複でもおk
      • Project 役割が薄いから Env 設定に全振りできる

        • Staging.xcodeproj
        • Production.xcodeproj → Build Config は Build Setting の変数だけなので、もっと幅広く制御できる (同じファイル名でもいいから)

      Package.swift でアプリを管理すると、アプリサイズが減る(?)

      参考になる記事: https://tech.timee.co.jp/entry/2021/08/24/160205

      async/await 性能 Dart/Swift 比較

      • 両方の共通点

        • function
        • Error handler
        • for 分でも使える
        • getter が使える
      • Swift の async/await

        • getter 使えるようになってる
        • await sequence(for 文) 使えるようになってる
        • sync -> async
      • Swift での影響範囲

        • callback nested problem solved
        • weakSelf からの解放
        • thread deadlock 防止 (Actor -> MainActor でメインスレッドから使われる)
        • CoreData → Context でのやりとりができる
      • Dart の async/await

        • func に Async
        • call 時に await (+ then で Future(promise かな?) を呼び出し)
        • parameter は Future 形 ← swift との違い

      LT

      Concurrency 演算理論
      • 非同期の根本の話

        • CCS=Calculus of Communicating Systems
        • Inter-Process communications :thinking_rotate:
      • 自販機の例を調べよう…

      NDI/ARkit 連動
      • なぜ NDI: SDI よりネットワークでデバイスが使えるから
      • NDISDK などで iPhone のメディアファイルをすぐ NDI で送信できる
      • ARkit でキャプチャした内容を metadata 入れて NDI 転送できるらしい
        • NDI Monitor で iPhone との連携でカメラ使える
        • Unity でこれを受信し、リアタイ編集(バーチャル背景でのエフェクト)ができる
      Swift Sort Algorithm
      • Timsort?
        • Tim Peters が Python Sort algorithm として開発された
        • Swift 5.0 から使われてる (未満は Introsort)
      • 長所
        • 早い
        • 安定性: Sort の同値はどの順番にする?ソート前の順番を維持するのよ
        • Memory-efficient: 完全ランダムの場合でも今までのソートの 1/3 だけ使う
      Eigen from Swift via C
      • 純粋数学用のライブラリを Swift で Wrap して使う

      • Int/Double/Rational など Scalar は Generic として wrap した

      • C++ 用のライブラリなので、途中で C を経由すべき

      • init 時に数字pointer, 引数にポインターつけて演算子ポインターを

      IDFA/ATT
      • IDFA=従来の Firebase? Google Analytics?
      • ATT=Apple が一筋に管理するぜ
        • これは最初提示時にしかできないから許可率をあげる必要
        • Apple Native の前のメッセージについて提出時に説明書かないと Reject
        • Apple Native の広告許可メッセージの先に「後で検討」入れちゃ Reject
      • SKAdNetwork=App Store Client への連動をするようになったらしい
        • ただ、まだ不正確な場面が多き、広告系では不満ばっかりらしい

      dokim個人的な感想:

      • プライバシー大事と言ったのに、結局 Apple が独占することになったのでは?
      • 結局個人情報をあげるならその相手が Apple でも不安がるのは当たり前だ
      • 何を偉そうに「我ら Apple はあんたの情報を守るためにー」堂々と言ってるの?💢
      アプリの終活(?)
      • 読み方: しゅうかつらしい

      • JapanTaxi から Mov に行っちゃったのは Japantaxi が合併されたことからだった

        1. アプリの綺麗な状態にすること
        • キャンペン機能削除
        • AB テスト
        • その他不要実装を消す
        1. 時間を取られない状態にする
        • 問い合わせ対応を塞いで負荷軽減
        • CI/CD 連携で自動化
        • README 最新化
        1. クローズ案内
        • 日開発のお知らせ出し
        • 汎用的なところのみ残す
      • 現在: GO に移行中、Xcode 13/iOS15 だけ対応中

      iPhone Sensors
      • iPhone 自体のセンサー入力の話

      • GPS

      • 気圧センサー

      • モーションセンサー

      • カメラ

      • マイク(3つ!)

      • LiDAR センサー(AR専用)

      • 輝度センサー

      • 近接センサー

      Kyash for iOS QA事情
      • Kyash(4.5年)

      • 品質管理コミッティーから「QA高め」

      • Bug Bash

        • 楽しくバグだし+リリース内容全員が別れる
        • 実際すると負荷増大、デグレも発生、一人でコードレビューになっちゃった
      • 改善

        • Unit test 整備
        • ViewModel の Unit test 導入・カバレッジ対象を VM に
        • Knowledge sharing 開催(月一回)
        • QA チームによるバグ分析・資料化
        • Regression testcode 増加
      Siri Shortcut 地雷!
      • Siri で株価調べていい値段で売っちゃえ!
      • Platform 毎より、汎用メッセージを覚えましょう
      • custom メッセージ→ Project の言語設定を最新に維持するのが大事
      • watchOS 6 と 7 が圧倒的に差がある: watchOS 7 は入力が必須になったから注意を!
      2FA 実装として TOTP
      • 生体認証を使うことはむずい(使うな、って怒られる)

      • OTP か、SMS か

      • TOTP: Time-based

        • 時間を変数として生成される数字などの OTP
        • 注意: トークンソフトへの遷移(OS は知らないから、intent を独自にすること。)
        • ログイン時: TOTP の保持事実により遷移が変わる
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment