ラベル iOS の投稿を表示しています。 すべての投稿を表示
ラベル iOS の投稿を表示しています。 すべての投稿を表示

2010-08-10

ブロックを使うとiPhone OS 3での動作は不可能ということを再度確認

個人的にはiOS 4以前のコードは書かないことに決めていますが、そうはいってもお仕事です。未だにiPhone OS 3向けのビルドも作ってます。でも一度ブロックの使いやすさを味わってしまうと、もうなんか使いたくって仕方のない状態。なんならiOS 4専用の部分だけでも条件分岐を入れてブロック使わせてもらっていいかな?という検証。

結論:ブロックを使ったコードがバイナリに含まれているとdyldのリンクエラーで起動すらしません。


Tue Aug 10 12:48:26 unknown UIKitApplication:xxx[0xd506][2007] : dyld: Symbol not found: __NSConcreteStackBlock
Tue Aug 10 12:48:26 unknown UIKitApplication:xxx[0xd506][2007] :   Referenced from: /var/mobile/Applications/5DBA5BE0-0517-4ABB-AF15-C4006334BF74/Xxx.app/xxx
Tue Aug 10 12:48:26 unknown UIKitApplication:xxx[0xd506][2007] :   Expected in: /usr/lib/libSystem.B.dylib

まぁ、自分のアプリケーションだったらコードもコントロールできるけど、使っているライブラリなんかがブロック使い出したら、iPhone OS 3向けのビルドはもう作れないと言うことですな。

2010-07-28

駅ベル - 1.1.0 バージョンアップのポイントをまとめました


  • 駅までの距離に従い、精度を上げるようにした
    • アラームが正しく動作する率がアップ
    • 目的地まで遠い場合にはバッテリーの持ちアップ
  • iPodで音楽再生中にも、ちゃんとアラームが鳴るように
  • バックグラウンドでも、正しく音が鳴るように
  • バックグラウンドでも、バイブレーションが動作するように
  • 設定画面を追加
    • アラームの音を変更可能に(4種類内蔵)
    • バイブレーションを選択可能に(iPhoneのみ)
    • アラーム開始距離を変えられるように(右図)
  • iPhone 4 Retina Display対応(持ってませんが)

実は今回の一番の見所は、内部のロケーションマネージャの使い方を1から見直して、完全に新しい実装で書き直しました。本当に最小限の必要としている部分でしかロケーションマネージャーを使わないように細かいチューニングを行ったので、バッテリーの持ちは前のバージョンよりもかなりよくなっています。使っているときはステータスバーのロケーションインジケータが出るので、画面ごとに出たり消えたるすることで確認できると思います。

ロケーションマネージャについては、iOS4のマルチタスキングの売りの一つだけに、バッテリーの持ちとの新たな戦いの部分、別エントリーで書きます。

駅ベルのバージョンアップでリジェクト食らいました。その顛末。

今回の駅ベルのバージョンアップは、バックグラウンドで音が鳴らないという部分の対応。UILocalNotificationに任せておけばいいかなと思ってたんですが、ちゃんと音が鳴って欲しいという要望が強く、対応することに。

長いWaiting for reviewの期間を過ごして、なんといきなりリジェクト。その理由がこれ。
We've completed the review of your application; however, because no audible content is played when the application is in the background, we cannot post this version to the App Store. We have included additional details below to help explain the issue. We hope you’ll consider revising and resubmitting your application.
iOS4向けのマルチタスキング対応アプリケーションの一つの機能、バックグラウンドでの音声再生機能を使いたいためにフラグを付けたんだけど、それが裏目になった模様。おまえのアプリケーションは音を出して内じゃないか、と。ふーむ。

そりゃぁ、カリフォルニアではまだ鳴らないっつーの(笑)。どうもアプリケーションの動作を正しく理解してもらえてない模様。普段なら慌てるところですが、どうせ自分のアプリケーション、落ち着いて対応してみました。一度Rejectedになっちゃっているので、バイナリを再度アップロードしないでも再審査してくれるか不明だったので、ちゃんと行くかどうかのテストケースになります。

いろいろ騒ぐ前に、まずはちゃんとレビューチームとコミュニケーションを開始することが一番です、と言うアドバイスももらったので、まずはメール。

Dear review team,
My application uses audio to notify user as alarm sound. My application has to play sound in background mode, and I have no idea without adding "audio" flag. 
The Apple engineer I met at the WWDC Lab said, only way to play sound is to add "audio" flag in UIBackgroundModes. If still you reject my app, please tell another way to play alarm sound in background. I think that's not fair.
- My app plays audio when the device close to the station.
- Playing audio in background needs "audio" flag in UIBackgroundModes.
Other audio application can be paused. My application is also paused until it reaches to destination, isn't it?
Please re-think about this.
Yosuke Suzuki
で、その晩はMOSA entranceがあったので、その場でリジェクトくらったーとネタにしてたりしていたんですが、裏ではことが進んでおり、今朝になってメールが届いてました。

Thank you for you email and clarification.  We are proceeding with the review and will update you with further status as soon as we are able.
Thank you for your continued patience.
短い。あまりに短いが、そしてアメリカ人、決してわびの言葉はないが、ちゃんとスムーズに対応してくれました。
無事にリリース。

