Adamが「Apple、32ビットiOSアプリを廃止へ」(2017年5月15日)で説明したように、Appleは32ビットアプリへの締め付けを徐々に強化してきました。まず、新デバイスに64ビットプロセッサを導入し、次に新規に提出されるアプリに64ビット「スライス」を含めることを義務付け、さらに32ビットスライスを含まないアプリの提出を許可し、そして今では32ビット専用アプリは将来のシステムでは動作しないという警告をユーザーに出すようになりました。お気に入りの古いアプリが消滅の危機に瀕しているのを目にすることもあるかもしれません。そして、なぜ開発者が64ビット対応にアップデートしてアプリを存続させないのかと疑問に思うかもしれません。
App Storeにこのアプリが掲載されなくなった場合、その答えは明白です。開発者はAppleに年間99ドルの会費を支払っていないため、アプリのメンテナンスを積極的に行っていないのです。しかし、Apple Developer Programのアクティブなメンバーであっても、古いアプリを64ビットにアップデートするのは簡単ではありません。確かに、64ビット対応にしてアプリを再コンパイルするのは通常は簡単です。しかし、アプリプロジェクトを開いて最新バージョンのXcodeでコンパイルすると、Appleの最新のシステムソフトウェア開発キット(SDK)にリンクされます。これによって状況は一変します。最新のシステムはiOS 10ですが、アプリはiOS 10に対応していない可能性があります。
TidBITS News の復活— 先ほど iOS 10 向けにアップデートした TidBITS News アプリを例に挙げてみましょう。このアプリは最後に iOS 6 SDK を使ってコンパイルされました。では、どのようにして iOS 7、8、9、そして 10 でも動作し続けることができたのでしょうか?基本的に、デバイスのシステムが TidBITS News を大いにサポートしてきたのです。つまり、iOS 6 を装っているのです。古い TidBITS News アプリと新しいアプリのスクリーンショットを並べてみると、その違いがよく分かります。
左側は、iOS 10で動作しているTidBITS News 1.5ですが、iOS 10アプリには見えません。黒いステータスバーが別個に表示されています(日付表示の背後には黒い麻織りの背景が見えますが、これはAppleが何年も前に廃止したものです)。これはiOS 10でiOS 6をエミュレートしているものです。右側の新しいTidBITS News 2.0アプリと比べてみてください。
iOS 10 アプリには透明なステータスバーがあり、その背後にはグラデーションの背景色を持つナビゲーションバーが伸びています。(その他のインターフェースの変更については後ほど説明します。)
アプリの見た目は、私たちにとっては些細な問題です。iOS 10 ネイティブアプリとしてコンパイルして実行するには、TidBITS News はiOS 10 で話さなければなりません。技術的には、iOS 10 アプリケーションプログラミングインターフェース (API) を採用する必要があります。つまり、アプリがランタイムと対話する方法です。iOS 6 以降、その仕組みは裏で大きく変わりました。だからこそ、開発者向けの私の著書「Programming iOS 6」の出版後、その後 4 版 (「Programming iOS 7」など) を執筆しなければなりませんでした。
したがって、TidBITS News を復活させるには、あたかも今同じアプリを iOS 10 のやり方で作っているかのように、実質的にコードを一から書き直さなければならなかった。幸いにも、TidBITS News はかなり小さくてシンプルなアプリで、「シーン」はたった三つしかない。マスタービュー (記事の見出しと宣伝文の一覧)、詳細ビュー (完全な記事 1 つ)、そしてプレーヤービュー (記事の録音版を聞くためのもの) だ。しかし、もっと手の込んだアプリを想像すると、開発者が古い 32 ビットアプリを 64 ビット用に作り直そうとしない理由が理解できるだろう。それだけの労力をかける価値がないかもしれないからだ。(さらに、Apple がすべてのアップデートを無料で提供することを強制しているという事実は、既存ユーザーからの収入が全くないことを意味する。
アプリが放置されるのも不思議ではないだろう。)
この記事の残りの部分では、iOS 10のTidBITS NewsアプリがiOS 6版とどのように異なるのかを説明します。もし技術的な詳細に興味がなければ、新しいTidBITS Newsをダウンロードして試してみてください。開発者でなくても、iOSがわずか4年でどれほど変化したかを示す興味深い事例として、この記事を読んでいただけるかもしれません。
言語— iOS 6 のプログラミング言語は Objective-C でした。iOS 8 で Apple が Swift を導入したことで、私は TidBITS News を Swift で書き直すことにしました。Swift を使うことで、アプリのコードが格段に読みやすく、メンテナンスも容易になったからです。Objective-C の熱烈なファンの皆さんには申し訳ないのですが、Swift の方がずっとエレガントで読みやすいと感じています。
欠点としては、Swift に切り替えるとアプリのダウンロードサイズが大きくなります。Swift アプリには Swift 言語全体を含める必要があるためです。Swift はまだ Objective-C のようにデバイスのシステムに組み込まれていません。
Split View — iPhone では、TidBITS News アプリはナビゲーションインターフェースです。マスタービューのみが表示され、見出し/概要リストをタップすると詳細ビューに切り替わります。iPad では、TidBITS News は Split View として表示され、両方の「シーン」が左側にマスタービュー、右側に詳細ビューとして表示されます。
iOS 6 では、Split View は iPad 専用のウィジェットでした。つまり、TidBITS News は実質的に 2 つのアプリを 1 つにまとめたもので、全く異なるインターフェースと、それらを処理するための 2 つの異なるコードセットを備えていました。
現在、Split ViewはiPadとiPhoneの両方にネイティブで搭載されています。iPhoneの小型化に対応するため、Split Viewは自動的に折りたたまれ、以前のナビゲーションインターフェースと同様の外観と動作を実現します。この変更により、書き換え作業は簡素化されましたが、あらゆる状況下でSplit Viewの外観と動作を正しく維持するのは非常に困難であることが判明しました。
プレーヤー— iOS 6 の TidBITS News アプリは、MPMovieController というウィジェットを使ってオンラインで録画された記事を再生します。Apple はこのウィジェットをしばらく前に廃止し、AVPlayerViewController に置き換えました。
この変更により、プレーヤービューの表示をより細かく制御できるようになりました。以前は、どうしても消せない醜いQuickTimeロゴが表示されていましたが、そのロゴも消えました。iPhoneではプレーヤービューが画面を覆い尽くしますが、iPadではやや内側に収まり、インターフェースの残りの部分がその背後に暗く見えます。大画面では、この方がずっと目立たないと思います。(ユーザーはプレーヤー自体を全画面表示にすることもできますが、私からのアドバイスは「やめた方がいい」です。もし私がそれを阻止する方法を見つけられたら、そうしていたでしょう。)
iPad 分割画面-- さあ、2010 年に私が初めて TidBITS News を執筆したあの平和な日々に思いを馳せてみよう。その原始的な時代、開発者たちは魔法の数字を崇拝していた。320 だ。iPhone の幅は 320 ピクセルで、それは不変の事実だった。あまりにそうだったので、私は実際にそれをアプリにハードコードしてしまったほどだ。iPad もまた、サイズが 1 つしかなく、分割表示のマスターディスプレイも幅 320 ピクセルだった。つまり、iPad のマスターディスプレイは、iPad の中に iPhone が 1 台入っているようなものだった。
Appleが長年にわたりハードウェアを拡充するにつれ、iPhoneの画面は横幅が広くなり、iPadは大型化しました。それだけでは十分ではないかのように、iOS 9では分割画面モードが導入されました。これにより、最新のiPadでは、別のアプリのインターフェースを右側からスライドインできます。分割画面のサイズを変更して、2つのアプリを同時に画面に表示させることも可能です。私にとって、この機能への対応は書き換え作業の中で最も困難な部分でした。実際、あまりにも大変だったので、この機能を完全に無効にすることを検討したほどでした。(アプリバンドルのシステム設定には、この機能をオフにするスイッチがあります。)
難しさは2つあります。まず、デバイスと分割のサイズに応じて、アプリはiPadアプリからiPhoneアプリへとリアルタイムで変化し、ユーザーが分割を解除すると再びiPadアプリに戻ります。次に、アプリが採用できるサイズ、特にアスペクト比の範囲が非常に広く、非常に縦長で細長いものからほぼ正方形のものまで、多岐にわたります。この変化は、分割ビューのマスタービューの幅がさらに広がることを意味します。
したがって、モダンなアプリのインターフェースは、こうした変化に対応できるように設計する必要があります。私はなんとかそれを実現できたと思っていますが、正直なところ、完全に確信しているわけではありません。Appleがこの機能を導入しなければよかったのにと思います。
決定、決定— その他の設計変更は、多かれ少なかれ選択的な手術でした。
- Dynamic Type を採用したかったため、マスター ビューの見出し/宣伝文の表示フォントを変更しました。フォント サイズは、[設定] > [表示と明るさ] > [テキスト サイズ] の設定によって異なります。
- マスタービュー上部にあったRSSフィードの最終更新日時を示すラベルを削除し、画面スペースを広く使えるようになりました。マスターテーブルを下にスライドして更新コントロールを表示すると、この情報が表示されるようになりました。
-
詳細表示では、記事のタイトルが上部に静的に表示されるようになったため、記事本文をスクロールしながらでも、何の記事を読んでいるのかが分かります。(タイトルが下方向にオフセットされている理由は複雑です。タイトルはタップ可能なリンクですが、Apple はナビゲーションバーのボタンのタップ可能領域を下方向に拡張しているため、タイトルをタップしようとした際に、タイトルがナビゲーションバーにぴったりと収まっているにもかかわらず、誤ってボタンをタップしてしまったのです。)
-
iOS 6の詳細ビューでは、記事のコンテンツがUIWebViewで表示されます。現代の類似物はWKWebViewです。UIWebViewはまだ存在しますが、Appleによる開発は終了しているため、ここではWKWebViewを採用することにしました。違いは分からないと思います。
-
詳細表示でリンクをタップすると、以前は Safari に急に切り替わっていました。これは残念なことで、おそらく意図せずして TidBITS News アプリから抜け出してしまうことがあったからです。iOS 9 では SFSafariViewController が導入され、Safari のプロセスを別のアプリの中に埋め込むことができるようになりました。私は今、その機能を採用しています。(ただし、3D Touch 搭載デバイスでリンクをプレビューすると、Safari に切り替わってしまうことがあります。これは今後のアップデートで変更したいと思っています。)
-
iOS 6 版の主要機能の一つが、実はiOS 10 版にはない。それは状態の保存と復元だ。TidBITS News を起動し、別のアプリを使うためにバックグラウンドにし、後から戻ってきたら iOS が TidBITS News をバックグラウンドで終了させていた、というような状況でなければ、これは問題にならないだろう。理想的な世界では、中断したところからすぐに再開できるので、このようなことが起こったことにも気づかないはずだ。しかし、新バージョンでは、iOS が TidBITS News が使用していたメモリを回収することにした場合、以前読んでいた記事に戻ることはできない。その代わりに、アプリは最初から始め、インターネットに接続してフィードの新しいコピーを取得し、今最初の記事となっているところから読み始める。幸い、TidBITS
News は比較的小さいので、ほとんどのアプリに比べてメモリから消去される可能性は低い。将来のアップデートで、状態の復元機能を再び追加できればと思っている。
ぜひお試しください! — 私は TidBITS News アプリが大好きです。TidBITS を読むのに欠かせないアプリです!それと同じくらい重要なのは、iOS アプリの標準アーキテクチャの基本的な側面を数多く説明してくれるので、教材としても活用しているということです。ですから、このアプリを使い続けたいと思い、新しい 64 ビット体制によって消滅の危機に瀕していることを言い訳にしました。
以前の TidBITS News アプリが使いにくかったと感じた方は、ぜひ新しいバージョンをお試しください。無料ですし、私がメンテナンスを続ける限りは無料のままです。