merpay Tech Talk for iOS Engineers 勉強会メモ

<p align="center">
   <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46227/37fbe3bc-555f-cd85-922a-5da62b028c26.jpeg" width=500>
</p>

日時: 2019/09/26 19:30~
場所: 六本木 森タワー 25F
イベントURL: https://mercaridev.connpass.com/event/146056/


# SwiftUI実践入門 by 佐藤剛士 [@hatakenokakashi](https://twitter.com/hatakenokakashi)

スライドURL: https://speakerdeck.com/satotakeshi/swiftuiru-men

## SwiftUIにおいてAppleが掲げる目標
基本機能の開発ではなく、アプリ独自の機能の開発に使える時間を増やす

## Swift UI
- 4つのコンセプト
- マルチプラットフォーム
- Xcode11のキャンバス・ライブプレビュー

### 4つのコンセプトとは
- Declarative 宣言的シンタックス
	- SwiftUIにどんなViewが必要なのかを宣言的に指定できる
- Automatic 自動機能
	- DarkMode、Dynamic Type、多言語対応、アクセシビリティを特に意識しなくても対応してくれる
	- 変えたい場合は独自実装も可能
- Compositional 組み合わせ可能
	- Viewコンポーネントを切り出して組み合わせることができる
	- 複雑な構成でも、読みやすさを保つことができる
- Consistent 一貫性のあるUI状態
	- @State を使うと、プロパティの変化を検知できる

### マルチプラットフォーム
- いままでだと、MacやiPhoneなどではフレームワークが別のためコードの共通化はできなかったが、
  SwiftUIではコードの共通化が可能（iPhone, WatchOS, AppleTV, MacOS）
- Learn once, apply anywhare（一つのプラットフォームを学べば、あらゆるプラットフォームで適用できる）

### Xcode11のキャンバス・ライブプレビュー
- コードを変更すると自動同期される
- キャンバス上からもGUIで変更でき、変更すると、コードにも反映される
- PreviewProviderプロトコルに準拠する型ならプレビューされる

## SwiftUIの修飾子の仕組み

```swift

Text("Hello")
.padding()
.background(Color.red)
```
だとビュー全体の背景色が赤色のラベルができるが、

```swift
Text("Hello")
.background(Color.red)
.padding()
```
だと、文字部分の背景色だけが赤色のラベルができる


# Metal SDK〜Let's compare Metal to CoreGraphics!〜 by Sonny

## 2D in Vulkan, in the background
- MTKView使う
- まだUIKitは含まれている
- めちゃ早いけど数学たくさん使う
- MTKViewDelegateはNSObjectProtocolに適用される
- MTLCommandQueueとMTLrenderPassDescripterを結構使う

## Metalは頂点と座標を使ってレンダリングしている
- VertextDataとDrawCommandsでGPUに命令を送る
- VertexShaderが2Dスクリーン座標に変換する
- Tessellationで三角を細かく作成し、画像の品質を上げる etc.
- ここまでの作業はエグそうだけど、Appleがそれを扱うための言語として用意してくれたのがMetal
- 残念ながらMetalはC++でできてるけど、ゲーム開発者なら使いやすそう

## SwiftプロジェクトをMetalに
- MSLを扱うにはBridging Headerが必要
- Bridging Headerにはシェーダーヘッダーファイルが含まれている
- ヘッダーファイルには頂点データの宣言が含まれている

## パイプラインに頂点データとコマンドを送る
- コードはしっかりと照らし合わせて書かないと、ミスった際に返ってくるエラーが結構辛い
- pure Core GraphicsよりはGPU使ってるけど、一応60fpsでMetalで画像を表示できた

## ゲームじゃないアプリにMetalを使うべき？
- 結論から言うと使わない方が良さそう
- もしMetal使うなら、コンパイル時間がかかるのでSwiftではなくObjective-Cを併用すると良さそう
- Swiftはタイプセーフだけど、C++はそうではない
- 2つの技術を学ぶ必要があって学習コストは高め
- 3次元座標を2次元座標に変換する必要があるため大変だけど楽しかった
- GPUカウンターはiOS13以降で使える


