Categories: 勉強会

#wwdc_mercari メルカリメンバーによるWWDC内容を厳選したRecap of WWDC20のまとめ

メルカリの開発メンバーがWWDCの厳選した内容を発表するRecap of WWDC20に参加してきたのでそのまとめです。

WWDC20 Recap of SwiftUI & Combine

Software Engineer at Mercari, Inc.❤️ iOS/Swift/SwiftUI - kagemiku
kagemiku - Overview - GitHub

Recap of SwiftUI

AppStructure

  • 新規にプロジェクトを作るとprojectApp.swift, ContentView.swiftとふたつのファイルが作られる。AppDelegateとSceneDelegateはもうおさらば
  • @main:トップレベルのエントリーポイントであることを示すattribute
  • App protocol: アプリの挙動の構造を決める
    • App -> Scene -> Viewといった構造に
  • Scene & WindowGroup: シーンはipadの右と左とで独立したものとして存在できる

List and collections

  • lazyVstack:cellが必要になったタイミングで初期化されるようになりました
  • LazyHGrid & LazyVGrid: collectionViewみたいなもの。

NewComponents and effect

  • toolba and label: ツールバーとラベルを設定できるようになった
  • progressview: プログレスバーです
  • Link and openURL: デフォルトでsafariを開ける
  • matchedGeometryEffect: 選択したものを入れ替えたりする時にきれいにアニメーション描画をしてくれる

Data Managements

  • @StateObject: ObservableObjectのラッパープロパティ
    • @ObservedObjectだと構造体が初期化されたタイミングで初期化されて、破棄された時に破棄される
    • @StateObjectだと、viewが作られたタイミングで初期化されて、破棄された時に破棄される
    • あるナビゲーションビューのなかで@StateObjectを指定しておくと表示されたタイミングで初期化される
  • SceneStorage : シーン内でいきるストレージ
  • AppStroage: UserDefaultsみたいにつかえるストレージ

Recap of combine

  • assigne(to:)
    • @Publisehdプロパティで指定した要素にそのまま流せるようになった

The updates to CollectionView

iOS Engineer. manoj036 has 17 repositories available. Follow their code on GitHub.
manoj036 - Overview - GitHub

Section Snapshots

  • section snapshotを更新するとセクションを更新できる
  • appendメソッドで簡単に要素を追加できる
  • expandメソッドを使うことでセクションのひらくものができる

ListConfiguration

  • 個々のセクションが2つの異なるリストに含められる
  • 5つのスタイルが指定できる
  • sidebar plainはios14で使われます

PresentatinoAPI

  • tableviewcellににているListCellが追加された。
    • 最小表示のpaddingなどを設定できる
  • swipe動作なども設定できるプロパティ(leadingSwipeActionConfiguration)が追加されました
    • Accessoriesも設定できます

CellRegistration

  • ios14ではDequeueで型の変換も自動になる

ViewConfiguration

  • ContentConfigurationを渡すことでセルの設定を入れ替えることができるようになった
  • BackgroundまわりやListContentにたいするConfigurationがあります

WKWebView new APIs for iOS14

@mustafabaalbaki
  • UIWebCiewより高速で動きます
  • SFSafariViewControllerは最適なタイミングで使われる。
    • メルカリではキャリアでの決済などで使われる

外部JS制御

  • allowContentJavascript:外部のJSを実行するかを制御できるようになった

WebViewのレンダリングを微調整

  • scalesPageToFitはios13ではつかえなかったが、それと同等の機能として、pageZoomプロパティでズームなどができるようになりました

コンテンツの共有

  • ビットマップ化された画像
  • PDFサポートしました
  • ビュー内のコンテンツをcreatePDFメソッドを呼ぶことでPDFを作成できるようになりました

ユーザのプライバシー強化

  • インテリジェントな追跡防止
  • ITPはすべてのWKWebViewアプリでデフォルトで有効になった

QA

  • 自社のは動くが、外部のは動かさないという意味か?
    • あってます
    • javaでナビゲーションだけを向こうもできるし、javascriptで有効にしたホワイトリスト一覧もできるし、動かしたいところだけ動かすこともできる

AppClips

  • ベースとなるアプリは完成している必要がある
  • インストールされたら自動で起動するので、アプリの機能への素早いアクセスと体験
  • appstoreで指定されたURLによって起動可能。状況によって起動方法を変えられる
  • appclipsの体験が終わったあと、フルアプリをDLしてくださいといった事もできるので、フルアプリの導線になる

体験例

  • スムージーやさんにいき、NFCをスキャンするとiPhoneにappclipカードがでるのでopenするとappclipが起動され、スムージーが注文できるようになる
  • NFCによってAppClipExperienceを読み取り、AppClipカードが動きNSUserActivityで制御する
  • カードやタイトルなどをappstoreで設定する

