ElixirDesktop iOS Exampleを参考にiOSアプリを１から作ってみる

# はじめに
本記事は以下を参考にXCodeでプロジェクトを作るところから初めて
実際に起動するまでの手順の備忘録です

https://github.com/elixir-desktop/ios-example-app


# フォルダ構成
LiveViewNativeがPhoenixのProjectの配下にnativeディレクトリを作成してそこに各OSのPJおいてたのでそれに合わせる
こんな感じになる

`basic/native/basic`

# iOS PJを作る

xcode new project phoenix pj/native/ に作成

- ZIPFoundation
- liberlang
- native-lib.cpp
- native-lib.hpp

をXcodeの画面同士でサンプルからコピー

Bridge-Headerを作るかを訊かれるのでOK

ヘッダーに以下を追加

```bash:native/xx/xx-Bridging-Header
#import "native-lib.hpp"
```

# Carthage まわり
ライブラリのインストールだったりビルドをしてくれます

Cartfileのファイルを作成

```bash:native/xx/Cartfile
github "weichsel/ZIPFoundation" ~> 0.9
```

以下を実行
```
carthage update --use-xcframeworks
```

XcodeでliberlangとZIPFoundation を embed & sign にする

![スクリーンショット 2023-09-27 13.49.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64198/878613a4-2857-fec7-7ab5-43e747e9796e.png)

# アプリの中身のコードを作成

TodoApp.swiftの中身をコピー

```native/basic/BasicApp.swift
import SwiftUI

@main
struct BasicApp: App {
    @Environment(\.scenePhase) var scenePhase
    
    var content = ContentView()
    var body: some Scene {
        WindowGroup {
            self.content
        }
        .onChange(of: scenePhase) { phase in
            switch phase {
            case .background:
                print(".background")
            case .active:
                print(".active")
                if let bridge = Bridge.instance {
                    bridge.reinit()
                }
            default: break
            }
        }
    }
}
```
以下はXCode同士でファイルコピー

- Bridge.swift
- ContentView.swift
- WebView.swift
- WebViewController.swift

# ビルド設定

run_mixをVSCode経由でコピー（実行権限とかがめんどくさいので)
パスがいつものと違うのでそこを注意

```bash:native/basic/run_mix
#!/bin/bash
set -e

# Setting up the PATH environment
[ -s /opt/homebrew/bin/brew ] && eval $(/opt/homebrew/bin/brew shellenv)
[ -s /usr/local/bin/brew ] && eval $(/usr/local/bin/brew shellenv)

# This loads nvm
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  

# This loads asdf
if [ -s "$HOMEBREW_PREFIX/opt/asdf/libexec/asdf.sh" ]; then 
  \. "$HOMEBREW_PREFIX/opt/asdf/libexec/asdf.sh" 
elif [ -s "$HOME/.asdf/asdf.sh" ]; then
  \. "$HOME/.asdf/asdf.sh"
fi

BASE=`pwd`
export MIX_ENV=prod
export MIX_TARGET=ios

mix local.hex --force --if-missing
mix local.rebar --force --if-missing

# Phoenix PJまでのパスに変更 
cd ../../

if [ ! -d "deps/desktop" ]; then
  mix deps.get
fi

if [ ! -d "assets/node_modules" ]; then
  cd assets && npm i && cd ..
fi

# xcodeで作成したプロジェクト名に変更
if [ -f "$BASE/basic/app.zip" ]; then
  rm "$BASE/basic/app.zip"
fi

mix assets.deploy && \
  mix release --overwrite && \
  cd _build/ios_prod/rel/basic && \ # phoenix PJ名
  zip -9r "$BASE/basic/app.zip" lib/ releases/ --exclude "*.so"
# ↑ここも忘れずに
```


Build PhaseにRun Scriptを追加

![スクリーンショット 2023-09-27 14.08.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64198/7901f19d-d030-76ef-6e17-8dbff990fbdb.png)

以下のように設定

```bash
#!/bin/bash
set -e

./run_mix
```

- run_mixを実行
- output fileに app.zipを追加

![スクリーンショット 2023-09-27 15.18.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64198/be5d99e4-002a-3b4d-bd1d-6ec2055138f5.png)


build時にrun_mixを実行できるようにProjectの設定で User Script SandboxをNoにする

![スクリーンショット 2023-09-27 16.02.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64198/6d629c73-90e0-1658-6576-c90f8fae33e6.png)

# ビルド実行！

動いた！

![スクリーンショット 2023-09-27 16.20.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64198/e186e79a-d7d4-22fe-0213-70d5ae84b18e.png)


# 最後に
これでアプリ名の変更とかめんどくさい処理をしなくてもアプリ作れるので提出が楽になるといいなぁ

# 参考

- https://zenn.dev/feb19/articles/c3e6ec545383bb
- https://qiita.com/tsuzuki817/items/8f6e2e0c2b3f9d197097