統計情報(30日間)


最新情報をツイート


人気の投稿

iOSアプリの不正使用

このエントリーをはてなブックマークに追加

Jail Breakの状況や問題点とその対策のまとめ。改造や広告削除など。Androidアプリの不正使用についても触れられていて参考になった。



Audio Unit サンプル紹介

このエントリーをはてなブックマークに追加

Audio Unitを活用したサンプルの紹介。2チャンネルミキサーや各種エフェクト、サンプラーなど。


個人的には Audio Unit の「ユニットをつなげて複雑なオーディオ処理を実現する」というしくみ(AUGraph)がまるでギターのエフェクターをつないで音をつくる感じに似ていて、そのあたりも興味深いポイントとなっています。


iOSはRemoteViewControllerで進化を遂げるか

このエントリーをはてなブックマークに追加

Ole Begemann さんのブログで3回に渡り "Remote View Controller" に関するハックが解説されている。

Part1:



Part2:
More on Remote View Controllers – Ole Begemann

Part3:
Update on Remote View Controllers – Ole Begemann


乱暴に要点をまとめると
・iOS6でXPCが導入された
・XPCをベースにした Remote View Controller な仕組みが非公開APIで提供されている
・アプリから iOSが提供するサービス(例えばメッセージ、Facebookなど)を呼び出す時に使われている

XPCとは OS X Lion から導入された "lightweight helper tools"。launchd管理下にあって、アプリからのリクエストに応じてプロセス(Sandbox)を起こし各種サービスを提供する仕組みのこと。

(参考)

XPC Services を使う用途として次の2点が挙げられている。
安定性の向上 〜 XPC Services が落ちてもアプリには影響を与えない。
セキュリティの向上 〜 XPC Services毎にアクセス制御を細かく設定できて、アクセス可能な範囲を本体のアプリとは分離できる。Sandboxでの利用が想定されている。

OS X ではセキュリティの向上を主に目的に導入されたと思われるが、iOS6ではこれを外部プロセス(サービス)利用時のプロセス間通信の仕組みとして利用しているようだ。

そしてこのXPCを利用した RemoteViewController は、その名の通りリモート版ViewControllerの役割を果たす(※ここでいうリモートとはアプリプロセスの外部のプロセスを指す。ネットワーク越しの外部のことではない)。具体的には、サービスが提供するViewController(例えばFacebookならメッセージ編集ダイアログのViewController)のプロキシとして働く。どうも RemoteViewControllerとそのビューは、アプリ側のViewController階層、ビュー階層に透過的に組み込まれるようだ。ViewControllerとして振舞うということはアプリ側は今までのViewControllerの作法で使えるし、サービスを提供するリモート側もアプリとのインターフェイスに使い慣れたViewControllerが利用できるということだと思われる。

*イメージ*
   +−−−−−−−−−−−−−−−−−−−−−+
   |アプリのViewController|
   |   ↓         |
   |RemoteViewController|
   |(プロキシ)       |
   +−−−−−−−−−−−−−−−−−−−−−+
         ↓
        XPC
         ↓
   +−−−−−−−−−−−−−−−−−−−−−+
   | サービスプロセスの   |
   |  ViewController   |
   +−−−−−−−−−−−−−−−−−−−−−+
まだはっきりとわからないがイメージとしてはリモートのViewControllerを透過的扱えるということらしい。ということは描画もユーザのインタラクションもXPCを通じて透過的に外部プロセスとやりとりできるのかもしれない。そうだとしたら凄い。


検証記事によれば、この仕組は iOS5には無かったもので実際メッセージ作成のUIを呼び出したときの挙動が明らかに変わっていることが指摘されている。例えばMFMailComposeViewControllerを呼び出した時のビュー階層はiOS6の場合:
(lldb) po [controller.view recursiveDescription]
(id) $2 = 0x1e05c2e0 'MFMailComposeViewController:0x1e04f6d0' 1 child[MFMailComposeInternalViewController:0x1e02dfd0 ] <UILayoutContainerView: 0x1e04ffe0; frame = (0 0; 320 480); autoresize = W+H; layer = <CALayer: 0x1e0500a0>>
   | <UINavigationTransitionView: 0x1d57f6a0; frame = (0 0; 320 480); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x1d57f770>>
   |    | <UIViewControllerWrapperView: 0x1e04f600; frame = (0 20; 320 460); autoresize = W+H; layer = <CALayer: 0x1e0241f0>>
   |    |    | 'MFMailComposeInternalViewController:0x1e02dfd0' 1 child[MFMailComposeRemoteViewController:0x1e055230 ] <UIView: 0x1e05f9a0; frame = (0 0; 320 460); autoresize = W+H; layer = <CALayer: 0x1e05fa00>>
   |    |    |    | 'MFMailComposeRemoteViewController:0x1e055230' <_UISizeTrackingView: 0x1e05c030; frame = (0 0; 320 460); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x1e05c110>>
   |    |    |    |    | <_UIRemoteView: 0x1e05c300; frame = (0 0; 320 480); transform = [0.5, -0, 0, 0.5, -0, 0]; userInteractionEnabled = NO; layer = <CALayerHost: 0x1e05c460>>
