iOS7で、マルチタスク表示からアプリを終了するときのTips

ホームボタンをダブルクリックして、バックグラウンドで動作しているアプリを終了するときの操作が、大きく変わりました。
基本的な操作については、以下の記事が参考になると思います。

アプリを終了させるときに、SysStats Monitor / Liteと連動させると、少しおもしろい使い方ができるので、紹介したいと思います。

注: ここで紹介している方法は、この記事を書いた時点の、iOS7.0にて有効なものであり、iOS6.1以前のバージョンには適合しませんのでご了承ください。
尚、今後のiOSのバージョンアップによって、ユーザインタフェースが変わった場合にも、適合しなくなる可能性があります。

操作方法

(1) まず、SysStats Monitor または、SysStats Liteを起動します。

注: SysStats Monitor / Liteは、メモリ使用量のグラフをタップすると、グラフの表示形式が変わります。この表示例では、棒グラフ表示になっています。

(2) そのまま、ホームボタンをダブルクリックして、マルチタスク表示にします。


(3) 画面を少し右にスクロールして、SysStats Monitor / Liteが中心になるように、調整します。


(4) すぐ右隣にあるアプリを上にスワイプして、終了させます。

この例では、Safariを終了させています。

(5) SysStats Monitor / Liteの表示がリアルタイムに更新されます。

アプリを終了したことによってメモリ使用量の変化があったかどうかを、確認することができます。
大きな変化が見られる場合は、そのアプリが使用しているメモリーの使用量が多かったことになります。
変化が見られない場合は、そのアプリがすでに終了していたか、メモリー使用量が少なかったかのいずれかです。

(6) SysStats Monitor / Liteをタップして、再表示させます。

アプリを終了したことによって、増加した空きメモリのサイズが表示されます。
(この例では、Safariを終了させたことで、52MBの空きメモリが増えたことを示しています)
注: 空きメモリーの増加量が少ない場合は、表示されません。

(参考情報)アプリケーションプロセスの確認

そのまま、SysStats Monitor / Liteを終了せずに、TabBarの左から2番目の「プロセス」をタップして、プロセス画面を表示させます。

「終了を検知したもの」のリストの中に、終了したアプリのプロセス(この例ではSafari)が表示されます。
ここで、実際のプロセス名を確認することができます。


少しマニアックな操作かもしれませんが、やってみると意外に楽しめるので、ぜひ試してみてください。

Facebook Feed Dialogの仕様変更があったようです

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に投稿されるはずですが、ここに情報が設定されなくなっていることに気付きました。
調べてみたところ、原因が判明しました。Facebook側の仕様が、いつのまにか変わっていたようです。

以下に、前述のFeed Dialogから、該当箇所を引用します。

このmessageというプロパティが、該当する箇所なのですが、最近、そこに設定されている内容は無視するようになっていたのですね。。

もしも、この機能を使っていただいている方がいらっしゃいましたら、こういった事情があることをご理解いただければと思います。
現在、対応方法を検討中ですので、しばらくお待ちください。

UIDocumentInteractionControllerによる、アプリケーション間のファイル受渡し

昨年、iOSの中で、アプリケーション同士が連携するためのしくみ - The iPhone Development Playgroundで、UIDocumentInteractionControllerを使ったアプリケーション間連携について簡単に説明しました。そのときに少し触れたとおり、SysStats MonitorSysStats Liteの間で、UIDocumentInteractionControllerを使った連携機能を追加しましたので、もう少し技術的な説明をしたいと思います。

処理の流れ

以下に、全体の流れを示します。

ここでは、以下の2つの目的で、UIDocumentInteractionControllerを使った連携を使用しています。

(1) SysStats Liteから、SysStats Monitorへのプロセスブックマークの移行

SysStats Liteで蓄積したプロセスブックマークを、SysStats Monitorで流用するための機能です。

(1-1) Send ユーザの操作により、UIDocumentInteractionController経由で、SysStats Monitorが自動的に起動され、プロセスブックマークデータを送られる。
そして、SysStats Monitor側のInboxと呼ばれるフォルダに、そのデータが保存される。
(1-2) Import ユーザの操作により、Inboxからブックマークデータを読み込み、現在のブックマークデータにインポートする。
(2) SysStats Monitorのプロセスブックマークを、Email経由で共有

異なるデバイスのSysStats Monitor間でプロセスブックマークを共有するための機能です。
例えば、iPhoneiPadを所有しているユーザの場合、iPhoneで蓄積したプロセスブックマークを、iPad側に取り込む(Import)ことができます。

