こんばんは! 今回は、Webアプリの謎のフリーズの原因を探るべくメモリの使用状況のログを取ろうといろいろと調べていたのですがJavaScriptだとなかなか辛かったという話です。
やりたかったこと
- SwiftでWkWebViewを生成
- WkWebViewでレンダリングするAngularアプリ側からメモリの使用状況をconsole.log()させたい
結論
- WkWebViewにメモリを取得する実装がないため無理でした🤣
- Swiftからなら端末のメモリを取得することは可能
断念までの道のり
手段① process.memoryUsage()
ヒープサイズを取得するメソッドです。 Node.jsのドキュメントからの引用ですが、下記のような値を取得できます。
console.log(process.memoryUsage()); // Prints: // { // rss: 4935680, // heapTotal: 1826816, // heapUsed: 650472, // external: 49879, // arrayBuffers: 9386 // }
しかしながらAngularの場合はprocess
がそもそも存在しない環境なので動きませんでした。
手段② performance.memory
performance.memory.usedJSHeapSize
で使用中のヒープサイズ、
performance.memory.totalJSHeapSize
で割り当てされたトータルのヒープサイズを取得できます。
こちらはブラウザから動作しましたが、ブラウザにより実装にバラつきがあります。 ほんとWebアプリ開発ってブラウザの違いで苦しむこと多いですよね…。
MDN Web DocsによるとApple製ブラウザやFireFoxは動作しない模様。 今回の要件であるWkWebviewも実装がない為、動作しませんでした…惜しい…。
あとがき
色々な理由でSwiftにメモリ取得のコードは書きたくなかったのですが、今回は素直にSwiftでメモリ使用量を取得する方法で妥協することにしました。
SafariのUserAgentの固定化の動きもそうですが、Webブラウザはユーザーを特定するような情報は取得できないようにしようという思想が見えるように思います。端末に関わる情報を取得するのであれば、やはりネイティブ寄りの実行環境に軍配が上がるようです。