最下層に *RemoteViewController と _UIRemoteView が組み込まれているのがわかる。

次はiOS5の場合
(lldb) po controller
(MFMailComposeViewController *) $1 = 0x07ea0420 <MFMailComposeViewController: 0x7ea0420>
(lldb) po [controller.view recursiveDescription]
(id) $2 = 0x08bb4d50 'MFMailComposeViewController:0x7ea0420' 1 child[MFMailComposeController:0x89b0220 ] <UILayoutContainerView: 0x8b97e70; frame = (0 0; 320 480); autoresize = W+H; layer = <CALayer: 0x8b97ec0>>
   | <UINavigationTransitionView: 0x89b1460; frame = (0 0; 320 480); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x89b1500>>
   |    | <UIViewControllerWrapperView: 0x7e77990; frame = (0 64; 320 416); autoresize = W+H; layer = <CALayer: 0x7e98af0>>
   |    |    | 'MFMailComposeController:0x89b0220' <MFMailComposeView: 0x89b4410; baseClass = UITransitionView; frame = (0 0; 320 416); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x89b4530>>
  :
と、かなり長いので割愛するが、iOS5の場合は通常のローカルなUIViewControllerのサブクラス、そしてUILabelやUIButtonがビュー階層に配置されている。そう、iOS6の方では画面上に配置されているUILabelやUIButtonがビュー階層に現れない(!)。

検証記事では色々な方法を駆使して最終的にはRemoteViewControllerとXPCの接点になると思われるメソッドを突き止める。
+ (id)requestViewController:(id)arg1
    fromServiceWithBundleIdentifier:(id)arg2 connectionHandler:(id)arg3;
こんな感じで使われる。
[MFMailComposeRemoteViewController
                      requestViewController:@"ComposeServiceRemoteViewController"
            fromServiceWithBundleIdentifier:@"com.apple.MailCompositionService"
                          connectionHandler:handler];
第一引数がRemoteViewControllerのクラス名、第二引数がサービスのバンドルID。この例の場合、/Applications/MailCompositionService.appに対応するようだ。
そして第三引数は2つの引数を取るブロック。こんな感じ。
typedef void (^ConnectionHandler)(id blockArg1, id blockArg2);
blockArg1にはリモートと接続されたRemoteViewControllerのインスタンス、blockArg2はNSError*と推察されている。ここでこのブロックを意図的に置き換え(swizzledBlock)、さらにRemoteViewControllerになりすますプロキシ(loggerProxy)を用意して、RemoteViewControllerにどんなメッセージが送られているかを調べている。結果はこう:
Logger Proxy: [<MFMailComposeRemoteViewController: 0x1c576600> serviceViewControllerProxy]
  return value: @: <_UIViewServiceImplicitAnimationEncodingProxy: 0x1d83e4a0; target: <_XPCProxyReplyHandlerQueueRedirectingProxy: 0x1d8701d0; target: <_UIViewServiceXPCProxy: 0x1d8613c0>>>

Logger Proxy: [<MFMailComposeRemoteViewController: 0x1c576600> setDelegate:]
  called with arguments: (
    "@: <MFMailComposeInternalViewController: 0x1c56f9c0>"
  )
  return value: v: (void)

Logger Proxy: [<MFMailComposeRemoteViewController: 0x1c576600> parentViewController]
  return value: @: (null)

Logger Proxy: [<MFMailComposeRemoteViewController: 0x1c576600> view]
  return value: @: XX ('MFMailComposeRemoteViewController:0x1c576600' <_UISizeTrackingView: 0x1d855440; frame = (0 0; 0 0); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x1d865e90>>)

Logger Proxy: [<MFMailComposeRemoteViewController: 0x1c576600> parentViewController]
  return value: @: (null)

