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

iPhoneアプリは、そんなに自由に作れない

iPhone開発一般 雑感 iPhone技術情報

iPhoneは、DarwinをベースにしたiPhone OSで動作するコンピュータです。iPhoneの基本システムを構成するソフトウェアは、バックグラウンドプロセスと動作しており、そのあたりは、一般的なコンピュータと大差ありません。そのためかどうかはわかりませんが、AppStoreのカスタマーレビューを見ていると、ふつうにPCでできることは、iPhoneでも当たり前にできるのではないかという誤解を持たれている方が、少なからずいらっしゃるように感じます。
iPhoneのアプリケーション実行環境に対しては、いくつか制約がかけられており、PCでは普通にできそうなことも、iPhoneアプリケーションでは実現できないことがあります。しかしながら、具体的にどういう制約があるのかについては、特に公表されているわけではないので、そこに誤解が生じてしまうのは、無理もないと思います。(開発者でさえ、申請してみて初めて問題に気付くこともあるくらいなので。。。)
とりあえず、私が認識している制約事項について、例を挙げて考察してみたいと思います。

バックグラウンドプロセスに関する制約

アプリケーションは、バックグラウンドプロセスとして常駐したり、子プロセスを作って起動したりすることはできません。
これは、有名な制約なので、説明は必要ないかもしれませんね。

次期OSで、バックグラウンドプロセスが解禁になるのではという噂もありますが、いろいろと考慮すべきことがあり、簡単には行かないんじゃないかと思います。例えば、バックグラウンドプロセスがメモリを喰いまくったり、暴走したりするようなことがあったらどうするのかなど。。。 iPhone OSにはswapがないので、いろいろと制御が難しそうですよね。。。

他のプロセスを終了させることはできない

過去の日記(プロセスをkillする機能について - The iPhone Development Playground)で説明していますが、他のプロセスを終了させるための関数を実行することは許可されていません。これに関しては、Safariを終了させる機能を持っているというアプリがあるので誤解されているものと思われます。
SysStats Liteにも、「Safariを終了できるようにしてほしい」という要望をいくつかいただきましたが、特定のプロセスを正確に狙って終了させることは、iPhoneでは不可能です。

ドキュメントに説明されていない機能を使ってはいけない

iPhone SDKには、開発者向けのドキュメントが付属していますが、そこに記載されていない機能は、原則として使用を禁止されています。審査の段階で発覚した場合は、リジェクトされることになります。
自分が作った部分ではなく、使用しているオープンソースのライブラリがこの制約に違反していてリジェクトされた例もあるようなので、注意が必要ですね。

Appleのロゴや、Appleが所有している画像を使用してはいけない

私の場合、SysStats Liteで、Safariやメールなどの標準アプリケーションのアイコン画像を使用して、リジェクトされた経験があります。
AppStoreでリジェクトされてしまいました。 - The iPhone Development Playground
その前のバージョンでは審査を通っていたので腑に落ちないところはありましたが、本来禁止されているものであれば、それに従うべきと判断し、修正して再提出しました。

ユーザを誤解させる可能性のある、OSやデバイスに対する不的確な診断(diagnostics)情報を提供してはいけない

これは、SysStats Liteへのご要望が多かった「メモリ解放機能」に関わるものです。
過去の日記(Malloc Simulatorはリジェクトされました。 - The iPhone Development Playground)でも、リジェクトされたときのことを説明しています。
OSの非公開な内部動作の副作用を利用した実装が問題になったと理解しています。
たしかに、意図的にSafariやメールなどのアプリをクラッシュさせる可能性があるようなアプリを、Appleが認めるわけはないですよね。さらに状況によっては、OSの重要なプロセスをクラッシュさせてしまう可能性もあるわけで。。。

でも、「メモリ解放機能」とか「Safariを終了させる」みたいな機能をユーザが求めているのは事実だと思います。
今後のOSバージョンアップ時に、iPhoneとして本来あるべき形で、標準機能として組み込まれるとありがたいですね。


上記の制約事項の中には、違反していても、審査でたまたま発覚しなければリリースされるものもあります。でも、次のアップデートの時の審査で発覚してリジェクトされると、以下の二者択一になります。

  • その機能を削除して再申請する
  • アップデートをあきらめて放置する。

前者は、場合によっては機能ダウンになりこともあります。後者は、アプリの将来がなくなるということになります。いずれもダメージは大きいので、開発者としては注意して臨みたいところです。

あと、この内容が、ユーザのみなさんにもご参考になれば幸いです。