Open3

Native DAppsをFlutterで作ってみる(失敗した)

YuheiNakasakaYuheiNakasaka

Native DAppsをFlutterで作ってみる(失敗した)

リソース

やること

  • Native DAppsをFlutterで作りたい
  • Flutter + MetaMask連携でNFTを表示する

メモ

  • Flutter Webの連携方法は結構情報がある
  • ネイティブ連携の場合は?
  • 何はともあれとりあえずはdeeplinkを扱う準備をしてみる
    • iOSで試す
      • apple-app-site-associationをdeeplinkさせるドメイン配下に設置
      • entitlementをapplinks:hoge.example.comのような感じでXcodeで設定
      • テストでBlitz.jsのpublic/におけばいいとやっていたら.jsonをつけてはいけないAppleの制約にやられた。そのままだとContent-Typeがoctetstremになってしまうのでだめ。とりあえずは下記で解決した。/public/.well-knownにおいて、vercel.jsonにContent-Typeを独自で設定する。
  • ローカルでテストするためにMetaMask mobileをインストール
  • Flutter側からdeeplink generatorで生成したリンクを呼び出すとエラーになる
    • Safari cannot open the page because the address is invalid.
      • apps.apple.comを開こうとしてる。つまりApp Storeにリダイレクトされてる。やはり厳しいのか...
    • 実機で試す
      • 実機でも同じ。MetaMaskを認識してくれないっぽい。
  • OrangeWalletがFlutter+WalletConnect連携のライブラリを書いてたのを発見
    • https://twitter.com/WalletConnect/status/1444587095159414785
    • exampleをビルド&実機で動かしたらできた。MetaMask側との連携もOpenSeaと同様のモーダルで認証を行えそうだった。
      • Image
    • しかしWalletConnectの仕組みがわかってきてさらに絶望が...
      • OrangeWalletが作っているexampleのWallet認証の流れ
          1. https://example.walletconnect.org/のページをwebviewで読み込んで、Walletのアプリを開き認証を行う。
          1. 成功するとwalletconnect側とsessionが確立する
          1. 自分のアプリに戻ると先ほど確立したsessionを利用できるようになっている。
      • という感じ。つまり認証にはwebページが必要になる。https://example.walletconnect.org/はその認証ページの例ということでexampleとドメインに入っているようだ。てことはUIのカスタマイズは必須だしログイン画面用に自分でwebページを作らないといけないわけか。
    • walletconnectのwebページの静的HTMLをFlutter上で表示させると外部ホスティングいらないのでは
      • 変更しづらいしwalletconnectのライブラリのコードもたくさんあるのでCDNで落とすとかでも煩雑すぎる
  • ネイティブアプリでMetaMask等のWalletをSignerにしてTransactionを伴うアプリを作るのは筋悪すぎるしほぼ無理。OpenSeaがViewerアプリになってるのはこういう理由からか。とはいえOpenSeaのモバイルアプリはMetaMaskをdeeplink(or UniversalLink)で開いてアドレス取得してるんだけどあれどうやるのか...。MetaMask公式Doc読んでもUniversalLinkでアプリを開けないが。
  • とにかくわからんことが色々あって疲れたので一旦終わり