$30 off During Our Annual Pro Sale. View Details »

Sansan アプリで学ぶ iOS 13 対応 / Compatibility with iOS 13 on Sansan App

Sansan
September 24, 2019

Sansan アプリで学ぶ iOS 13 対応 / Compatibility with iOS 13 on Sansan App

■イベント
After iOSDC Japan 2019
https://zozotech-inc.connpass.com/event/141268/

■登壇概要
タイトル:
Sansan アプリで学ぶ iOS 13 対応
登壇者:
Sansan事業部 プロダクト開発部 中川 泰夫

※アニメーション付きは以下にてご覧いただけます。
https://ynakagawa33.github.io/After_iOSDC_JAPAN_2019/Slide.html#1

Sansan

September 24, 2019
Tweet

More Decks by Sansan

Other Decks in Technology

Transcript

  1. Sansan アプリで学ぶ iOS 13 対応
    After iOSDC JAPAN 2019
    Sansan 株式会社 Sansan 事業部 プロダクト開発部
    中川 泰夫

    View Slide

  2. ⾃⼰紹介
    iOSDC で Sansan ブー
    スでキーボードの質問し
    ていたおじさん

    View Slide

  3. アジェンダ
    1. 何故やるのか?
    2. Sansan アプリを iOS 13 上で実⾏出来るようになるまでに
    起こった問題
    3. Sansan アプリを iOS 13 上で実⾏出来るようになった後に
    起こった問題
    4. まとめ

    View Slide

  4. 何故やるのか?

    View Slide

  5. 何故やるのか?

    View Slide

  6. 何故やるのか?
    Starting April 2020, all new app updates will neet to be
    built with the iOS 13 SDK and support the all-screen
    design of iPhone Xs Max or later.
    (2020年4⽉以降、新規Appと、Appのアップデートのすべて
    をiOS 13 SDKでビルドし、iPhone XS Max以降のオールスク
    リーンデザインをサポートする必要があります。)

    View Slide

  7. Sansan アプリを iOS 13 上で実⾏出来るよう
    になるまでに起こった問題

    View Slide

  8. iOS 13 SDK 対応に向けて
    1. macOS Catalina Beta にアップデート
    2. Xcode 11 をダウンロード
    3. iOS 13 SDK でビルドしてみる

    View Slide

  9. iOS 13 SDK 対応に向けて
    1. macOS Catalina Beta にアップデート
    2. Xcode 11 をダウンロード
    3. iOS 13 SDK でビルドしてみる

    View Slide

  10. iOS 13 SDK でビルドしてみる
    ⌘+B

    View Slide

  11. iOS 13 SDK でビルドしてみる

    View Slide

  12. iOS 13 SDK でビルドしてみる
    Module compiled with Swift 5.0 cannot be imported
    by the Swift 5.1 compiler:

    View Slide

  13. Swift 5.0 でコンパイル済みのモジュールを import できない
    Sansan アプリでは Carthage でビルド済みバイナリを
    コード管理することでビルド時間の短縮をしていた
    以前にコンパイルしたのは Swift 5.0 対応時

    View Slide

  14. Swift 5.0 でコンパイル済みのモジュールを import できない
    sudo xcode-select --switch
    /Applications/Xcode_11.app/Contents/Developer
    carthage update --platform iOS --no-use-binaries

    View Slide

  15. Swift 5.0 でコンパイル済みのモジュールを import できない
    *** Building scheme "XLActionController" in
    XLActionController.xcworkspace
    Build Failed

    View Slide

  16. XLActionController が Swift 5.1 でコンパイルできない
    ビルドログを⾒ると、
    /XLActionController/Resource/ActionCell.xib

    コンパイル出来ていない模様
    master ブランチに対して Xcode 11 beta 5 でビルドできるようにする
    修正の PR がマージ済み
    https://github.com/xmartlabs/XLActionController/pull/123

    View Slide

  17. XLActionController が Swift 5.1 でコンパイルできない
    Cartfile
    ---
    - github "xmartlabs/XLActionController" == 5.0.0
    + github "xmartlabs/XLActionController" "master"

    View Slide

  18. XLActionController が Swift 5.1 でコンパイルできない
    carthage update --platform iOS --no-use-binaries
    Build Succeeded

    View Slide

  19. Swift 5.0 でコンパイル済みのモジュールを import できない
    ⌘+B

    View Slide

  20. Swift 5.0 でコンパイル済みのモジュールを import できない

    View Slide

  21. アプリを動かしてみる on iOS SDK 13
    ⌘+R

    View Slide

  22. アプリを動かしてみる on iOS SDK 13

    View Slide

  23. アプリを動かしてみる on iOS SDK 13
    2019-09-22 17:26:41.737974+0900 Sansan[32738:933703] ***
    Terminating app due to uncaught exception 'RLMException', reason:
    'Primary key property 'id' does not exist on object 'User''

    View Slide

  24. Realm のプライマリーキープロパティがオブジェクトに存在しない
    v3.18.0 にて Xcode 11 での互換性が追加されていた
    コミットログを⾒るに Swift 5.1 で明⽰的に String 型の
    インスタンス変数名が設定されなくなったために、
    Primary key property を String 型で定義していた場合に
    パースできず、例外が発⽣する模様 (User オブジェクトの
    id プロパティは String 型だった)

    View Slide

  25. Realm のプライマリーキープロパティがオブジェクトに存在しない
    Cartfile
    ---
    - github "realm/realm-cocoa" == 3.15.0
    + github "realm/realm-cocoa" == 3.18.0
    carthage update --platform iOS --no-use-binaries
    ⌘+R

    View Slide

  26. View Slide

  27. Sansan アプリを iOS 13 上で実⾏出来るよう
    になった後に起こった問題

    View Slide

  28. Modal on Modal
    でナビゲーション
    バーの初回表⽰が
    おかしくなる

    View Slide

  29. Modal on Modal でナビゲーションバーの初回表⽰がおかしくなる
    初回表⽰の View Hierarchy を⾒ると、 UINavigationBar
    の⾼さは 56
    しかし、内部の _UIBarBackground や
    _UINavigationBarContentView の⾼さは 44
    この両者の差分、 12 が余⽩となって表⽰されてしまう
    2 回⽬以降はすべて 56 で同じ

    View Slide

  30. Modal on Modal でナビゲーションバーの初回表⽰がおかしくなる
    試してみたのは以下
    UINavigationBar の BarTint と同じ⾊を Background に
    設定して、ごまかす
    ナビゲーションバーの影がない場合にしか有効でない
    なんとか、初回のみ UINavigationBar の⾼さを変えられ
    ないか?
    カスタムしたナビゲーションバーを準備すれば、⾏けそ
    うだが、個別の OS 対応のみでそこまで出来ない…
    結局、セミモーダルをやめる (従来通り)

    View Slide

  31. Modal on Modal でナビゲーションバーの初回表⽰がおかしくなる
    - identifier="ShowWorkingCountry" id="iFe-jJ-NaI"/>
    + identifier="ShowWorkingCountry"
    modalPresentationStyle="fullScreen"
    modalTransitionStyle="coverVertical" id="iFe-jJ-NaI"/>
    遷移元も遷移先もセミモーダルをやめると従来の表⽰と同等に

    View Slide

  32. View Slide

  33. ログイン時の遷移
    アニメーションが
    おかしい

    View Slide

  34. ログイン時の遷移アニメーションがおかしい
    検証した感じ、セミモーダル上での push 遷移のアニメーシ
    ョンがイケてない
    出来そうな解決策は 3 つ
    セミモーダル上でも違和感のない push 遷移⽤のカスタム
    アニメーションを作る
    セミモーダルをやめる (従来通り)
    push 遷移のアニメーションを無効にして、セミモーダル
    の⾮表⽰アニメーションを活かす

    View Slide

  35. ログイン時の遷移アニメーションがおかしい
    検証した感じ、セミモーダル上での push 遷移のアニメーシ
    ョンがイケてない
    出来そうな解決策は 3 つ
    セミモーダル上でも違和感のない push 遷移⽤のカスタム
    アニメーションを作る
    セミモーダルをやめる (従来通り)
    push 遷移のアニメーションを無効にして、セミモーダル
    の⾮表⽰アニメーションを活かす

    View Slide

  36. セミモーダルをやめる (従来通り)
    router.viewController.modalTransitionStyle = .crossDissolve
    + router.viewController.modalPresentationStyle = .fullScreen

    View Slide

  37. View Slide

  38. push 遷移のアニメーションを無効にして、セミモーダルの⾮表⽰
    アニメーションを活かす
    - identifier="PushToMainMenu" id="1DV-k7-ezV"/>
    + identifier="PushToMainMenu" animates="NO" id="1DV-k7-ezV"/>

    View Slide

  39. View Slide

  40. UINavigationBar.titleView
    に UISearchBar を設定した
    場合に制約が効かなくなった

    View Slide

  41. UINavigationBar.titleView に UISearchBar を設定した場合に
    制約が効かなくなった
    元々、 iOS 11 で UISearchBar の⾼さが 56 になり、
    UINavigationBar の⾼さが⼦ビューに合わせて、 56 になった
    ことに対する対応として、以下のコードがあった
    if #available(iOS 11.0, *) {
    searchBar.heightAnchor.constraint(equalToConstant: 44).isActive = true
    }

    View Slide

  42. UINavigationBar.titleView に UISearchBar を設定した場合に
    制約が効かなくなった
    iOS 12 までは設定した制約が Intrinsic Content Size より
    優先されていた
    iOS 13 から設定した制約より Intrinsic Content Size が優
    先されるようになった

    View Slide

  43. UINavigationBar.titleView に UISearchBar を設定した場合に
    制約が効かなくなった
    ⾊々、試したが以前と同じく 44 を設定できたのは以下の⽅法
    Intrinsic Content Size が設定されていない UIView でラップ
    UISearchBar の
    translatesAutoresizingMaskIntoConstraints を false にする
    UINavigationBar.titleView にはラップした UIView を設定
    viewDidLayoutSubviews で制約を設定

    View Slide

  44. UINavigationBar.titleView に UISearchBar を設定した場合に
    制約が効かなくなった
    if #available(iOS 11.0, *) {
    searchBar.heightAnchor.constraint(equalToConstant: 44).isActive = true
    }
    navigationItem.titleView = searchBar
    + if #available(iOS 13.0, *) {
    + searchBar.translatesAutoresizingMaskIntoConstraints = false
    + titleView.addSubview(searchBar)
    + navigationItem.titleView = titleView
    + }
    続く

    View Slide

  45. + override func viewDidLayoutSubviews() {
    + if #available(iOS 13.0, *) {
    + //
    各 UI
    の幅取得は省略 :bow:
    + let titleViewWidth = navigationBarWidth - (leftBarButtonItemWidth
    + rightBarButtonItemWidth)
    + titleView.widthAnchor.constraint(equalToConstant:
    titleViewWidth).isActive = true
    + titleView.heightAnchor.constraint(equalTo:
    searchBar.heightAnchor).isActive = true
    + titleView.centerYAnchor.constraint(equalTo:
    searchBar.centerYAnchor).isActive = true
    + titleView.leadingAnchor.constraint(equalTo:
    searchBar.leadingAnchor).isActive = true
    + titleView.trailingAnchor.constraint(equalTo:
    searchBar.trailingAnchor).isActive = true
    + }
    +
    + super.viewDidLayoutSubviews()
    + }

    View Slide

  46. UINavigationBar.titleView
    に UISearchBar を設定した
    場合に制約が効かなくなった
    しんどい

    View Slide

  47. まとめ

    View Slide

  48. まとめ
    iOS 13 SDK でビルドと実⾏に成功するところまでは以前の
    iOS 12 SDK のアップデート時とそこまで変わらなかった
    実際に iOS 13 SDK でビルドしたアプリを iOS 13 上で動か
    すと様々な問題が発⽣した
    すべての画⾯をテストできたわけではないので、まだある
    かも…

    View Slide

  49. Sansan アプリからの学び
    iOS 13 SDK で変更のあったモーダル遷移をしている箇所と
    その画⾯からの遷移先までは⼀通り確認してみよう
    個別バージョン対応している箇所は SDK のアップデートの
    影響で動かなくなるかもしれないので、その部分も確認しよ

    View Slide

  50. View Slide