教訓。リジェクトされても慌てず騒がず、ちゃんとレビューチームとお話しはしましょう。返事もくれます。他の「Contact us」系のメールと違ってスムーズです。


2010-06-24

駅ベル - 乗り越し防止アラーム

iPhone 4で盛り上がる中、ようやくバスケ個人名義の最初のアプリ。「駅ベル」が公開されました。

http://itunes.apple.com/jp/app/id377891789?mt=8 #iTunes

駅ベルとは何か?簡単に言えば、目的の駅に近づいたらアラームを鳴らしてくれるソフトです。全国の駅情報をekidataさんからいただきましてアプリ内に最初から収めてありますので、簡単に目的地を探すことができます。

そして、なんと言ってもiOSの各種機能に対応しています。Fast App Switchはもちろん、iOS4の目玉、マルチタスクにもちゃんと対応しています。バックグラウンドにいても監視は続けますので、ウェブをみたりゲームをしていても大丈夫です。Local Notificationを使ってアラート画面が表示されます。iOS 4で追加された新しい位置情報取得の仕組みを使っているので、これまでのアプリよりもバッテリーの減りも少なくてすんでます(それでも結構使いますが)。バックグラウンドに回ったときの挙動も、WWDCで学んだことは実践してますので省メモリ化もできているはず。

このアプリ、SDKが公開された2年前から作り始めたモノで、なかなか完成しなかったのです。だって監視している間アプリを終了させられないわけで、できることと言えば音楽を聴くことだけ。電源をスリープにしてしまうと、位置情報の精度がまったく当てにならず。アプリ内にブラウザを入れたりTwitterみれるようにしたり、いろいろ工夫してみたんですがどうもしっくりこず。

が、iOS 4になってアプリを後ろに回せるようになったことでがぜん盛り上がりました。ちゃんと位置情報もバックグラウンドにいながら取得できるわけで、これはオレのためのアップデート!wと勝手に理解して一気に仕上げました。と言うわけで無事iPhone 4の発売日にリリース。

しかし、長かった〜。リリースまで2年3ヶ月は自分の中でも最長記録。この二年間、各所でデモなんかをしてましたが、会う人会う人に、あれまだ出てないの?となじられてきましたが、それも今日まで。胸を張ってリリースされてます!と言えますよ。でましたよ!

2010-06-17

iOS 4のマルチタスクへの対応

前のポストで、そもそもiOS 4に対応するフェーズをまとめました。で、iOS 4に対応するとした場合、どの機能に対応するとどうなるかをまとめます。


高速アプリ切り替え
SDK 4.0でビルドすると自動的に対応します。ただし、マルチタスク自体のアプリとしては、裏に回ったときの正しい作法というものがありますので、それに従った動作が求められます。


バックグラウンド・オーディオ
Info.plistでバックグラウンドでの再生を希望する旨を記述しておくと、バックグラウンドに回った場合の音の再生処理が継続して行えます。アプリ側で特別にやらなくてはいけないことは増えませんが、メモリの使い量、I/Oの使い方など工夫しなくてはいけなくなると予想されます。

Voice over IP

Info.plistでVoIPを実装したいと記述しておくと、インターネット電話を実現するために必要な待ち受け接続への対応をシステムがやってくれます。起動し続けなくても、必要なときに起こされます。標準の電話アプリと同じような立ち位置になれると言うことです。実装は大変でしょう。

バックグラウンドロケーション
Info.plistでロケーションを取得したいと記述しておくと、バックグラウンドにいるときも位置情報を取得できるアプリが作れます。バッテリーのことを考えると一番やっかいな種類のアプリです。

タスクの完了待ち
これら上記の特定用途のマルチタスク機能と関係なく、すべてのiOS 4対応アプリは、バックグラウンドに回る前に一定期間の猶予が与えられます。まだ仕事完了してないよって場合には、ブロックで処理を記述して実行させることができます。この処理が終わるまでサスペンドはされません(見た目上バックグラウンドに回ったことにはなります)。一定時間を過ぎてもタスクが終わっていない場合、システムのやつは勝手に殺すぞと言ってますので気をつけましょう。

ローカル・ノーティフィケーション
上記のバックグラウンド処理がユーザーに通知するUIとしてローカル・ノーティフィケーションが追加されてます。

これ以上の詳しい情報は、iPhone developer登録をすればドキュメントで見れますので、各自調べること。

iOS 4への対応の仕方まとめ

未対応iOS 4テスト済みiOS 4対応
ビルドするSDK※1~ SDK 3.2~ SDK 3.2SDK 4.0 ~
iOS 4で動作するか?わからんするする
OS 3.1で動作するか?するするする※2
バックグラウンドで動作しないしない可能※3
サスペンドするか?しないしないする
アプリ切り替えリスト※4に並ぶ並ぶ並ぶ並ぶ
高速アプリ切替非対応非対応対応


※1 Base SDKのこと
※2 Deployment TargetがiPhone OS 3.1以前になっていれば
※3 追加で設定、コードの記述が必要
※4 マルチタスク切り替えのために画面の一番下に出るアプリのリスト