Open11
エラハン物語 #PWA

PWA #A2HS
consoleみれないかなあ
- https://zenn.dev/alpha2048/articles/c855850554f88f
- https://www.atotok.co.jp/labo/8989496c5ad0ba978ebabd224aebb285
- https://techblog.gmo-ap.jp/2022/04/21/selenium-iphone-safari/
WebView
2024/08/08
- https://qiita.com/ya8612tec/items/20390b3e4fbec4d01682
- https://zenn.dev/ryurock/articles/qiita-20180326-4a6198e8bc64e268ac2e
LINEとInstagramは独自のuserAgentをもつWebViewで
window.navigator.serviceWorker
が無い。
しかも try catchでエラハンしないとアプリ自体が動かない。
そしてmacに接続してインスペクター開いても、
極稀にしかLINE/InstagramのWebViewがヒットしない。

- MacのChrome上でインストールして、Macのアプリとしてみる
- LINEなどは不明

setAppBadgeがないせいだった
window.navigator?.setAppBadge(100);
などの記述だと、
スマホの"ブラウザ"で立ち上げた時だけエラーがでてしまい、
原因特定が困難、どこが悪いのかわからなくなってしまいます。
理由
window.navigatorはあっても、setAppBadgeがないから。
これで解決:
if (window.navigator?.setAppBadge) {
window.navigator.setAppBadge(100);
}

Q. PWAの時だけ、userページでエラーがでる
- 個別ページでerrorが: #PWA 通信が重い? #未ログイン #ログイン
- 一覧ページで描画されない: #PWA 通信が重い? #未ログイン

ふつうにMacのlocalブラウザで見てもエラーでてましたw

親でエラハンすると影響範囲(修正範囲)がでかいので、子でしようね。
const useRoomsHeads = ({ user }, { onSuccess } = { onSuccess: () => {} }) => {
const SWR = useSWR(user ? `/roomsHeads?where=[${where}]` : null, {
onSuccess: (data) => {
console.log('[FData]:', data)
onSuccess(new RoomsHeads({ data }));
}
});
const { isMutating, trigger } = useSWRMutation(user ? `/roomsHeads?where=[${where}]` : null,
(path: string, { arg }: any) => arg()
);
return {
SWR,
rooms: SWR.data && new Rooms({
data: SWR.data,
isMutating,
trigger
})
};
};
// x: where: string
export const useRoomHeads = (userId, user = mine) => {
const [room, setRoom] = useState();
const { rooms } = useRoomsHeads(`["members", "array-contains", "${mine.id}"]`, {
onSuccess: (rooms) => {
const room = rooms.findBelongingTo(userId);
setRoom(room);
}
});
};

Q. TwitterのWebViewは問題ないが、LINEのだと 謎エラーで画面サワレナイ
- よくみるとuserAgentに "LINE" という文字が
- Xにはそんなのない
mac chrome:
Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1

Q. mobile環境のみでエラーが
TypeError: Right side of assignment cannot be destructured
Q. なぜeslintやtsが弾いてくれない?

solution:
export const useUser = (id, { onSuccess }) => {
export const useUser = (id, { onSuccess } = {}) => {

Q. AndroidのWebviewやブラウザでどうも trueかundefined(おそらく後者)になってしまっている
以下のように修正してみる
- setIsPWA(window.matchMedia('(display-mode: standalone)').matches);
+ setIsPWA(navigator.userAgent.match(/iPhone|Android.+Mobile/) && !window.matchMedia("(display-mode: standalone)").matches);