Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
Submit search
EN
Uploaded by
京大 マイコンクラブ
PDF, PPTX
2,213 views
Cocoaアプリに無理矢理プラグインを導入する入門
既存のアプリが微妙に使いにくい?そんなときは!自作のプラグインで改造できるニャー
Technology
◦
Read more
2
Save
Share
Embed
Embed presentation
Download
Download as PDF, PPTX
1
/ 95
2
/ 95
3
/ 95
4
/ 95
5
/ 95
6
/ 95
7
/ 95
8
/ 95
9
/ 95
10
/ 95
11
/ 95
12
/ 95
13
/ 95
14
/ 95
15
/ 95
16
/ 95
17
/ 95
18
/ 95
19
/ 95
20
/ 95
21
/ 95
22
/ 95
23
/ 95
24
/ 95
25
/ 95
26
/ 95
27
/ 95
28
/ 95
29
/ 95
30
/ 95
31
/ 95
32
/ 95
33
/ 95
34
/ 95
35
/ 95
36
/ 95
37
/ 95
38
/ 95
39
/ 95
40
/ 95
41
/ 95
42
/ 95
43
/ 95
44
/ 95
45
/ 95
46
/ 95
47
/ 95
48
/ 95
49
/ 95
50
/ 95
51
/ 95
52
/ 95
53
/ 95
54
/ 95
55
/ 95
56
/ 95
57
/ 95
58
/ 95
59
/ 95
60
/ 95
61
/ 95
62
/ 95
63
/ 95
64
/ 95
65
/ 95
66
/ 95
67
/ 95
68
/ 95
69
/ 95
70
/ 95
71
/ 95
72
/ 95
73
/ 95
74
/ 95
75
/ 95
76
/ 95
77
/ 95
78
/ 95
79
/ 95
80
/ 95
81
/ 95
82
/ 95
83
/ 95
84
/ 95
85
/ 95
86
/ 95
87
/ 95
88
/ 95
89
/ 95
90
/ 95
91
/ 95
92
/ 95
93
/ 95
94
/ 95
95
/ 95
More Related Content
PPTX
Carbon vs cocoa
by
malvikushal
KEY
Objc lambda
by
matuura_core
PDF
Xcode4 project template (slide)
by
Wataru Kimura
PDF
Macでcocos2d-x 2.1.3を使用した、iOSアプリの開発環境構築について
by
Tomoaki Shimizu
PDF
Obj c
by
SungVum Kim
PDF
Objectie-C de ラムダ
by
Akihiko Matuura
PDF
Corona Handson #0
by
Tetsuo Ono
PDF
初めてのアプリを2ヶ月でリリースする方法
by
Tetsuo Ono
Carbon vs cocoa
by
malvikushal
Objc lambda
by
matuura_core
Xcode4 project template (slide)
by
Wataru Kimura
Macでcocos2d-x 2.1.3を使用した、iOSアプリの開発環境構築について
by
Tomoaki Shimizu
Obj c
by
SungVum Kim
Objectie-C de ラムダ
by
Akihiko Matuura
Corona Handson #0
by
Tetsuo Ono
初めてのアプリを2ヶ月でリリースする方法
by
Tetsuo Ono
Similar to Cocoaアプリに無理矢理プラグインを導入する入門
PDF
BNN CAMP vol.3 インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 1
by
Atsushi Tadokoro
PDF
RubyによるMac OS Xデスクトップアプリケーション開発入門
by
宏治 高尾
PDF
MacRubyとHotCocoaでMacのアプリを作ってみた
by
Yukimitsu Izawa
PDF
Cocos2d xをさらにさわってみよう!
by
Tomoaki Shimizu
KEY
Cocos2d xをさわってみよう!
by
Tomoaki Shimizu
PDF
MacRuby を使ってみました
by
Yoshiyuki MIYAGI
PDF
Code injectiontool
by
Shunsuke Araki
PDF
Xcode 7 の新しいところ #cm_ios9
by
Tomohiro Kumagai
PDF
Cocos2dx 8hour
by
Tomohiko Okita
PDF
Cocos2d-x公開講座 in 鹿児島
by
Tomoaki Shimizu
PDF
cocos2d-xハンズオン勉強会 in 名古屋
by
Tomoaki Shimizu
PDF
24時間でiOSアプリ-Twitterクライアント-の作成にチャレンジ
by
聡 中川
KEY
1.29.user,user,user
by
Tonny Xu
PDF
cocos2d-xとCocosBuilder
by
Tomoaki Shimizu
PDF
かんたんなcocos2d-xの紹介
by
Tomoaki Shimizu
PDF
Macでcocos2d-x 2.1.2を使用した、Androidアプリの開発環境構築について
by
Tomoaki Shimizu
PDF
cocos2d-x公開講座 in 鹿児島
by
Tomoaki Shimizu
PDF
Macでcocos2d-x 3.0alphaを使用した、iOSアプリの開発環境構築について
by
Tomoaki Shimizu
PDF
iPhoneアプリを作ってみよう
by
Nagao Shun
PDF
CDI, Seam 3 and Forge
by
nekop
BNN CAMP vol.3 インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 1
by
Atsushi Tadokoro
RubyによるMac OS Xデスクトップアプリケーション開発入門
by
宏治 高尾
MacRubyとHotCocoaでMacのアプリを作ってみた
by
Yukimitsu Izawa
Cocos2d xをさらにさわってみよう!
by
Tomoaki Shimizu
Cocos2d xをさわってみよう!
by
Tomoaki Shimizu
MacRuby を使ってみました
by
Yoshiyuki MIYAGI
Code injectiontool
by
Shunsuke Araki
Xcode 7 の新しいところ #cm_ios9
by
Tomohiro Kumagai
Cocos2dx 8hour
by
Tomohiko Okita
Cocos2d-x公開講座 in 鹿児島
by
Tomoaki Shimizu
cocos2d-xハンズオン勉強会 in 名古屋
by
Tomoaki Shimizu
24時間でiOSアプリ-Twitterクライアント-の作成にチャレンジ
by
聡 中川
1.29.user,user,user
by
Tonny Xu
cocos2d-xとCocosBuilder
by
Tomoaki Shimizu
かんたんなcocos2d-xの紹介
by
Tomoaki Shimizu
Macでcocos2d-x 2.1.2を使用した、Androidアプリの開発環境構築について
by
Tomoaki Shimizu
cocos2d-x公開講座 in 鹿児島
by
Tomoaki Shimizu
Macでcocos2d-x 3.0alphaを使用した、iOSアプリの開発環境構築について
by
Tomoaki Shimizu
iPhoneアプリを作ってみよう
by
Nagao Shun
CDI, Seam 3 and Forge
by
nekop
More from 京大 マイコンクラブ
PDF
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
by
京大 マイコンクラブ
PDF
暗号技術入門 秘密の国のアリス 総集編
by
京大 マイコンクラブ
PDF
Common Lisp入門
by
京大 マイコンクラブ
PDF
C#でゲームを作る2016 第8回
by
京大 マイコンクラブ
PDF
かわいくなろうとしたら語彙力が下がった話
by
京大 マイコンクラブ
PDF
ドット絵でプログラミング!難解言語『Piet』勉強会
by
京大 マイコンクラブ
PPTX
女の子になれなかった人のために
by
京大 マイコンクラブ
PDF
Pietで競プロしよう
by
京大 マイコンクラブ
PDF
セミコロンレスc++
by
京大 マイコンクラブ
PDF
Geometry with Unity
by
京大 マイコンクラブ
ODP
もし太陽のコアがIntelCoreだったら
by
京大 マイコンクラブ
PDF
プログラムを高速化する話Ⅱ 〜GPGPU編〜
by
京大 マイコンクラブ
PDF
つくってあそぼ ラムダ計算インタプリタ
by
京大 マイコンクラブ
PDF
多倍長整数の乗算と高速フーリエ変換
by
京大 マイコンクラブ
PDF
エンジニアと健康
by
京大 マイコンクラブ
PDF
Altseed
by
京大 マイコンクラブ
PPTX
hideya流 テストプレイ観察術
by
京大 マイコンクラブ
PDF
No SSH (@nojima; KMC関東例会)
by
京大 マイコンクラブ
PDF
テキストファイルを読む💪 第1回
by
京大 マイコンクラブ
PDF
DTM練習会2017第1.5回 「伴奏の付け方」
by
京大 マイコンクラブ
C# ゲームプログラミングはホントにメモリのことに無頓着でいいの?
by
京大 マイコンクラブ
暗号技術入門 秘密の国のアリス 総集編
by
京大 マイコンクラブ
Common Lisp入門
by
京大 マイコンクラブ
C#でゲームを作る2016 第8回
by
京大 マイコンクラブ
かわいくなろうとしたら語彙力が下がった話
by
京大 マイコンクラブ
ドット絵でプログラミング!難解言語『Piet』勉強会
by
京大 マイコンクラブ
女の子になれなかった人のために
by
京大 マイコンクラブ
Pietで競プロしよう
by
京大 マイコンクラブ
セミコロンレスc++
by
京大 マイコンクラブ
Geometry with Unity
by
京大 マイコンクラブ
もし太陽のコアがIntelCoreだったら
by
京大 マイコンクラブ
プログラムを高速化する話Ⅱ 〜GPGPU編〜
by
京大 マイコンクラブ
つくってあそぼ ラムダ計算インタプリタ
by
京大 マイコンクラブ
多倍長整数の乗算と高速フーリエ変換
by
京大 マイコンクラブ
エンジニアと健康
by
京大 マイコンクラブ
Altseed
by
京大 マイコンクラブ
hideya流 テストプレイ観察術
by
京大 マイコンクラブ
No SSH (@nojima; KMC関東例会)
by
京大 マイコンクラブ
テキストファイルを読む💪 第1回
by
京大 マイコンクラブ
DTM練習会2017第1.5回 「伴奏の付け方」
by
京大 マイコンクラブ
Cocoaアプリに無理矢理プラグインを導入する入門
1.
Super Simple Cocoa Plugin
Introduction nendoki
2.
コレって誰よ 上田 宗一郎(うえだ ソウイチロウ) id:
nendoki (a.k.a ne[tab]) 京都大学大学院情報学研究科M1 親の代からMac使い
3.
mac? スタバドヤ顔マン御用達アイテムNo1 パロアルト研究所からアイディア持ち出したアレ ディスプレイ上のサイズ=印刷サイズで有名
4.
本日話す事 コレがしたい 前提のお話 今回必要となる技術 実際にアプリを見てみよう
5.
本日話す事 コレがしたい 前提のお話 今回必要となる技術 実際にアプリを見てみよう
6.
Macアプリ作ってますか?
7.
Q. 今使っているプログラム が*微妙に*機能不足だ
8.
Windows的解法 フリーウェアに 良いのがあるよ!!
9.
富豪的解法 金を払えば良い
10.
プログラマ的解法 自分で作る
11.
FSF的解法 GPLコード片が 埋め込まれていないか探す
13.
よりよい解法 既存のアプリを修正しよう
14.
という事で Mac用Cocoaアプリケーションに自分で機能を追加 して幸せを得よう
15.
本日話す事 コレがしたい 前提のお話 今回必要となる技術 実際にアプリを見てみよう
16.
前提のお話 Objective-Cってなんそ ObjC流記法 Cocoa Framework
17.
前提のお話 Objective-Cってなんそ ObjC流記法 Cocoa Framework
18.
Objective-C! || C + SmallTalk
19.
SmallTalkな箇所のみ解説します
20.
メッセージ呼び出し メンバメソッドの呼び出しの事 メッセージ 単項メッセージ キーワード付きメッセージ 二項メッセージ(SmallTalkのみ 可変長引数や部分的にキーワードの無いメッセージは省略
21.
単項メッセージ [obj message]; 他言語のobj.message()に対応 キーワード付きメッセージ [obj message:arg0
key1: arg1 key2:arg2 ..]; 他言語ではobj.message(arg0, arg1, arg2…)とか obj.message(arg0, key1=arg1, key2=arg2, …)に対応
22.
クラスの定義(ObjC固有) @interfaceでインターフェース定義(ヘッダー) @imprementsで実装を定義(ボディー) インスタンスメソッド - (型)methodName:(型)arg0 key1:(型)arg1; クラスメソッド +
(型)methodName:(型)arg0 key1:(型)arg1;
23.
@interface AGSampleLayer :
CALayer { CALayer *floorLayer; } + (id)layer - (void)resizeWithSize:(CGSize)size; @end ! @implementation AGSampleLayer + (id)layer { … return self; } ! - (void)resizeWithSize:(CGSize)size { … } @end
24.
カテゴリ クラス定義を複数回に分けて記述 既存のクラスに動的にメソッド追加が可能 フレームワークのクラスにも可能 実装を機能別に別のヘッダーに…なんてことも
25.
オーバーロードについて オーバーロードは存在しない メッセージ名を変える事で区別 メッセージ名にはキーワードを含める -(id)initWithFrame:(NSRect)frame style:(ViewStyle)style 識別子:-initWithFrame:style:
26.
良くある例 -(id)init -(id)initWithData:(NSData *)data -(id)initWithData:(NSData *)data
withSize:(int)size それぞれ別の識別子のため問題無し 返り値の型を合わせるのはマナー
27.
id? 特殊な型id 全てのオブジェクト型から暗黙のキャスト可能 存在しないメッセージは無視される コンパイルエラーにはならない 要するに任意のメッセージを受ける事を主張した Object *と覚えておこう
28.
前提のお話 Objective-Cってなんそ ObjC流記法 Cocoa Framework
29.
クラス名について Objective-Cには名前空間が無い 元ネタのC言語には無いから仕方ないね そこで関数/クラス名に二文字程度の識別子を使う NSObject (NextStep Famework由来のため) CGRect
(CoreGraphicsの機能のため)
30.
インスタンス化 インスタンスを「作る」メッセージ +alloc インスタンスを「初期化する」メッセージ -init -initWithHoge:
31.
実際に使う場合 NSDate *date =
[[NSDate alloc] init]; 現在時刻で初期化 NSImage *img = [[NSImage alloc] initWithData:bin]; 指定したデータで画像オブジェクトを作成
32.
-initの書き方 親の-initを明示的に呼び出し、自身に代入 返り値も自分自身とする - (id)init { if(self =
[super init]) { // 初期化コードを記入 } return self; }
33.
インターフェースの実現 あるメソッドを実装している事を期待したい 1. @protocolを利用する 速度を気にしない限り使わない 2.NSObjectをカテゴリで拡張する ルートオブジェクトが既に実装済み = 子クラスの対応は任意
34.
getter/setter int hogeなメンバ変数を持つとする getter -(int)hoge setter -(void)setHoge:(int)newhoge ObjC2.0から@propertyによってこの2つは自動生成可能に
35.
前提のお話 Objective-Cってなんそ ObjC流記法 Cocoa Framework
36.
Cocoa Framework? Macアプリケーションの基本ライブラリ Cocoa Frameworkは複数のフレームワークの集合 Foundation
Framework Appkit Framework Coredata Framework
37.
標準ライブラリは? Foundation Frameworkが提供するもの NSObject NSArray NSString NSDictionary and so
on..
38.
言語の基本的な機能が集まっている NSObject? 全てのクラスのルートクラス 他のフレームワークも必ず依存している …事になっている
39.
AppKit? Appkit Framwork アプリケーションのビュー イベント処理 AppleScript ランループとかもここから
40.
本日話す事 コレがしたい 前提のお話 今回必要となる技術 実際にアプリを見てみよう
41.
本日使う技術 アプリに侵入しよう! アプリを理解しよう! アプリを乗っ取ろう! アプリを操作しよう!
42.
本日使う技術 アプリに侵入しよう! アプリを理解しよう! アプリを乗っ取ろう! アプリを操作しよう!
43.
で、どうやって侵入するの
44.
古い方法 IMのフリをする /Library/InputManagers Cocoaアプリは必ずこのフォルダにある実行 ファイルを無条件にロードしていた 今は駄目です
45.
SIMBLに頼ろう SIMple Bundle Loader Cocoaアプリに外部プラグインをロードさせる /Library/Application
Support/SIMBL/Plugins
46.
使い方 Info.plist(アプリケーション設定ファイル)に記述 SIMBLTargetApplicationsキーで、以下の辞書の配列を 設定 BundleIdentifier: 対象アプリ MaxBundleVersion: 読ませる最大バージョン MinBundleVersion:
対応する最小のバージョン
47.
+(void)loadを実装する プラグインが読み込まれた際に必ず呼ばれるメッ セージ シングルトンインスタンスを返す実装が望まし い 複数回呼ばれる場合がある -initのつもりで書いてはだめ
48.
SIMBLはIMじゃないの? AppleScriptを侵入経路として使っているらしい IMを使う方法は最新ではない
49.
準備 1. アプリケーションの起動監視アプリを用意 2. AppleEvent
Handlerアプリを別途用意 手順 1. アプリの起動を検知 2. 起動したアプリに対して、Handlerを起動するAppleEvent を送信 3. HandlerはSIMBLプラグインを読み込む
50.
本日使う技術 アプリに侵入しよう! アプリを理解しよう! アプリを乗っ取ろう! アプリを操作しよう!
51.
で、何を書き換えればいいの?
52.
侵入したそのあとに 「侵入してもグローバル変数しか書き換えられま せん」では意味が無い しかも書き換えられるグローバル変数すら分か らない せめて乗っ取れる機能とか調べたいよね
53.
ここで問題だ バイナリの固まりであるアプリケーションから どうやってAPIを見つけ出すか 1. ハンサムなデバッガが突如ソレらしいメソッド を発見してくれる 2. それっぽいツールが助けてくれる 3.
何も無い、現実は非常である
54.
1を試す 1.XCode.appを起動する 2.対象アプリにアタッチし、無 理矢理停止する 3.目標の関数が起動しそうなイ ベントを発火させる 4.Step & Trace!
55.
(僕には)無理でした (努力次第ではなんとかなりそう)
57.
2を試す あー、どこかにコマンド一発で@interface情報をま とめてくれる便利なコマンド無いかなー カテゴリとかもちゃんと区別して出力してくれる と良いなー メンバ変数とかプライベートメソッドとか出力さ れたら言う事無いんだけどなー
58.
Class-dump http://stevenygard.com/projects/class-dump/ command-line utility for
examining the Objective-C runtime information stored in Mach-O files.
59.
Usage: class-dump [options]
<mach-o-file> -C <regex> 正規表現にマッチするもののみを 出力 -H ヘッダーファイルとして出力 -r 共有ライブラリも出力 --sdk-root SDKのパスを指定
60.
Dock.appで試す class-dump /System/Library/CoreServices/Dock.app/ Contents/MacOS/Dock -H
--sdk-root /Applications/ Xcode.app/Contents/Developer/Platforms/ MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk -H: ヘッダーファイルとして出力 --sdk-root: ヘッダーファイルにシステムのフ レームワークを含めない
62.
CALayer- CALayerAdditions.h CALayer- ECModalEventDeleg ate.h CDStructures.h DBAttachedWindow .h DBDebugWidgetPro cess.h DBDebugWidgetSer ver.h DBRippleInfo.h DBSpringboard.h DBWidget.h DBWidgetProcess.h DOCKAppDeathEve nt.h DOCKAppHideEvent. h DOCKAppLaunchCo mpleteEvent.h DOCKAppLaunchEv ent.h DOCKAppNeedsAtte ntionEvent.h DOCKAppRevealEve nt.h DOCKAutoHideDisa bledEvent.h DOCKAutoHideEnab ledEvent.h DOCKBlockEvent.h DOCKBounceEvent. h DOCKDashboardTile .h DOCKDesktopTile.h DOCKDisplayChang edEvent.h DOCKDownloadDire ctory.h DOCKDownloadMan ager.h DOCKDownloadPro gressHandler- Protocol.h DOCKDragDropEven t.h DOCKDragEnterEve nt.h DOCKDragLeaveEve nt.h DOCKDynamicFolde r.h DOCKEvent.h DOCKExtraDelegate -Protocol.h DOCKFileTile.h DOCKFileTileFactory .h DOCKFloorLayer.h DOCKFloorShadowL ayer.h DOCKFolder.h DOCKFolderTile.h DOCKFolderTileCac heEntry.h DOCKGestureDefaul tHandler.h DOCKGestureEvent. h DOCKGestureHandl er-Protocol.h DOCKGestures.h DOCKGlassFloorLay er.h DOCKGridLayer.h DOCKIndicatorLayer .h DOCKInsertTile.h DOCKInstallAddOpe ration.h DOCKInstallMoveOp eration.h DOCKInstallOperati on.h DOCKInstallRemove Operation.h DOCKInstallTransac tion.h DOCKInstallUpdate Operation.h DOCKInternalDropE vent.h DOCKLabelLayer.h DOCKMaximizeWin dowEvent.h DOCKMaximizeWin dowWithOrderEvent .h DOCKMaximizeWin dowsEvent.h DOCKMiniView.h DOCKMiniViewLayer .h DOCKMinimizedWin dow.h DOCKMinimizedWin dowEvent.h DOCKMinimizedWin dowsEvent.h DOCKMouseEnterEv ent.h DOCKMouseLeaveE vent.h DOCKOrientationCh angedEvent.h DOCKPSNEvent.h DOCKPeriodicMess ageTrace.h DOCKPreferences.h DOCKProcessTile.h DOCKRecentsContr oller.h DOCKRecentsModel .h DOCKRecentsTile.h DOCKReflectionLay er.h DOCKRemoveWindo wsEvent.h DOCKScreenSharin gModel.h DOCKScreenSharin gTile.h DOCKSeparatorTile. h DOCKSetWindowTitl eEvent.h DOCKSideGlassFloo rLayer.h DOCKSmartFolderTi le.h DOCKSpacerTile.h DOCKStack.h DOCKStackActionH andling-Protocol.h DOCKStackActionS ender-Protocol.h DOCKStackAnimato r.h DOCKStackBackgro undLayer.h DOCKStackBlurWin dow.h DOCKStackCollapse dDataSource- Protocol.h DOCKStackDataSou rceClient-Protocol.h DOCKStackExpande dDataSource- Protocol.h DOCKStackExpande dHandler.h DOCKStackExpande dItemLayer.h DOCKStackExpande dLayer.h DOCKStackFanAnim ator.h DOCKStackFanItem Layer.h DOCKStackFanLaye r.h DOCKStackGoBack ButtonLayer.h DOCKStackGridAni mator.h DOCKStackGridHov erLayer.h DOCKStackGridItem Layer.h DOCKStackGridLaye r.h DOCKStackItem- Protocol.h DOCKStackLayer.h DOCKStackListAnim ator.h DOCKStackListItem Layer.h DOCKStackListLaye r.h DOCKStackPreview. h DOCKStaticScreenS haringModel.h DOCKTileEvent.h DOCKTileLabelLayer .h DOCKTileLayer.h DOCKTileRemovedE vent.h DOCKTileShadowLa yer.h DOCKTrashTile.h DOCKURLTile.h DOCKUpdateMinimi zedWindowEvent.h DOCKWindowCopy. h DOCKWindowEvent. h DOCKWindowTile.h DOCKWindowUnreg isteredEvent.h DPAnimationTimer. h DPBackgroundDesk topPicture.h DPBackgroundDesk topPictureInfo.h DPColorSpace.h DPDefaultPictureInf o.h DPDesktopPicture.h DPDesktopPictureM anager.h DPDesktopWindow- Protocol.h DPDirectoryFileListi ng.h DPDummyRenderO bject.h DPFileListing.h DPPictureInfo.h DPPictureStorage.h DPRemoteConnecti on.h DPSharedDesktopI mage.h DPSharedSlot.h DPStatementCache. h DPTiledPictureInfo. h DPWakeupSource.h DPiLifeFileListing.h DRAGTimerInfo.h DockExtra- Protocol.h DockExtra.h DockExtraManager. h DockExtraServer.h DockNotificationCe nter.h ECAlertPanel.h ECAlertPanelDelega te-Protocol.h ECAliasHandle.h ECButtonLayer.h ECCalloutLayer.h ECConsedEvent.h ECCoverFlow.h
64.
無数にソレっぽいファイルが出て来た 概観すると4つくらいの名前空間が見える WVSystemSpace.h LPAppManager.h ECCoverFlowItemLayer.h DOCKStackListLayer.h
65.
WV系はなぜかSpacesっぽい名前のクラスが多い? ソレらしいメンバ変数を持つクラスを乗っ取れば 操作が出来るに違いない ソレらしいイベントリスナーを持つクラスを乗っ 取れば、イベントドリブンが成立するに違いない
66.
本日使う技術 アプリに侵入しよう! アプリを理解しよう! アプリを乗っ取ろう! アプリを操作しよう!
67.
おまたせしました 乗っ取りのお時間です
68.
乗っ取り乗っ取り言うけどさ 具体的な乗っ取り手法って? poisng(古い) method swizzling(新しい)
69.
まずはpoisngから posing: 「クラステーブルを書き換えることでクラ スの実体を置き換える技法。」 via Wikipedia 既存のクラスを実行時に置き換える手法らしい
70.
ClassAをClassBでposingを用いて乗っ取る例 制限 ClassBはClassAの直接のサブクラスであること ClassBはメンバ変数を持たないこと ClassAのインスタンスが存在しないこと
71.
図 ClassA instanceA2instanceA1 posing ClassB instanceA2instanceA1 ClassA
72.
poseAsClass:によって実現できた 現在(ObjC2.0)では推奨されない
73.
Method Swizzling メソッドの実装を動的に入れ替える技法 libobjcランタイムでサポート ObjC2.0でも動作
74.
libobjcの関数群 Method class_getInstanceMethod(Class aClass,
SEL aSelector) Classからインスタンスメソッドを取得 Method class_getClassMethod(Class aClass, SEL aSelector) Classからクラスメソッドを取得
75.
libobjcの関数群 id objc_getClass(const char
*name) nameクラスのClassを得る NSClassFromStringでも可 void method_exchangeImplementations(Method m1, Method m2) Methodの実装を置換する
76.
例: 既存クラスのインスタンスメソッド同士を置換 void SwizzleInstanceMethod
(Class cls, SEL old, SEL new) { Method mold = class_getInstanceMethod(cls, old); Method mnew = class_getInstanceMethod(cls, new); if (mold && mnew) method_exchangeImplementations(mold, mnew); }
77.
実際の使い方 カテゴリを使って対象クラスにメソッドを追加し、 swizzlingする 元のメソッドを呼び出す場合は自分自身を呼び出 す事で実現 実装が入れ替わっているため
78.
乗っ取り用メソッド実装例 @implementation NSObject (BlackDock) -
(void)BlackDock_DOCKTrashTile_open { [self BlackDock_DOCKTrashTile_open]; [self someEventHook]; } @end
79.
乗っ取り例 @implementation BlackDock + (void)load {
Class cls = NSClassFromString(@"DOCKTrashTile"); SEL old = @selector(open); SEL new = @selector(BlackDock_DOCKTrashTile_open); SwizzleInstanceMethod(cls, old, new); } @end
80.
例の解説 DOCKTrashTileというクラスのopenを BlackDock_DOCKTrashTile_openで置換 openの元の実装の挙動を優先する 乗っ取るメソッドは@selectorで指定
81.
本日使う技術 アプリに侵入しよう! アプリを理解しよう! アプリを乗っ取ろう! アプリを操作しよう!
82.
ヘッダーを再配布したら怒られない?
83.
無理矢理呼び出しましょう あると分かっているならリフレクション使えば良 いよね メンバ変数を呼ぶ時: class_getInstanceVariable メンバメソッドを呼ぶ: NSInvocation
84.
変数読み出し Ivar class_getInstanceVariable(Class cls, const
char* name) クラスの表現clsからnameの変数を取り出す id object_getIvar(id object, Ivar ivar) objectから表現ivarに対応する変数の値を得る
85.
例(あるオブジェクトからメンバ変数を取り出す) Ivar getInstanceVariable(id obj,
const char *name, void **value) { Ivar ivar; if ((ivar = class_getInstanceVariable(object_getClass(obj), name))) { if (value) *value = (__bridge void *)object_getIvar(obj, ivar); return ivar; } }
86.
メソッド呼び出し メッセージの識別子としての表現: @selector(hoge:) 方法1 NSInvocation: 静的にメッセージ呼び出しを実現する プロキシクラス 方法2 NSObjectの-performSelector:を使う
87.
NSProxy - (NSMethodSignature *) methodSignatureForSelector:(SEL)aSelector あるオブジェクトのメソッドを表すシグニチャ NSInvocation +
(NSInvocation *)invocationWithMethodSignature: (NSMethodSignature *)signature シグニチャに対して実際に値を適用する
88.
void invoke(id target,
SEL selector, void *arg1, void *ret){ NSMethodSignature *sig = [target methodSignatureForSelector:selector]; NSInvocation* inv = [NSInvocation invocationWithMethodSignature:sig]; [inv setSelector:selector]; // メッセージを [inv setTarget:target]; // どのオブジェクトに対して [inv setArgument:arg1 atIndex:2]; // 第1引数をarg1として [inv invoke]; // 呼び出す [inv getReturnValue:ret]; // 返り値をポインタに代入 }
89.
もう少し楽に え?面倒くさい? 引数無くても書かなきゃならんのか NSObject - (id)performSelector:(SEL)aSelector aSelectorは単項メッセージ限定
90.
例 [spaces performSelector:@selector(displays)] 同じ例 invoke(spaces, @selector(displays),
NULL, NULL);
91.
本日話す事 コレがしたい 前提のお話 今回必要となる技術 実際にアプリを見てみよう
92.
本日のテーマ Dock.app
93.
サンプルアプリ 作ったもの見せたかったけど時間無いしね サンプルアプリ「BlackDock.app」 ゴミ箱をクリックしたらDockがかっこ良くなる
94.
仕組み 1. ゴミ箱のクリックのイベントを監視する 2. Dockのベースを形作るビューを取得する 3.
自力で書いたレイヤーで置き換える
95.
だします
Download