Electronで自分のIPアドレスをLAN内のiPhoneに通知するには
背景
iPhone 6sを発売日に手に入れたものの、子育てに追われる日常では なかなか触れません。
そこで、なんとかこの状況を打破すべく、Electronの前進のAtom Shellの頃から、試作している なんちゃって知育ソフトのリモコンにiPhone 6sを使えないか?
知育ソフトの開発ならうちの奥さんからも大目に見てもらえるので、堂々と家の中でiPhone 6sを触ることが出来ます。
さらに、iPhone 6sの目玉機能の3D touchもJavaScriptで使えることがわかっているので、 WebSocketでiPhone 6sとElectronを繋いで、iPhone 6sでElectronをリモート操作出来るのでは
そんな訳で、
が出来た訳。が、ちまちま、ローカルのElectronの中で動かしているSocket.ioサーバーのIPアドレスを 手元のiPhone 6sに打ち込むのは面倒くさいし、スマートなイクメンにはあるまじき行為。
ローカルのIPアドレスを取得する
node.jsでローカルのIPアドレスを調べるモジュールいくつかあったが、NICが複数な環境のこと考えて無さそうなので、こちらも自作した。
個人で手軽にIPアドレスをiPhoneに送る
通知センターを使って、iOSネイティブアプリを作れば、通知出来るのだろうけど、もっと手軽に実現したい。
まっ先に思いついたのはQRCodeの利用だったが、どうもGoogle ChartではDeprecated扱いだし、そもそもiOSの標準アプリではQRCode読めず、 iOSのライブラリは用意されているが、El CapitanからはBrew Sparklingでお金払わず、自作アプリをiPhoneにインストール可能になったとは言え、ちょっと大げさ。
もう少し手軽に出来ないものかと、思い付いたのが、Message.appでURLを送る。
案の定ググるとStackOverflowが紹介され、AppleScriptからメッセージを送れることが 判明。
NodObjCではCocoa API経由でAppleScriptを実行できるので、これは というモジュールをES6あたりで追加されたtemplate機能を使い、
https://github.com/kjunichi/node-messagesapp
というモジュールを自作した。 いい年して、恥ずかしい実装なので、npmには教えない。
これらのモジュールをElectronで動かせるようにする
ローカルのIPアドレス取得モジュールは内部的にピュアJS実装なので、そのまま利用可能だが、 node-messagesappモジュールは内部的にnode-refとnode-ffiがネイティブコードを使っているため、 Electron向けにビルドしなおす必要がある。
./node_modules/.bin/electron-rebuild
まとめ
- iPhoneをデスクトップPCのリモコン的に使う際に簡単にIPアドレスをiPhone側に通知することが可能になった。
- LAN内というキーワードのタイトルなのに、手段としてはインターネットでお外の世界を経由している。
- OSX以外は別の方法を考えないといけない。
- ログインしているユーザーのメールアドレスとかiCloud周りのAPIなんかで取得出来ないものかなぁ。
- まぁ、別にマルチプラットフォームなフレームワークを使ってるからと言って自プロダクトもマルチプラットフォーム対応しなければならないというこもないかぁー
関連記事
- JavaScriptをDockerを使って黒い画面に表示する
- ElectronでWebGL(three.js)使ってデスクトップマスコット作った際に分かったこと
- lisp版ElectronのCeramicを動かした
- node-ffiをGoで入門してElectronを使って応用してみる]()
- Electronで自分のIPアドレスをLAN内のiPhoneに通知するには
- ElectronはHTTP2が喋れないのか?
- WebGLを使ったElectronアプリをTravis CIで動かすまで
- goroutineを使って高速にLAN内の*.localなホスト名の一覧を取得するツールを作った