Logger Proxy: [<MFMailComposeRemoteViewController: 0x1c576600> _existingView]
  return value: @: 'MFMailComposeRemoteViewController:0x1c576600' <_UISizeTrackingView: 0x1d855440; frame = (0 0; 320 416); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x1d865e90>>

Logger Proxy: [<MFMailComposeRemoteViewController: 0x1c576600> _existingView]
  return value: @: 'MFMailComposeRemoteViewController:0x1c576600' <_UISizeTrackingView: 0x1d855440; frame = (0 0; 320 416); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x1d865e90>>
   :
setParentViewController: や willMoveToParentViewController: など通常のViewControllerの初期化で呼び出されるメッセージが送られている。リモートのViewControllerが、透過的にローカルViewControllerとして働くことが推察される。

Part2では発見されたRemoteViewControllerが表でまとめられている。
More on Remote View Controllers – Ole Begemann

これをみると既にいくつものサービスがこの仕組で提供されているのがわかる。またPart3では_UIWebViewControllerも紹介されている。WebブラウザはSandbox化が望まれるコンポーネントなのでもし今後XPC経由で安全に扱えるようになればセキュリティ上大きなメリットになると思われる。


- - - -
Appleが一般開発者にXPCサービスの開発を開放することはこれまでの方針から考えにくいが、Appleが提供するXPCサービスが今後iOS7以降、さらに増えることは間違いない。それらは現状と同じように各種フレームワークのAPIとして提供されると思われる。ただそうだとしてもサービスが増えるメリット、XPCの特性を生かしたセキュアなコンポーネントが利用できるメリットなど地味ながらも大きな改善になるだろう。そして将来もしXPCサービスの開発を一般開発者へ開放することがあれば、iOSは今とはかなり違った体験を提供できるスマートフォンになるかも。これはちょっとワクワクする。

なお今回は(というか毎回ですが)勢いで書いたので間違い・勘違いがあれば遠慮無く指摘して下さい。


「業務用iOSアプリ作成講座」

このエントリーをはてなブックマークに追加

業務用のiOSアプリを作成する連載が始まった。



そこで本連載では、iPhone/iPadで稼働する業務アプリケーションの作り方を基礎から解説していきます。今からでも遅くはありません。必要に迫られて開発に着手した人も、興味が沸いてきたので開発してみようと思った人も、この連載を読んでiOSアプリ開発の基礎を習得しましょう。

続きを読むには ITpro会員(無料)になる必要あり。



「IOSアプリ開発に役立つTips」

このエントリーをはてなブックマークに追加


この情報局と同じ様にネット上の情報を紹介するサイト(Facebook)。これはいい。使わせてもらいます。

最新の機種別能力比較表

このエントリーをはてなブックマークに追加

こうしてみると4Sと5のハードウェア的な違いは画面サイズぐらいなのか。




最新のiOS開発情報が入手できる便利サイト - iOS Dev Bot

このエントリーをはてなブックマークに追加

これはいい




Qiita、はてぶ、Gist、Twitter、Stack Overflow から自動的に情報を集めてきているようだ。

Githubも加わるとうれしいかも(Most Starred Todayとか)。

- - - -
これは便利。使わせてもらいます。

iOS 6 予想

このエントリーをはてなブックマークに追加

HMDT 木下さんの iOS6の「予想というか願望」。こういうのは楽しい。Siriの APIは期待したいな。「iCloudベースのオープンダイアログ」は同感。ただAppleに完全に囲い込まれることになりそうだが。


BaaS (Backend as a Service) のまとめ

このエントリーをはてなブックマークに追加

いいまとめ。BaaSというキーワードはこの記事で初めて知った。


ユーザ認証やバッチ処理、データの保存、コンテンツ配信等々の処理をサーバ側で肩代わりしてくるサービス。モバイルアプリ向けに特化しているということろが新しい。

今後増えていくことは間違いない気がするけれど、利用する時に障壁になるのはセキュリティとサービスの持続性につきる(アプリにもよるけれど)。この辺りを考えると長期利用を見越したサービス/アプリでの利用になると、小さなベンチャーが提供しているようなサービスは実際問題として利用は二の足を踏んでしまう。ただスタートアップの時間短縮と割りきって、大きくなってきたら自社運用に切り替えるという活用方法もあるのかもしれない。

