読者です 読者をやめる 読者になる 読者になる

non vorrei lavorare

ブログ名の通りです。javascript three.js mruby rust OCaml golang julialang blender

Electronで自分のIPアドレスをLAN内のiPhoneに通知するには

パソコン・インターネット
残念ながら今年の保育園での運動会は雨のため中止になり、園のなかで、子供たちが練習を重ねたダンスの披露のみとなりました。次男のクラスは、ダンスの披露はなかったのですが、兄のクラスにちゃっかり紛れ込んで、しばらく次男もダンスに参加していました。体調悪く、とても例年の参加型のハードな運動会では体がもちそうになかったので、内心、ホッとしていたkjunichiです。
 

背景

iPhone 6sを発売日に手に入れたものの、子育てに追われる日常では なかなか触れません。

そこで、なんとかこの状況を打破すべく、Electronの前進のAtom Shellの頃から、試作している なんちゃって知育ソフトのリモコンにiPhone 6sを使えないか?

知育ソフトの開発ならうちの奥さんからも大目に見てもらえるので、堂々と家の中でiPhone 6sを触ることが出来ます。

さらに、iPhone 6sの目玉機能の3D touchもJavaScriptで使えることがわかっているので、 WebSocketでiPhone 6sとElectronを繋いで、iPhone 6sでElectronをリモート操作出来るのでは

そんな訳で、

kjunichi/electron-3dtouch

が出来た訳。が、ちまちま、ローカルの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なんかで取得出来ないものかなぁ。
  • まぁ、別にマルチプラットフォームフレームワークを使ってるからと言って自プロダクトもマルチプラットフォーム対応しなければならないというこもないかぁー

これに似たテイストの記事