サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
猫
kimada.hatenablog.com
久しぶりに、MacPortsのupgradeを実行して、ハマったところがあったので、メモを兼ねて書いておきます。 makeがない?? まず最初は、初歩的な問題でした。 $ sudo port upgrade outdated .... Error: Unable to open port: can't read "build.cmd": Failed to locate 'make' in path: '/opt/local/bin:/opt/local/sbin:/bin:/sbin:/usr/bin:/usr/sbin' or at its MacPorts configuration time location, did you move it? ....これは、Xcode 4.3.xをインストールした後に、Command Line Toolのインストール*1をし忘れてたことによりま
今週は、iPhone 4Sの発売が控えていますが、開発者にとっては、もう1つ重要なポイントがあります。それは、iOSが、5.0にバージョンアップされることです。 SysStats MonitorとSysStats Liteでは、バージョンアップの影響を受ける部分があります。 過去に、2.2.1でビルドしたアプリから、3.0で追加されたAPIを使ってみました - The iPhone Development Playgroundで、メソッドが定義されているかどうかをチェックする方法を紹介しましたが、今回は、実行中のOSのバージョンをチェックするより他に方法がありませんでした。 簡単な処理ですが、そのチェック方法について、メモを兼ねて、書いておこうと思います。 NSString *currentSystemVersion = [[UIDevice currentDevice] systemVe
iOS5で、日本語キーボードの変換候補表示方法が変わったことに、みなさんすでに気付いていることと思います。 iOS4.xでは、以下のように、カーソルの近くに表示される仕様でした。 iOS5では、以下のように、変換候補の表示領域が固定で確保されるようになったので、画面の一部のボタンなどが隠れてしまうようになりました。 それに対応できるようにするために、iOS5から、キーボードの大きさが変わったことを、アプリで検知するためのNotification(UIKeyboardWillChangeFrameNotification)が新たに追加されました。 それを使って、隠れてしまう部分のサイズや、表示位置を調整する必要があります。 SysStatsMonitorで、その対応を実施中なのですが、その結果、以下のようになる予定です。 具体的なコーディングについては、以下の記事を参考にさせていただきました
SysStats Monitorには、Facebookにデバイスの状態を投稿する機能があります。 それは、Facebookが提供しているFeed Dialogというコンポーネントを使って実現しています。 Feed Dialog 具体的な画面のイメージは、以下の通りです。 本来ならば、画面上部のテキストエリア(Say something about this の下)に、 <> [Uptime]: 0 day(s), 12:17:38 [Memory(MB)]: free= 17.4, other=329.1, wired= 69.7, active= 53.9, inactive= 32.8 [Battery]: 85% [Process]: 39 という感じの情報が表示され、Facebookに投稿されるはずですが、ここに情報が設定されなくなっていることに気付きました。 調べてみたところ、原
昨年、iOSの中で、アプリケーション同士が連携するためのしくみ - The iPhone Development Playgroundで、UIDocumentInteractionControllerを使ったアプリケーション間連携について簡単に説明しました。そのときに少し触れたとおり、SysStats MonitorとSysStats Liteの間で、UIDocumentInteractionControllerを使った連携機能を追加しましたので、もう少し技術的な説明をしたいと思います。 処理の流れ 以下に、全体の流れを示します。 ここでは、以下の2つの目的で、UIDocumentInteractionControllerを使った連携を使用しています。 (1) SysStats Liteから、SysStats Monitorへのプロセスブックマークの移行 SysStats Liteで蓄積し
一般的なコンピュータは、物理的に空きメモリが不足すると、OSの判断で、メモリ上のデータを、スワップ領域に逃がして、空きメモリを供給しようとします。iOSの場合は、スワップ領域がないので、また異なった手法が取られます。 Out Of Memory Killerに似てるけど、もう少しやさしいiPhoneOSの空きメモリー制御 - The iPhone Development Playground また、過去に、iPhoneOS2.xの頃ですが、以下のようなことも書きました。 iPhoneのSafariがいつのまにか終了する条件 - The iPhone Development Playground iOS4になって、バックグラウンド化されるアプリが激増したことにより、少しやり方が変わったようなので、同じように、また調べてみました。 テストケースについて 今回は、以下の手順でテストしてみました。
AppStore経由でリリースされているアプリは、Appleによって定められたガイドラインを守ることが義務付けられていることは、みなさん周知の事実です。マルチタスキング環境となったといっても、「バックグラウンドに常駐させて好きなように振舞う」ということは許されていません。開発者の方であれば、知っていることですが、バックグラウンド処理は、以下のような目的に限定して許可されています。 オーディオコンテンツの再生 位置情報のトラッキング VoIPアプリケーション(電話等)のインターネット接続維持 例えば、SysStats Monitorのようなアプリが、常駐プロセスとして動作し、メモリ使用状況を定期的に記録するなんてことはできません。 また、そもそも通信機能が制限されているので、アプリ間で通信してリアルタイムに連携することもできません。 以上、「できないこと」ばかりを挙げて、ネガティブな感じにな
iOSでは、モバイルデバイスの限られたリソースや操作感を前提に、独自のマルチタスキング環境が実現されています。 ユーザから見たその特徴は、 アプリをすばやく切換えられる(Fast app switching)。 再度呼び出した時に、前回の状態が維持されいて、操作を継続できる。 と、いったところが大きいですね。 例えば、 メールの中のリンクをタップしてSafariを起動して、Webサイトを見る。 また、メールに戻る。 もう一度Safariで先程見ていたものを見る。 といった一連の動作をスムーズに行えるようにするような感じです。 でも、ここまではOS3.xでもできていましたよね。 iOS4では、こういう能力を、他の標準アプリや、AppStoreで販売される一般のアプリにも広げたのだと、私は理解しています。 ちなみに、どうやってアプリを終了させるの? という質問ヘの回答は「終了させる必要はない」
iOS4から、一部の古い機種を除き、マルチタスキングがサポートされるようになりました。それによって、アプリの切替が速くなったのはいいですが、反面、待機しているバックグラウンドプロセスが増えたことにより、メモリ使用量が増えたという問題があります。 そんな背景から、iOS4では空きメモリが少なくなることは日常的に起こることなので、その都度再起動して空きメモリを増やすというのは効率が悪く、面倒なことです。 では、iOS4からサポートされた、"First App Switching"は、どうでしょう? ホームボタンのダブルクリックで、「最近使ったアプリケーション」のアイコンリストを表示してくれます。 すでにご存知の方も多いと思いますが、このアイコンには、「アプリの切替または起動のためのショートカット」以外に、アイコンの長押し後表示される"-"をタップすることで、アイコンを削除するとともに、そのアプ
iPhoneの調子が悪いときに、システムを再起動することで問題が解決することが多いのは、みなさんがご存知だと思います。 iPhoneユーザガイドの226ページにある、「付録 A: サポートおよびその他の情報」の「iPhone を再起動する/リセットする」には、具体的な操作方法が説明されていますが、「電源オフ」→ 「電源投入」の流れを「再起動」と呼んでいるようです。 この「再起動」と「リセット」にはどのような違いがあるのかについて、考えてみました。 安全性について このユーザガイドの説明で、1つ気になるのは、以下の記述です。 iPhone の電源を切ることができない場合や、問題が解決しない場合は、iPhone のリセットが必要 な場合があります。 リセットは、iPhone の電源を切って入れ直しても問題が解決しない場合にのみ 実施してください。 これは暗黙的に、「再起動」の方が安全であること
かなり以前にハマったことがある内容ですが、たまたま思い出したのでメモを兼ねて書いておきます。 UITableViewControllerのサブクラスを使う場合、viewWillAppear:メソッドの中で、tableViewオブジェクトのreloadDataを呼び出すような実装を行うことが、一般的に多いと思います。 そのときに、インスタンスが生成されて最初の呼出しの時だけ、reloadが2回実行されてしまうことがあると思います。それはなぜでしょうか? 実際のコーディングでは以下の2パターンがあると思います。 パターン1 - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self.tableView reloadData]; } パターン2 - (void)viewWillAppear:(BOO
みなさんは、Linuxカーネルに備わっているOOM Killer(Out of Memory Killer)というものをご存知でしょうか? OOM Killer(Out of Memory Killer)は,システムが実メモリーと仮想メモリー空間(スワップ領域)を使い切り,必要なメモリー領域を新たに確保できない場合に,プロセスを強制終了させて空きメモリーを確保する,Linuxカーネルの仕組みです。OOM Killerは,空きメモリーが確保できないことによりシステム自体が停止するという最悪の事態を避けるために用意されています。 Linuxキーワード - OOM Killer:ITpro iOS4で、本格的なマルチタスク環境がサポートされるようになりましたが、3.x以前でも、Safariやメール、iPodなどの、標準アプリケーションは、バックグラウンド化されていたのは周知の通りです。 その頃か
iOS4から提供されているマルチタスク機能によって、アプリ実行中にホームボタンを押した時に、プロセスを終了させず、バックグラウンドで一時停止状態にすることができるようになっていることは、多くの方がすでにご存知だと思います。 PCとは異なり、バックグラウンドで一時停止状態になるのは、すべてのアプリではなく、開発者がそう振舞うよう、選択したものだけです。また、OS4から提供されている機能なので、OS3.x以前のバージョンをベースにしたアプリでは、今まで通り、ホームボタンを押せば、プロセスが終了されます。 iOS4では、ホームボタンをダブルクリックすると、「最近使ったアプリケーション」が参照できるようになっています。ただそこでは、あくまでも「最近使ったアプリケーション」がわかるだけで、そのプロセスがバックグラウンドに存在するかどうかまではわかりません。 この例では、右の3つはバックグラウンドで一
iPhoneは、DarwinをベースにしたiPhone OSで動作するコンピュータです。iPhoneの基本システムを構成するソフトウェアは、バックグラウンドプロセスと動作しており、そのあたりは、一般的なコンピュータと大差ありません。そのためかどうかはわかりませんが、AppStoreのカスタマーレビューを見ていると、ふつうにPCでできることは、iPhoneでも当たり前にできるのではないかという誤解を持たれている方が、少なからずいらっしゃるように感じます。 iPhoneのアプリケーション実行環境に対しては、いくつか制約がかけられており、PCでは普通にできそうなことも、iPhoneアプリケーションでは実現できないことがあります。しかしながら、具体的にどういう制約があるのかについては、特に公表されているわけではないので、そこに誤解が生じてしまうのは、無理もないと思います。(開発者でさえ、申請してみ
SysStats MonitorとSysStats Liteでは、iPhone/iPod touchシステム全体の、メモリ使用状況を表示しています。この中には、暗黙的にこれらのアプリケーション自身が使用しているメモリサイズも含まれています。そのことは、PCではほぼ誤差の範囲かもしれませんが、iPhone/iPod touchでは若干影響があります。 例えば、SysStats Monitorですべての画面を開いて、さらにヘルプドキュメントを参照すると、10MB以上のメモリを消費します。これは、iPhone 3Gでは、およそ10%になります。そのため、空きメモリの容量が、実際よりも逼迫しているように見えてしまいます。 このように、小さな影響なのですが、実態をさらに正確に把握するために、SysStats MonitorとSysStats Liteでは、自分が使っているメモリサイズを併記しています
先ほど、SysStats Liteに、バッテリ残量の表示を追加して、アップデートを申請しました。 やることは非常に簡単なのですが、その中で、少しだけ悩んだことがありました。バッテリ残量取得のAPIは、OS3.0以降で追加されたので、ふつうにコーディングすると、OS2.2.1環境では、コンパイルが通りません。かといって、3.0でビルドしてしまっては、2.2.1では動作させることができなくなってしまいます。 ということで、2.2.1でビルドしたアプリから、3.0で追加されたAPIを使う方法を、メモを兼ねて書いておきたいと思います。 これと同じようなことをしたい場合、3.0以降で追加されたAPIについては、NSInvocationクラスを使って、動的に呼び出してやることで、回避することができます。*1 バッテリー残量を取得するためには、UIDeviceクラスに定義されている、以下の2つのプロパテ
CLLocationManagerのdesiredAccuracyプロパティは、位置情報を取得する時に、求めたい精度を指定するためのパラメタです。しかしながら、実際に取得される位置情報は、その精度を満たしているとは限りません。そのことについて、Appleのドキュメントに書かれていることを要約すると、以下のような感じです。 (参考ドキュメント) Core Location Framework Reference: Loading... http://developer.apple.com/iPhone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/AdvancedFeatures/AdvancedFeatures.html#//apple_ref/doc/uid/TP40007072-CH14-SW9 要求さ
アプリに添付しているドキュメントに、メモリ使用量の取得方法について、以下の通り説明しています。 アプリ添付ドキュメントからの抜粋 メモリの使用状況を、数値と円グラフで表示します。表示されている数値は、host_statistics()関数のHOST_VM_INFOで取得した、vm_statistics構造体メンバの値をメガバイトに換算したものです。 空き free_count 固定中 wire_count 現在使用中 active_count 現在非使用中 inactive_count 確保中 wire_count + active_count + inactive_count 測定可能値合計 空き + 確保中 測定できない領域 物理メモ リサイズと測 定可能値合計の差分 物理メモリサイズは、sysctl()関数のCTL_HW + HW_MEMSIZE(hw.memsize)で取得した値を
先日、アプリを実機でテストしようとビルドを実行したところ、 Code sign error: The identity "iPhone Developer" doesn't match any valid certificate / private key pair in the default keychain. というエラーメッセージが出て、失敗しました。いろいろ調べていたら、回避策を見つけたので、メモを兼ねて書いておこうと思います。 Check to make sure your default keychain (Applications -> Utilities -> Keychain Access) is still set to the keychain where you originally installed your certificates. In my case
iPhone 3GSの「倍増したRAM」を体感する。 - The iPhone Development Playgroundで、電話、Mail、Safari、iPodの4つのプロセスが立ち上がっていても、空きメモリが、80MBあるということを書きました。ところが、使い込んで行くと、MailやSafariのメモリ使用量が、さらに増えて行き、最終的には、空きメモリがかなり少なくなることがわかりました。 まず、以下のスクリーンショットの抜粋を見てください。 4.1MBと、かなり空きメモリが、少なくなっています。これは、3Gのときによく見られた円グラフの形によく似ていますね。実際の電話、メール、Safari、iPodのメモリ使用量の内訳は、以下のようになっています。 注: 赤枠で囲まれた部分が、メモリ使用量になります。 アプリケーション名とプロセス名の対応は、以下の通りです。 アプリケーション名
SQLiteには、DATEやTIMESTAMPなどの、日時を扱うデータ型はありません。一方で、Objective-Cのプログラムでは、NSDateオブジェクトで日時が表現されます。 では、NSDateオブジェクトの値をSQLLiteのテーブルのカラムに格納するときに、どのようにマッピングするのが適切でしょうか? すでに、答えを持っている方も多いと思いますが、自分のメモを兼ねて、書いておこうと思います。 実際には、何通りか方法はあると思いますが、-[NSDate timeIntervalSince1970]メソッドで返される数値を、日時のデータとするのが適切なのではと思います。 具体的には、以下のようなことになります。 データを格納するとき -[NSDate timeIntervalSince1970]メソッドで返される数値を設定する。(注: この数値は、UTCである) データを取得するとき
iPhoneシミュレータには、GPS機能はないので、Core Locationが実機と同等に使えないのは当然ですが、知らないとハマることもあるので、メモを兼ねて、書いておこうと思います。 iPhoneシミュレータの制約 常に、同じ位置情報が返ってくる。 その値は、北緯37.33168900、西経122.03073100です。 ほぼ想像がつくかもしれませんが、これが示している実際の場所を知りたい方は、以下のリンクをクリックしてみてください。 37.33168900,-122.03073100 - Google マップ 以下のドキュメントに、このことが説明されていますね。 http://developer.apple.com/iPhone/library/documentation/Xcode/Conceptual/iphone_development/125-Using_iPhone_Sim
これまで、iPhoneやiPod touchの全体でどのようなメモリ使用量になっているのかということについては、何度か説明してきました。当然のことですが、アプリ開発者に取ってはそれだけでなく、自分が作ったアプリが、いったいどのくらいメモリを使用しているのかを知ることは重要です。 XCodeで、「実行 --> パフォーマンスツールを使って開始」の、Activety Monitorで見ることができますが、デバッガとの併用ができないので使いにくいこともあります。その場合には、*1。/Developer/Applications/Instruments.appを独立して起動することで、デバッグしながらメモリの状況を見ることができますが、自分でメモリ使用量を取得してログ出力するようにしておくと便利です。 以下に、そのためのサンプルコードを示します。 #import <Foundation/Found
Objective-C2.0では、以下の2つのメモリ管理方式が、ランタイムシステムによって提供されています。 マネージドメモリ プログラマが、オブジェクトを保持するのか、解放するのかを明示的に指定する。あるオブジェクトが、誰かに保持されているかどうかは、参照カウンタによって管理される。その参照カウンタが0にならないと解放されない。詳細は、Advanced Memory Management Programming Guideを参照。 ガベージコレクション システムが、自動的に、どこからも参照されていないオブジェクトを解放する。詳細は、Garbage Collection Programming Guide (Not Recommended): Garbage Collection Programming Guideを参照。 iPhoneOSのランタイムシステムの場合、前者の「マネージドメモ
追記 この記事は、過去に、「メモリ解放機能」の追加を試みたときの記録となっています。 最終的にAppleの審査が通らなかったため、結果として実装を中止しました。 今後も、何か正規の認められた方法で類似の機能を実現できるようにならない限り、このアプリに「メモリ解放機能」と呼ばれる機能を追加する予定はありませんので、ご了承ください。 関連情報については、以下の記事をご参照ください。 SysStats Lite1.1が、本日リリースされます。 - The iPhone Development Playground アプリ審査基準のグレーゾーン - The iPhone Development Playground Malloc Simulatorはリジェクトされました。 - The iPhone Development Playground iPhoneアプリは、そんなに自由に作れない - Th
SysStats Monitorというアプリは、かなり以前に作成したアプリであり、ディスプレイのサイズは、iPhone SEレベル(640 × 1136 pixels)のサイズを基準にしています。 そのアプリを、iPhone Xのシミュレータで実行してみたところ、画面の横幅は問題ないのですが、縦幅がiPhone SEのサイズよりも短くなるという現象が見られました。 このアプリは、古いアーキテクチャをベースとしているので、Auto Layoutを適用してない箇所もあるのですが、ほとんどの画面がスクロールするタイプなので、実害はありませんでした。 そもそも、サイズが小さくなるのは想定外の挙動だし、Auto Layoutを適用していてもうまく収まらなくなる可能性があるので、注意が必要ですね。 bit.ly iOSアプリのバージョン情報 iOSアプリでは、2つのバージョン情報があります。 Xcod
このページを最初にブックマークしてみませんか?
『More the iPhone Development Playground』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く