« このダブルタイマー | トップページ | こんなswift3本に出会った »

メトロノームwatchアプリ、開発終了

Xcodemessage

 ひょんなことで得たiOS開発時間、おかげさまで半年の間滞っていた自作AppleWatchアプリ"Beat on Wrist"の改良に取り掛かることができました。
 
 簡単に説明すると、AppleWatchを希望のインターバルで振動させるメトロノームプログラムを作ったのですが、AppleWatchの仕様で、画面スリープと同時に止まってしまいます。 これが、待ちに待ったバックグラウンド動作がWatchOSが3になって解決可能に?、と知ったのが昨年7月。
 このアプリ、どういう需要があるのか、今でも週に一〜二回程ダウンロードされているんですよね。 無償とはいえ、一応作者として、礼を込めて何とかしなければ、と思いつつ途中色々あってなかなかとりかかれなかったのが、ここで一気に解決、というか一旦の終焉を見ましたのでお知らせします。

 まずWatchOS 3でいうところのバックグラウンド作動というのは、コードではなく、Xcodeでのcapabilities>Background Modesのビルドオプションとして用意されています。 とりあえずはそれをONにしてビルドするも何も変わらない。 まぁ、そりゃそうでしょ。 そんなに世の中うまくゆくはずがない。
 
 ではどうするべ、と頭をひねると、上記Xcodeの設定に、オーディオ、AirPlayなどがバックグラウンド対応であることがわかり、であれば誰にも聞こえないような音量で音を流し続ければずっとアプリが動くのではないかと思いつきました。

 ところがここからがトホホswiftプログラマーの悲哀。 コードをどう書けば良いのかわからない。
 一応ネットで検索して貼り付けて見るも、そんなに世の中うまくゆくはずがない。 ネットのiOS関連記事にはまだobjective-C時代のものが多く残っているし、swiftにしても短い間に1から3までバージョンアップしているので、根本的にコードが間違っているのか、単なる書き方だけの問題なのか、基礎が欠落している私のような者には超難解な事態になっているのも一因です。

 ところが世の中、そんなにうまく行くこともたまにあって、新たにswiftを中心としたiOSアプリ開発の本とたまたま出会いました。 これについては別に書くとして、これを深夜バイトの時間にじっくり読み、まずはswiftの基礎を学び直し。
 それでも鳴らない。
 
 そんな中、先日学校で新学期ゆえの空き時間に備えて持参したMacBook Pro.で、ふと閃いて、コードを書く場所を変えて見たら、何と大正解。 いわゆるオブジェクト指向プログラムにありがちな、継承の問題だったようです。
 
 ここまで来たらしめたモノ。 といいつつ、端からAVAudioPlayerを使えばいいものを、何を勘違いしたかAVFileAudioPlayerを使ってしまったが故にループ再生で躓き、一晩無駄。 それでもXcode上のシミュレーターでちゃんと音が鳴りながらリズムも刻み続けることを確認。
 いやぁ、やりました>私 これでアプリの有料化ができる...
 
 ところがそんなに世の中うまくゆくはずがない。

 これをWatchに持って行くと、音は鳴るけどリズムを刻まなくなってしまっています。
 音とリズムが実機では共存できない?
 試しに override func didDeactivate() の部分に、つまり画面スリープに入ると同時に音再生スタートハンドラを入れて見ると、その悪い予感は正しかったようで、リズムは復活するものの肝心の画面スリープとなると、また鼓動が止まります。
 これじゃ元の木阿弥じゃん、としばらくあれこれ試すも解決せず、ふとXcodeのデバッグウインドウに何やらメッセージが出ているのを読んで見ることにしました。

 WKInterfaceDevice playHaptic has no effect when executing in an inactive or background application state

 「バックグラウンドでアプリが走っている間はHapticエンジンは動かないよ」
 
 ...なな、な〜んやそれ!
 
 つまり、確かにWatchOSが3になって、バックグラウンドでアプリが動くようになったけど、それは例えばiPhoneからの通知だったり、とにかく本来は注意を喚起するための振動なので、あらかじめ振動しているような私のアプリは想定外になっていることが判明、
 もっと簡単にいうと、待ちに待ったバックグラウンド対応はむしろ逆に私のアプリの息の根を止める仕様だった、ということです。
 
 ということで、これ以上自分でできることはなくなったので、このアプリ開発はこれにて終了。 とりあえず条件を整えれば数分間の間は画面が消えても動き続けるケースを見つけたような気もしますので、こちらを整理して終わりですね。
 
 いえでも、別に悔しいとか情けないとかの気持ちは不思議にありません。
 自分の中であれこれ改善案を考え、実際にその通りswiftのコードを書き、ソフトウエアシミュレーター上では解決したわけで、納得はできました。
 むしろこれで、今でも週に数回ダウンロードされている需要に対しての一定の説明ができるというものです。

|

« このダブルタイマー | トップページ | こんなswift3本に出会った »

iOS と Xcode」カテゴリの記事

コメント

 ありがとうございます、と同時に、ご希望通りのものが作れずに申し訳ありません。
 安定性を重視した最新(そして最終?)バージョンが間も無くアップデートとして通知されると思います。 新たな発見( or 不具合)があれば遠慮なくご連絡ください。

投稿: あやおば | 2018年1月10日 (水) 03時47分

メトロノームwatchアプリのBeat on Wristの開発、ご苦労様です。私もダウンロードした一人ですが、Apple Watchを使ってスポーツクラブのジムでテンポを取るのに使おうしましたが、腕を傾けてしまうと止まるのと、ジムでは音は出ない方がいいので、ワイヤレスイヤホンとペアリングするつもりですが、振動が止まっても音だけは出ているのか今度確かめるつもりでいます。まだ、ワイヤレスイヤホンを持っていないのと、Airpodsより良い物が出てきたので購入待ちです。

投稿: ファインディングニャン | 2018年1月 9日 (火) 20時48分

コメントを書く



(ウェブ上には掲載しません)




« このダブルタイマー | トップページ | こんなswift3本に出会った »