後はこういったサービスをホストするプラットフォームの必要性。EC2 や GAE がその基盤になっていくとしても、もう1段上のレイヤー(プラットフォーム)があると良さそう。ある程度大きなベンダーがBaaSの為のプラットフォームを提供し、そこでサードパーティが様々なサービスを提供する形態をとることで利用障壁はぐっと低くなる気がする。

- - - -
と、ここまで書いてきてふと思い出したが、Amazon は S3、SQS、RDS、Elastic MapReduce、SimpleDB、...等々提供していて通常のサーバでいうところのミドルウェアレイヤーは既にほとんどカバーできている。先日はワークフローエンジンも公開された。Amazonはここでいう BaaSの領域にじわじわと出てきている。将来は他サービス用に amazonのアカウント認証を公開することがあるかもしれない(もう既にされている?)。iOS/OSX限定だと iCloudがあるが、こっちは完全に Appleに囲いこまれたサービスなので、独自サービスでの利用は基本できない。iCloudが他サービスのプラットフォームとしてオープンになることは今後も無いだろうな。ユーザ認証に限って言えば Twitter/Facebookは既にそのスタンダードになりつつある印象を受ける。




通知は同期呼び出し、そしてKVOの方が効率的

このエントリーをはてなブックマークに追加

通知はなんとなく非同期なイメージがあるけれど同期呼び出しとドキュメントに明記されている。なので監視元(オブザーバ)で重い処理を走らせたりするとブロックするし、監視元がたくさんある場合は実行速度に影響を与えることがある。記事では通知を効率的に使う上での情報が紹介されていて参考になった。


MainWindow.xib が消えた

このエントリーをはてなブックマークに追加

Storyboard導入によって無くなった。また main() と application:didFinishLaunchingWithOptions: 内の記述が変わった事に触れている。



この記事に記載されているアプリ起動シーケンス図は参考になる(図はCCライセンス)。
以下引用。

URLスキームデータベース

このエントリーをはてなブックマークに追加

iOSアプリのスキームを集めたDB。現在 600以上のアプリが登録済。スキーム名による検索の他、アカウントを作れば新規にスキームを追加することもできる。



以下、サイトからの転載

設定(Preference)

Twitter(アプリ)

これはいい。さらに API を提供してくれたらアプリから問い合わせに使えて便利かも。


関連情報

Cocoaの日々: [Info] iPhoneで利用可能な URLスキームまとめサイトの紹介

インストールされているアプリを知る | Cocoaの日々情報局

URLスキーム名がバッティングした場合は上書きになる | Cocoaの日々情報局

アプリ開発者が知っとくべき 32個の情報リソース

このエントリーをはてなブックマークに追加

情報サイト、チュートリアル、本、デザイン、ツールなどが紹介されている。知らないサイトも多く参考になった。


以下は配布されている Infographic

Top 32 Resources A Mobile App Developer Should Know About
[Source: iPhone App Design]

Bluetooth Smart Device 情報

このエントリーをはてなブックマークに追加

Bluetooth 4.0 対応の Apple製品として iPhone4S, Mac Mini, MacBook Air が取り上げられていた。

G-SHOCK

MOTOACTV

その他、健康機器などが取り上げられている。種類は少ないがスマートフォンで Bluetooth 4.0が採用されるのに伴い今後増えていくと思われる。


以下記事より抜粋:

  • 2012年末にはほとんどのスマートフォンが Bluetooth 4.0 に対応
  • Windows8 も Bluetooth 4.0 に対応する予定

関連情報



Bluetooth Smart対応iPhoneアプリ | Cocoaの日々情報局

Bluetooth Low Energy 対応の G-SHOCK 発表 | Cocoaの日々情報局


Blocksのチートシート

このエントリーをはてなブックマークに追加

綺麗にまとめられている。



こんな感じ。


iPhone/iPad 画面レイアウトの実ピクセルがよくわかる図

このエントリーをはてなブックマークに追加

これは便利。iPhone/iPad の画面レイアウトの実ピクセルサイズがわかりやすい図でまとめられている。例えばiPhone縦はこんな感じ。




デバイスの回転に関するまとめ

このエントリーをはてなブックマークに追加

回転関係の設定が簡潔にまとめられている。



デバイス回転時の流れを図にした分かりやすい説明

このエントリーをはてなブックマークに追加

良記事。

回転時の実行の流れがこんな感じでわかりやすく説明されている。

回転に加え、キーボードの開閉が起こった時の流れが載っていて参考になる。

さらに後半では iPad で分割キーボードを使用していた場合の処理の流れについても言及あり。