(2-1) Export ユーザの操作により、Message UI Frameworkを使って、現在のブックマークデータ添付ファイルとするメールを作成する。
(2-2) Send Emailとして送信する。
(2-3) Send 受信側のデバイスで、Mail.appでEmailを受信し、添付ファイルを開く操作をすることで、SysStats Monitorにプロセスブックマークデータを送ることができる。
(1-1)と同様に、SysStats Monitorが自動起動され、Inboxフォルダに、そのデータが保存される。
(2-4) Import ユーザの操作により、Inboxからブックマークデータを読み込み、現在のブックマークデータにインポートする。

プロセスブックマークデータのUTI宣言

Appleは、データタイプの識別子のための構文として、UTI(uniform type identifiers)を定義しています。
UIDocumentInteractionControllerに、データタイプを認識させるためには、そのデータのUTIを宣言する必要があります。

参考ドキュメント

UTIに関しては、Uniform Type Identifiers Overviewを参照してください。
Info.plistの各項目の設定値については、Information Property List Key Referenceを参照してください。

SysStats MonitorのInfo.plistに、以下のような設定を行っています。

	<key>UTExportedTypeDeclarations</key>
	<array>
		<dict>
			<key>UTTypeIdentifier</key>
			<string>[プロセスブックマークのUTI]</string>
			<key>UTTypeDescription</key>
			<string>SysStatsMonitor&apos;s proprietary processbookmark format</string>
			<key>UTTypeConformsTo</key>
			<array>
				<string>public.item</string>
			</array>
			<key>UTTypeTagSpecification</key>
			<dict>
				<key>public.filename-extension</key>
				<array>
					<string>[プロセスブックマークの拡張子]</string>
				</array>
				<key>public.mime-type</key>
				<string>[プロセスブックマークのMIMEタイプ]</string>
			</dict>
		</dict>
	</array>
UTTypeIdentifier プロセスブックマークのUTIを指定しています。
UTTypeTagSpecification プロセスブックマークの拡張子MIMEタイプを指定しています。
UTTypeConformsTo UTIは、適合性(Conformance)に基づく階層構造の中に定義します。
プロセスブックマークは、SysStats Monitor独自のデータフォーマットなので、public.itemという、最上位階層を指定しています。
テキストファイルであるからといって、public.textを指定した場合、次で説明するLSItemContentTypesにpublic.textが指定されているすべてのアプリで開くことが可能となってしまうので、注意が必要です。

SysStats Monitorがプロセスブックマークを受取るための設定

SysStats MonitorのInfo.plistに、以下のような設定を行っています。

	<key>CFBundleDocumentTypes</key>
	<array>
		<dict>
			<key>CFBundleTypeName</key>
			<string>SysStatsMonitor&apos;s proprietary processbookmark format</string>
			<key>CFBundleTypeRole</key>
			<string>Viewer</string>
			<key>LSHandlerRank</key>
			<string>Owner</string>
			<key>LSItemContentTypes</key>
			<array>
				<string>[プロセスブックマークのUTI]</string>
			</array>
		</dict>
	</array>

ここでのポイントは、LSItemContentTypesに、前述のUTTypeIdentifierにて指定した[プロセスブックマークのUTI]を指定しているところです。この設定によって、SysStats Monitorは、プロセスブックマークを受取ることができるようになります。

詳細は、Document Interaction Programming Topics for iOSの"Registering the File Types Your App Supports"を参照してください。

ドキュメントを送る側のコーディングイメージ

SysStats Liteの設定画面で、「SysStats Monitorへエクスポート」を選択すると、以下のような、ドキュメント送信先のアプリを選択するメニューが表示されます。

実際の処理は、UIDocumentInteractionControllerを使って以下のように記述されています。

    self.docController = [UIDocumentInteractionController interactionControllerWithURL:url];
    docController.delegate = self;
    BOOL isValid = [docController presentOpenInMenuFromRect:CGRectZero inView:self.tabBarController.view animated:YES];
    if (!isValid) {
        // 必要に応じてエラー処理(AlertPanel)
    }

メニューから、「SysStatsMon」が選択された後、UIDocumentInteractionControllerDelegateメソッドが呼び出されます。SysStats Liteでは、以下のように特に何もしていませんが、各タイミングで必要な処理があれば、それぞれに記述します。

#pragma mark UIDocumentInteractionControllerDelegate

- (void)documentInteractionController:(UIDocumentInteractionController *)controller willBeginSendingToApplication:(NSString *)application {
    NSLog(@"!!!!! Sending to: %@", application);
}