起動方法

  • NGC, QRコード、safari app banner(webページの上におかれるやつ)、Messages内のリンク、MapsのPlaceCardsを紐付けて起動などができる
  • AppLibraryの最近起動されたアプリの中から起動もできる
  • AppClipCodesというものを読み取ると起動もできる
  • デフォルトは起動できるのはsafari/messagesのみとなっている。NFC、QR、位置情報、複数の事業者が利用スといった場合で起動させたかったらAdvancedAppClipExperiencesを作る必要がある
    • 1つのAppClipに対して複数作成できる
    • 呼び出し用のURLを登録する
    • 接頭辞が最も具体的なURLのものが起動する(prefix match)
  • AdvancedAppClipExperiencesの活用例
    • 注文機能と、予約機能とでAppClipをわけたりすることもできる
    • store/*というURL、store/cupatinoというURLでわけると、cupatinoに来た場合は具体的にセットしたappclipsが呼ばれる

注意点

  • appclipsのサイズは10MB以内。外部ライブラリに依存すると難しいので自作しよう
  • AppClipsはキャッシュのような形で保存されているので、使用されないと削除される
  • フルアプリをインストールしたら上書きされる

感想

  • メルペイに導入は、できるだけ外部ライブラリに依存しないようにはしているが抑える度に依存しないようにするのが難しそうなのと、ログインして入金しないとpaymentが使えない現状があって工夫してpaymentをやらせないといけないので、工夫が必要そう。
  • 観光地などにつかえるのでは。展望台などで、パノラマアプリなどで景色を説明したり、近くの店で貯まるポイントみたいなかたちでやると面白いのでは。
  • うまくAppClipsを作れれば最高のUXを実現できる

まとめ

  • アプリの機能を素早く体験できる
  • サイズは10M以下
  • UX最高!

QA

  • 山手線の各駅にスタンプラリーおくのは良さそうだと思うが、データの保持はできるか?
    • AppClipsからフルアプリへの移行はできる
    • group containerにデータを保持することで、group containerからデータを取り出してフルアプリに引き継げる
    • AppClipsが消えてもgroup containerからデータを取ってこれるのでは?
  • 接頭辞がもっとも具体的というのは?
    • URLが最長マッチしたものが選択される

What’s new in Swift?

@Kaz_Homma

複数クロージャーでもカッコを省略して引数にかける

UIView.animate(withDuration: 0.1, animatinos: { 
  //  do something
}, completion: { _ in
  //  do something
})
UIView.animate(withDuration: 0.1) { 
  //  do something
} completion: { _ in
  //  do something
})

selfを書く回数が減る

UIView.animate(withDuration: 0.1, animatinos: { 
    self.hoge = ...
}, completion: { _ in
    self.hoge = ...
})
UIView.animate(withDuration: 0.1, animatinos: { [self] in
    hoge = ...
}, completion: { _ in
    hoge = ...
})
  • しかし、weak selfにした場合は省略できません
  • swiftUIではselfがenumかstructの場合も省略できるようになりました

enumにComparableプロトコルが使いやすくなった

enum Membership: Int, Comparable {
    case base, silver, gold
}

extension Membership: Comparable {
    static func < (lhs: Date, rhs: Date) -> Bool {
         return lhs.rawValue < rhs.rawValue
    }
}
enum Membership: Int, Comparable {
    case base, silver, gold
}
比較funcを書かなくても良い!

Enum caseでstatic var static funcを満たすことができる

enum JSONDecodingError {
    case A
    case B(_ key: String)
}

enum JSONDecodingError {
    case unknown
    static A: JSONDecodingError  = unkown
    static func B(_ key: String) -> JSONDecodingError { return unkown }
}
enum JSONDecodingError: DecodingError {
    case A
    case B(_ key: String)
}

protocol DecodingError {
    static var A: Self { get }
    static func B(_ key: String) -> Self
}
protocolをenumで満たすことができるようになった!

keyPathをクロージャーの代わりに渡せる

struct User {
    let name: String
    let isAdmin:Bool
}

users.map { $0.name } // ["Tom", "Kaz"]
users.map { \.name } // ["Tom", "Kaz"]
mapにkeyPathを渡す場合はextension Collectionを書く必要があったが、swift5.2からは必要なくなった!

QA

  • SE0269の導入後unowned selfのときでも省略できる?
    • その場合もselfは省略できる
    • closureってデフォルトでunowned?→指定しなければコピーしてるので別物
  • keyPath使ったことないからどういう時に使うのかがわからない
    • swiftUIでassignでプロパティ指定する時に使う
    • 自分で定義はないが、フレームワークで使えと言われたら使う
    • swift uiのforeachやlistはidentifierをわたすとそれに基づいたviewの区別をしてくれるが、あるオブジェクトを渡して、structのなかのfieldをidとして扱うときに、型安全に使えるので使い所だと思います
      • keypathを使わないとreflectionやclosureを渡してフィールドを返すみたいな実装が必要になってしまう
    • 安全に動的にアクセスすることが可能になる
    • KVO使った時に文字列を渡していたが、そういう時にkeyPathを使うと安全に使えそう

パネルディスカッション

iOS14で嬉しい機能、大変だと思う機能

  • Manoj
    • 好きじゃない機能として、ウィゼットが一時間ごとしかアップデートされないのでダイナミックにアップデートしてほしい
    • 英語をしゃべるので翻訳機能がインテグレートされるといい
    • 絵文字のサーチ機能はいい
    • BOTに関して、skip detectionがよい
  • Musfana
    • ウィゼットとappのtipsが良い
    • ウィゼットのどこがいいか?
      • ウィゼットの追加やスクロールダウンする時のapp iconや画面などを見に行ける
      • notification centerもそうだが、いろんな形でダイナミックに使える
      • 色んな所で使えるので開発者のモチベーションが上がると思う
  • Kagemiku
    • apple penceliで文字を書くとtextviewに認識されるscribbleがいい
    • ipadの内部でxcodeでコードを書けたら面白そう
  • apple silicon上だとiosのアプリがmacで動くと言っていたが、macosのアプリもipadに移植する未来もあると思っているがどうか
    • clipがSwiftUIしかかけないが、今後SwiftUIで作っていくので移植を考える前に同じコードで動く未来が来る
    • swiftアセンブリ対応もしてくれたwebでも動いてくれたらswiftコードからどこでも動いたら面白そう
  • Kazu
    • デフォルトのメインアプリ(ブラウザやメール)をかえられるのがいいなとおもった
  • Yusuke
    • iPhoneが車のキーになる
    • 無線通信が浸透したら面白そう
    • 鍵や財布がいらない時代になる
    • 今後、体にチップ埋め込んで生体認証になる流れになるような気がしました

SwiftUIの進化どうでしょう?

  • Kagemiku
    • 順当に進化している
    • collectionviewはなかったが、いい感じに解消された
    • lazy stackいいですよね
    • SFSafariViewControllerに相当するものはないですよね?
      • componentとしてはない。
      • xcodeやIDE含めて進化していくことでしょう
  • Kazu
    • ナビゲーションバー厳しかったが、よくなった
    • 知識をアップデートしなければ
    • swiftUIでもself省略できるようになったがどうか?
      • swiftUIによせた進化なのかも
  • Musfana
    • すごい進化してる。iosアプリに将来的に貢献することでしょう。

AppClipsと未来のアプリ体験

  • Yusuke
    • ポイント化アプリはいい
    • 概念はいいが例が浮かばない
    • 制約を守った上で開発となると普及しづらそう
    • 隅田川で遊覧のフェリー通るが、船の上からAR使ってお台場や豊洲みたいな説明ができるようになったらいいと思うがどうか?
      • 問題があって、appleとしてはAppClipsはフルアプリに対してAppClipsが存在していて、早くて軽いから使わせたいではなくて使わせていいタイミングで使わせてフルアプリを使わせるみたいなふうに使ってほしい
      • 作った目的としては違う目的として使われてしまうことを懸念
      • フルアプリを使わせるユースケースを考えるのが難しい
      • 観光で言えば特定の地域で限定させるのではなく、全世界で使えるようなベースアプリであるならいいと思う
    • 有料アプリもAppClipsなら無料アプリで配布できるらしいが、有料版だと進めにくい機能をappclipsでメイン機能だけ無料に使わせてやるのはいいと思う
      • アプリ内課金とどう違うのではと思った
      • →コストがかかるので、実装コストをかけないで済むならAppClipsはいい選択肢だと思った(Sato)
  • Manoj
    • メルカリでもAppClipsは有効に使えると思っている
    • 購入のところで、自分が買いたいアイテムを共有したり、qrをスキャンさせたり、apple signinでログインさせて課金させるのがいいと思う
  • Musfana
    • ライドシェアをアプリがなくてもスキャンしてすぐ乗れるのはうまく使える方法なのでは
    • 日本にはない概念?(Yusuke)
      • 自転車系などは全然ある(Kagemiku)
      • ログインはSign with Apple、支払いはApple Payといっていたから、初回だけただでのれるということはできそう(Sato)
    • メルカリステーション(物理的店舗)でAppClips使って体験したらメルカリを体験できるケースも良さそう(Kaz)
  • AppClipsでインストールされたアプリでプッシュ通知は使えるか?
    • ONの許諾は必要だが、プッシュ通知は使える。(Yusuke)
  • AppClipsアプリ内広告のミニゲームで使えるかな?
    • 試してみないとわからない
    • storekitがAppClipsは使えないので、アプリ内課金がおそらくできない(Sato)

@mogmetの所感

SwiftUIもバージョンごとに進化していますが、それに合わせてswiftもより書きやすく進化しているため、さらにアプリが作りやすくなっていくなと感じました。
機能面だけでなく内面側もアップデートしていってより今後のiOSの未来に胸がふくらむセッションでした。
mogmet

View Comments

  • I may need your help. I've been doing research on gate io recently, and I've tried a lot of different things. Later, I read your article, and I think your way of writing has given me some innovative ideas, thank you very much.

  • Thanks for sharing. I read many of your blog posts, cool, your blog is very good.

  • Can you be more specific about the content of your article? After reading it, I still have some doubts. Hope you can help me.