iOSOpenDevでのActivatorTweakとホーム画面にアイコンが表示される脱獄アプリの開発

# イントロダクション
こんにちは！ @Adolfoi です。
iOS Jailbreaking Advent Calendar 2015に参加させて頂くことになりました。
よろしくお願いします。

さて、今回はiOSOpenDevを利用したActivatorリスナーと、ホーム画面にアイコンが表示されるタイプの脱獄アプリの開発をご紹介致します。

iOSOpenDevの概要につきましては、wa_kinchanさんが13日目で執筆されてますのでご参照ください。

この記事ではXcode7.2とiOSOpenDev1.6-2を使っています。
iOS8以上の環境で実行できます。

#今回の開発に必要な脱獄アプリ
・UIKit tools
・Activator
・iOS Terminal

UIKit toolsとiOS Terminalは「uicache」で表示されていないアイコンを表示させるのに使います。
Activatorのアプリですので、Activatorが必要です。
以上3つのアプリを事前にCydiaからインストールしておいてください。

# 開発開始
まず Xcode>メニューからFile>New>Project...　を選択します。
iOS > iOSOpenDev　から、Activator Listenerを選択。
Product Name に「Advent」と入力します。

次に「libactivator」をiPhoneなどから持ってきて、
opt/iOSOpenDev/libに入れておきます。
そしてそれをAdventプロジェクトのFrameworksにドラッグアンドドロップします。
これでActivatorを使う準備ができましたので、
Advent.mのコードを編集します。

# ソースコードを編集
すべて選択して、コピーアンドペーストしてください。

``` Advent.m
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import <libactivator/libactivator.h>

//#error iOSOpenDev post-project creation from template requirements (remove these lines after completed) -- \
 Link to libactivator.dylib: \
 (1) go to TARGETS > Build Phases > Link Binary With Libraries and add /opt/iOSOpenDev/lib/libactivator.dylib

@interface Advent : NSObject<LAListener, UIAlertViewDelegate> {
@private
	UIAlertView *av;
}
@end

@implementation Advent

- (BOOL)dismiss
{
	//if (av)
	//{
	//	[av dismissWithClickedButtonIndex:[av cancelButtonIndex] animated:YES];
	//	return YES;
	//}
	return NO;
}

- (void)alertView:(UIAlertView *)alertView willDismissWithButtonIndex:(NSInteger)buttonIndex
{
}

- (void)activator:(LAActivator *)activator receiveEvent:(LAEvent *)event
{
	if (![self dismiss])
	{
		av = [[UIAlertView alloc] initWithTitle:@"Advent" message:[event name] delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil];
		[av show];
		[event setHandled:YES];
	}
}

- (void)activator:(LAActivator *)activator abortEvent:(LAEvent *)event
{
	// Called when event is escalated to higher event
	[self dismiss];
}

- (void)activator:(LAActivator *)activator otherListenerDidHandleEvent:(LAEvent *)event
{
	// Called when other listener receives an event
	[self dismiss];
}

- (void)activator:(LAActivator *)activator receiveDeactivateEvent:(LAEvent *)event
{
	// Called when the home button is pressed.
	// If showing UI, then dismiss it and call setHandled:.
	//if ([self dismiss])
	//	[event setHandled:YES];
}


+ (void)load
{
	@autoreleasepool
	{
		[[LAActivator sharedInstance] registerListener:[self new] forName:@"info.adolfoi.Advent"];
	}
}

@end
```

#ホーム画面にアイコンを出す
脱獄アプリの中にはホーム画面にアイコンが出ないものも多いのですが、
ホーム画面にアイコンを出してみます。
こうしたほうが便利な場合もあります。アプリ内で完結する脱獄アプリなど。

まずプロジェクトのrootフォルダ>Advent>Packageに、「Applications」フォルダを作成します。

次にXcode>メニューからFile>New>Target...をクリックします。
Master-Detail Applicationを選択します。
NameはCalendarとして作成します。

#CalendarのBuild Settingsを編集
一番下にUser-Definedを追加してください。
Adventターゲットと全く同じにします。



#いったんビルド
ターゲットをCalendarにしてから、一度ビルドします。
これでCalendar.appがビルドできました。
Products>Calendar.appを右クリック>Show in Finderで表示させます。

#Calendar.appをApplicationsフォルダにコピー
先ほど作成したプロジェクトのrootフォルダ>Advent>Package>Appkicatonsにcalendar.appをコピーアンドペーストします。

#Adventをビルド
TargetをAdventに切り替えます。
そしてXcodeメニューから Product>buid> buid for profilingします。

問題が無ければ、無事ビルドに成功すると思います。

#アイコンが表示されない・・・！？
インストールに成功しても、アイコンが最初は表示されていないかと思います。
「安心してください、入ってますよ。」

iOS Terminalを開き、「uicache」と打ち込んでエンターを押してみてください。
しばらくすると、アイコンが表示されます。

また、これでActivatorアプリもActivatoから起動できます。

#サンプルコードダウンロード
Githubにサンプルコードを上げました。
よろしくお願いします。
[リンク] https://github.com/Adolfoi/Advent