サマリ📱
iPhone
/iPad
でWebBluetooth
を使ったWebアプリを動かすには、Bluefyというアプリを使うと便利なのですが、p5.js
で作ったwebアプリを動かすうえで、少しハマった部分があるので、メモを残します。
成果物
👇このようなtoio
のリモコンwebアプリをp5.toioを使って作りました。
Webアプリ現物と ソースコード
iPhoneで #WebBluetooth を使ったWebappを実行できる無料アプリ #Bluefy を試したが、既存アセットをそのまま使えてとても良い。
— Tetsunori NAKAYAMA | 中山 哲法 (@tetunori_lego) May 8, 2022
試しに #p5toio を使った #toio のラジコンアプリを作ってサクッと公開。アプリの審査も無いし、iPhoneでJSのBTアプリを配布する方法としては最速&最も簡単なのでは? pic.twitter.com/ZlJ9ES8HtI
メモ
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
の外側の白背景が目立ってしまいます。
css
に、background
を追記します。ここを黒にしておくとノッチ部分も目立たないです。
html, body {
margin: 0;
padding: 0;
background: black; /* ここに追加 */
}
Canvas
のサイズ
縦横サイズはwindowWidth
, windowHeight
とし、画面の回転でCanvas
のリサイズを実施するのがよいです。なお不具合なのか、たまに回転にリサイズがついてこないことがあります。
function windowResized() {
resizeCanvas(windowWidth, windowHeight);
}
function setup() {
createCanvas(windowWidth, windowHeight);
// ...
}
mouseClicked
関数は、Canvas
のコールバックとして設定(ここ一番大事)
WebBluetooth
は接続を開始する際にユーザーアクションを要求しますが、いつものようにmouseClicked
をオーバーライドして記載する方法ではなぜかBluefy
アプリの接続処理が走りませんでした。以下のように、Canvas
のmouseClicked
コールバックとして設定することで動作することが確認できました。
function setup() {
const cvs = createCanvas(windowWidth, windowHeight);
cvs.mouseClicked(connectCube);
// ...
}
function connectCube() {
P5tCube.connectNewP5tCube().then((cube) => {
cube.turnLightOn('white');
});
}
横向きだと、Bluetooth接続ダイアログが表示されない
iPhone
などの幅が狭い機種で横向きにすると接続ダイアログが表示されず、ただBlurがかかっただけの画面になってしまいます。
※ iPad
は縦横どっちでも大丈夫でした。
これを縦向きに回転するとダイアログが表示される
ので、必要に応じてその旨をユーザーに通知したいです。より厳密に向きや画面サイズを取得することもできますが、Canvas
の縦横サイズでざっくり判定するのもありかと思います。
if (width > height) {
text(`接続ダイアログが表示されない場合は画面を縦向きにしてください。`, width / 2, 20);
}
上記に気を付けると、あとは通常のp5.js
のコードで動作してくれます。それでは~。