# SwiftSyntaxによる静的解析入門 by 北 裕介 [@kitasuke](https://twitter.com/kitasuke)

スライドURL: https://www.slideshare.net/kitasuke/making-your-own-tool-using-swiftsyntax

## SwiftSyntaxを使っているツール
- SwiftUI Previews
- [apple/swift-format](https://github.com/apple/swift-format)
	Appleが公式に出してるformatter ほぼSwiftLint

## SwiftSyntax何に使う？
- Code modifier
- Code analyzer

## SwiftSyntaxって何？
- libSyntaxを元に提供されてる
- SyntaxTreeというツリー構造で表される
- SwiftSyntaxはSwiftのコードを元にSyntaxTreeに変換するもの
- SwiftSyntaxはAppleが提供してるparserツールで、主にはSwift開発で使うツールを作るためのツール


# モバイル決済アプリの作り方(詳細編) by 松前健太郎 [@kenmaz](https://twitter.com/kenmaz)

## モバイル決済アプリとは何か
- 経産省がキャッシュレス・ビジョンを発表
	- 法改正(eKYC)、キャッシュレス推進協議会
- モバイル決済アプリでは以下の構成要素を作る必要がある
	- Cash-In お金を入れる
	- Cash-Out お金を使う道
	- Wallet 財布
- ネックとなるのが資金決済法
	- 個人間送金 収納代行業で済む
	- 全部対応するには資金移動業になっちゃう
- 資金移動業となる場合に気をつけること  
犯罪収益移転防止法（ヤクザとかの資金にならないようにする）に気をつける
  1. 郵便局での送金
  2. 銀行口座接続による送金
  3. eKYC（オンライン本人確認）の導入

## Apple Pay
すごくセキュアなクレジットカードベースの決済方法

### Apple Payのカード登録がなぜセキュアか
- 元のカード番号をDPANトークンに変換して取り扱う
- 間にトークンプロバイダーが挟まっている分、セキュア
- iOSデバイスからトークンプロバイダー間で元のカード番号を取り扱わなくて済む

### Apple Pay In-App Provisioning
- バーチャルクレカを作れる
- PassKit周りのAPIを使う
- Apple Pay Cashは個人間送金機能だが、日本では使えない

### コード決済の種類
- CPM（利用者提示型）
- MPM（店舗提示型）
- コード決済の仕組みは各社非公開

### JPQR
- キャッシュレス推進協議会
- QRコードのデータフォーマット
- 標準化された規格の一つ
- コード仕様はバーコードとQRコードが使える
	- バーコードは事業所識別コードとトークンが入ってる
	- QRコードはデコードするとTLV形式でデータが含まれている
	- Tag 57番を見れば、バーコードと同じ情報が含まれている
	- 事業者識別コードで何Payを使っているかわかる

### CPMにおける留意点
- バーコードとQRは同一画面に表示
- スクショはあまり撮らないように注意点を記載
- 読み取りやすいように輝度を上げるようにする


### MPMにおける留意点
- 偽造が容易なのでスクショはあまり撮らないように注意点を記載
- アニメーション、音などで偽造防止をする
- 利用者・取引者へ完了通知をする


### OSS
- QRコード内部の情報を確認できるツール  
  Github: https://github.com/kenmaz/JPQRReader

### 既存アプリに組み込む
- まずは機能毎にフレームワーク化したことで、複数チームによる同時開発が可能になった
- Sandboxを用いた開発効率向上
- 読み取りでカメラを使うので実機が必要だが、DIしてカメラモジュールをスタブしている
- Cyclomatic Complexity Numberを使って、コードの複雑さを測ってリファクタしている
- Dead Code Detectionで重複コードをチェック
- Relation analysis of each ViewController  
  Github: https://github.com/kenmaz/SwiftOutline