4
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

iPhone/iPadで動くWebBluetoothアプリをp5.jsで作る方向けのメモ

Last updated at Posted at 2022-05-08

サマリ📱

iPhone/iPadWebBluetoothを使ったWebアプリを動かすには、Bluefyというアプリを使うと便利なのですが、p5.jsで作ったwebアプリを動かすうえで、少しハマった部分があるので、メモを残します。

成果物

👇このようなtoioのリモコンwebアプリをp5.toioを使って作りました。
Webアプリ現物ソースコード
landscape_dialog.png

メモ

Webアプリとして使うための準備

タッチするたびにスクロールしたり拡縮されないようにするために、html headerに下記のmetaタグとscriptを追加

  <head>
    <!-- ... -->
    <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, viewport-fit=cover" />
    <meta name="apple-mobile-web-app-capable" content="yes">

    <script>
      window.addEventListener("touchmove", function (event) { event.preventDefault(); }, { passive: false });
    </script>
    <!-- ... -->
  </head>

ノッチ部分が目立たないように

何もしないと、こんな感じでCanvasの外側の白背景が目立ってしまいます。
before_notch.png
cssに、backgroundを追記します。ここを黒にしておくとノッチ部分も目立たないです。

html, body {
  margin: 0;
  padding: 0;
  background: black; /* ここに追加 */
}
after_notch.png

Canvasのサイズ

縦横サイズはwindowWidth, windowHeightとし、画面の回転でCanvasのリサイズを実施するのがよいです。なお不具合なのか、たまに回転にリサイズがついてこないことがあります。

function windowResized() {
  resizeCanvas(windowWidth, windowHeight);
}

function setup() {
  createCanvas(windowWidth, windowHeight);
  // ...
}

mouseClicked関数は、Canvasのコールバックとして設定(ここ一番大事)

WebBluetoothは接続を開始する際にユーザーアクションを要求しますが、いつものようにmouseClickedをオーバーライドして記載する方法ではなぜかBluefyアプリの接続処理が走りませんでした。以下のように、CanvasmouseClickedコールバックとして設定することで動作することが確認できました。

function setup() {
  const cvs = createCanvas(windowWidth, windowHeight);
  cvs.mouseClicked(connectCube);
  // ...
}

function connectCube() {
  P5tCube.connectNewP5tCube().then((cube) => {
    cube.turnLightOn('white');
  });
}

横向きだと、Bluetooth接続ダイアログが表示されない

iPhoneなどの幅が狭い機種で横向きにすると接続ダイアログが表示されず、ただBlurがかかっただけの画面になってしまいます。
landscape_dialog.png
iPadは縦横どっちでも大丈夫でした。

これを縦向きに回転するとダイアログが表示される
portrait_dialog.png
ので、必要に応じてその旨をユーザーに通知したいです。より厳密に向きや画面サイズを取得することもできますが、Canvasの縦横サイズでざっくり判定するのもありかと思います。

  if (width > height) {
    text(`接続ダイアログが表示されない場合は画面を縦向きにしてください。`, width / 2, 20);
  }
landscape_dialog.png

上記に気を付けると、あとは通常のp5.jsのコードで動作してくれます。それでは~。

4
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?