- (void)documentInteractionController:(UIDocumentInteractionController *)controller didEndSendingToApplication:(NSString *)application {
    NSLog(@"!!!!! Sent to: %@", application);
}

- (void)documentInteractionControllerDidDismissOpenInMenu:(UIDocumentInteractionController *)controller {
    self.docController = nil;
}

ドキュメントを受取る側のコーディングイメージ

以下に、ドキュメントを受取る側である、SysStats Monitorのコーディングイメージを示します。

UIDocumentInteractionControllerDelegate経由で起動されると、application:didFinishLaunchingWithOptions:メソッドが呼ばれます。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    if (launchOptions) {
        NSURL *launchedURL = [launchOptions objectForKey:UIApplicationLaunchOptionsURLKey];
        if ([launchedURL isFileURL]) {
            if ([[launchedURL pathExtension] isEqualToString:kProcessBookmarkFileExtention]) {
                
                // 確認メッセージのためのファイル名などの情報を取得
                NSString *fileName = [launchedURL lastPathComponent];
				...

				// AlertPanelを表示
                
            }
            
        }
        
    }
    return YES;
    
}

SysStats Monitorでは、プロセスブックマークを受け取った時に、以下のような確認メッセージを表示しています。

[補足] Inboxフォルダのパスは、以下のようにして取得できます。
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *inboxPath = [[paths objectAtIndex:0] stringByAppendingString:@"/Inbox"];

UIDocumentInteractionControllerによる、アプリケーション間のファイル受渡し

この記事は、こちらに移動しました。
UIDocumentInteractionControllerによる、アプリケーション間のファイル受渡し - The iPhone Development Playground

ドイツのpcwelt.deのビデオで紹介していただきました。

PC-Weltという、ドイツのパソコン雑誌のサイトで、SysStats Monitorをビデオで紹介していただいてます。

http://www.pcwelt.de/news/Systemmonitor-iPhone-App-SysStats-Monitor-im-Video-vorgestellt-1412442.html

ドイツ語ですが、映像から、このアプリの機能が的確に表現していただいているのを感じます。
Danke!

iOS4.2で、一部の標準アプリのプロセス名が変更されたようです


SysStats Monitor / Lite では稼働中のプロセス一覧を表示しています。実際のプロセス名と、ホーム画面に表示されている名前と一致している場合もありますが、それが異なっているものも多いのが実情です。
例えば、以下のアプリが該当します。

ホーム画面 プロセス名
Safari MobileSafari
iTunes MobileStore
メモ MobileNotes

このように、ただ単にプロセス名の一覧を表示するだけではわかりにくいので、SysStats Monitor / Liteでは、「プロセスブックマーク」という機能をつけて、ユーザがわかりやすい名前を付与して、その名前で表示できるようにしています。言い換えると、プロセス名の辞書のようなものです。ただ、すべてのプロセスに関してその作業を行うのはかなり面倒な作業となるので、いくつかの標準アプリについては、事前に登録済みになっています。

ところが、このプロセス名というのは、特に仕様として公開されているものではなく、あくまでも、システム内部で使用されている名称に過ぎません。予告なしに変更されることは、十分に予測されます。標準アプリだけでなく、みなさんが、自分でインストールした一般のアプリも同様です。
そういったことを織り込み済みで、このような方式を採用しています。

さて、本題に入りますが、iOS4.2からプロセス名が変更になったものがあることが判明しました。それも、機種ごとに異なる名前になっているようです。
以下に、iPhoneiPadの例を示します。


整理すると、以下の感じで、いずれもチルダ(~)のあとに、機種名が付加されています。*1

ホーム画面 プロセス名(4.1以前) プロセス名(iPhone4.2) プロセス名(iPad4.2)
連絡先 Contacts Contacts~iphone Contacts~ipad
マップ Maps Maps~iphone Maps~ipad
Game Center Game Center Game Center~ipho Game Center~ipad

その他、iPhoneでは、標準のカメラアプリのプロセスが独立したプロセスになったようです。
SysStats Monitor / Liteのユーザの方は、上記のアプリを起動し、ブックマークに登録しなおすことで、表示できるようになります。
次期バージョンでは、このあたりを考慮して、事前登録の内容を見直す予定です。

このように地味な機能ではありますが、意外に便利なので、ぜひご活用ください。

*1:きっと、iPod touchも同様だと思いますが、手元には、マルチタスキング非対応のtouch 2Gしかないので、別途調査したいと思います。