Timerクラスとバックグラウンドの面倒
ま、やっぱり私がすることだもんなぁ、そんなに上手く行く訳がないさ。
テストしていた孤立校舎のチャイムアプリ、バックグラウンドに回ったら動かないことが判明。
え?と思って調べたら、そうか、Timerを使っている限り避けられないのか、と今更になって納得。 簡単にいうと、このクラス、アプリがバックグラウンドに回った途端に動作が止まるしまう仕様なのです。
以前AppleWatchのアプリでも苦労したにもかかわらず、再びドツボにはまったのかと、自分の思慮と知恵の浅さに呆れるばかり。
そもそもなんでswiftというかAppleのOSはことごとくバックグラウンドでのアプリの動作を制限したがるのかというと、単なる横着とは責められない面もあります。 曰く、バックグラウンドでフォアグラウンドと変わらない動作を提供すると、例えばキーロガーなんてのがこっそりやりたい放題になる、つまりはセキュリティ思想が元になっています。
とはいえ、多くのmacOS市販アプリは裏に回っても普通に動いていますから、当然回避策はあります。 ただ、ネットで出てくる対策は、対象がiOS,macOS曖昧で、かつ非常に難解。
そこでポンコツな私は思案した。
このチャイムアプリは私の勤めるたった一つの校舎のたった二つの教室でしか使われません。 しかも使用するのは教師のみ。(最悪私のみ) 一方で、すでに授業は始まっており、完璧を求めて長い時間を費やしている場合ではありません。
しかも今はXcodeからAppStoreを経由せずともローカルでアプリの生成が可能。
そうだ、クソで良いんだ。
いや、良い訳ないんだけど、良いのだ。
そう決めたら、話は早い。
Timerを使わず、while(repeat while的なもの)で毎秒時間を拾い、条件が合えばチャイムを鳴らすように改造。 えっ?と思われたそこのあなた。 プログラムのエキスパートですね。
そうです。 whileは無限ループへの近道と要注意の超初心者技法。
確かに一旦動き出すと、チャイムに関しては期待通りの働きをするものの、レインボーカーソルぐるぐる、quitも含めて後は一切の入力を拒否します。 つまり明確に無限ループしてる、と。
ただ、それを予想してこちらも速度制限目的のsleep()を一秒毎にかませたため、cpuの限りループすることはなく、半日稼働させてもアクティビティモニターでcpu/メモリ負荷共、全く問題はないことを確認。
アプリの終了すらできないので、Command + option + escで強制終了するしかありません。
でもきっちりと期待した通りにチャイムは鳴っている。 仕込んだイースターエッグも息災だ。
とりあえずはこれでええやん?
教員、下手すると私しか使わんやん?
コンピューターが人の役に立ってるやん?
ほんと、クソアプリでごめんなさい。
| 固定リンク
「iOS と Xcode」カテゴリの記事
- 一応Swift基礎勉強の成果かと(2020.07.01)
- あらら、macOS 11の波に乗れない(2020.06.24)
- コードを学ぼう 1 & 2の初心者解説完成(2020.05.15)
- Swift Playgroundsの◎(2020.04.21)
- Swift Playgroundsの○と×、そしてCatalistの?(2)(2020.04.02)
コメント
無限ループ、解決しております。
http://obalog.cocolog-nifty.com/obas_blog/2020/07/post-b95fa1.html
投稿: あやおば | 2020年7月 1日 (水) 14時19分