I can easily find a way for adding actions in activator.
( http://iphonedevwiki.net/index.php/Libactivator

This is the way to add event (like shake device..) for activator on iDevice.

First, You need libactivator.h
If you installed THEOS, you can find this. But that does not have interface for adding event.
So you need get libactivator.h from Ryan Petrich's github(Click Here).

Next, Add these code on your project.

Click ↓ (From source of libactivator - Link ) 
Then, when you call init, you event is added to activator.
I called init from Mobile Substrate Extension(.dylib) like this

Click ↓



You can called your event like this.
Click ↓(From source of libactivator - Link )



Thank you for reading my terrible English..TT

If you cannot understand this, you can find a lot of information here

https://github.com/rpetrich/libactivator  :  source of libactivator
 - LADefaultEventDataSource.m
: Add Event
 - Events.m
: Call Event
 - libactivator-private.h
: Interface of aboves

 - libactivator.h
 - libactivator.m



아.. 누구 저의 X같은 영어 교정해주실 천사 같으신 분 없을까요..?ㅠ 
음... MobileSubstration Extension 을 동적라이브러리로 불러도 되는건가..? 뭐 일단 이 문제는 패쓰하고;;

이것 역시 유입경로 보고 하는 포스팅! ㅋ


LibActivator 와 연동하기 위해선 우선
libactivator.h (THEOS 를 사용하기 위해 헤더들을 받았다면 그안에 있다.[<LibActivator/libactivator.h>] 없다면... 구글에 검색하면 아마 나올듯..?)
그리고 libactivator.dylib . 어디서 가져왔는지 기억이 안난다;; 걍 두개다 첨부할께요..ㅠ


뭐.. 별다른 문제 없겠지...?

위 두개를 받아서 프로젝트에 추가한다. 
dylib 파일의 경우엔 Link Binary With Libraries 에 추가해야 되는데 걍 집어넣으면 됬던지 기억은 잘 안난다.
아 몰라 자세한건 알아서해 


libactivator.h 임포트 해주고 

+ (void)load

{

[[LAActivator sharedInstance] registerListener:[self new] forName:@"%%%%%"];

} 

- (void)activator:(LAActivator *)activator receiveEvent:(LAEvent *)event

{

if ( 앱이 활성화 중이라면 ) {


return;

}else{
 

        //callShowWindow();

        [event setHandled:YES]; // To prevent the default OS implementation

    }

}


- (void)activator:(LAActivator *)activator abortEvent:(LAEvent *)event

{

// Dismiss your plugin

    

}
 

를 추가해준다. %%%%%는 알아서 수정해 둘것. 앱이름이나 BundleIdentifier 등으로 해두면 된다. 크게 상관없으니 중복만 안되도록 해줄것. 참고로 나같이 프로그래밍 잘 모르면서 덤비는 사람을 위해 적자면, 따로 load 를 호출안해줘도 된다.
앱 활성화 확인 방법은 걍 간단하게 BOOL 변수 하나 만들어서 사용해도 잘되더라.


그다음 /Library/Activator/Listeners/%%%%%/info.plist 를 만든다. %%%%%는 당연히 알겠지만 위에서 지정한 것과 똑같이 하면 된다. info.plist 에서 String 타입의 Description과 title 키를 만들어 알아서 값 넣어주고 아이콘도 있으면 지정해주면 뜬다. 
 
자. 이제 Activator 에서 보면 내가 지정한대로 뜰것이다.
호출되는지 까지 확인하면 Activator 와 사용할 준비는 끝!
 


제대로 된걸 보려면
http://iphonedevwiki.net/index.php/Libactivator 

'개발개발 > Mac, iOS' 카테고리의 다른 글

THEOS 에서 libactivator 사용하기  (0) 2011.08.11
LibActivator add Event (Not Listners)  (0) 2011.08.08
권한 설정 성공!  (0) 2011.02.24
Xcode - Device Log 보기  (0) 2011.02.23
BundleIdentifier로 앱 정보 구하기  (4) 2011.02.23
며칠전, XCode4 정식버젼이 맥용 앱스토어 버젼으로 나왔다.
개발자 인증(유료)를 한 사람은 개발자 센터에서 무료로 다운이 가능하고, 그 외 사용자에게는
$5에 배포되고 있다.. 이전에 무료인 것에 비하면 아쉽지만, 개발툴 치고는 싼편!

내 맥에서 인터페이스 빌더오류로 난리 났었기에 그냥 아무 생각없이 바로 구매하였다..

맥용 앱스토어에 가면 볼수 있다. 가격은 위에서 말했듯이 $4.99 (평가 왜저래;;)


다운 완료시 애플리 케이션 폴더에 위와 같이 인스톨 프로그램이 설치되며, 실행할 경우 기본 버젼과 마찬가지로
/Developer 에 설치를 시작한다. XCode3 이 설치되어 있을 경우 기본 버젼은 Developer-old 로 이름 변경 후 설치가 진행된다
상당히 오래 걸렸던듯...


메인화면은 디자인의 변경 외엔 눈에 띄는게 없다! ㅋ



상단 부분이 통합되었다는 느낌이다. 특히 인터페이스 빌더와 info.plist 파일...
전체적인 디자인과 몇몇 메뉴가 이동하다 보니 xcode3에도 적응이 안되던 나에겐 너무나 헷갈린다;;;;



그리고 좀 편해졌다고 느껴진게 뭔가 기존 xcode와 organizer 가 서로 연동.. 되는게 많아 진것 같다
원랜 window메뉴에 숨어있다 보니 organizer 처음에 개발자 등록할때만 쓰고 있는지도 모르는 사람도 있었는데..
이젠 그런일 없으려나..?


잠깐 사용해보면서 불편한 점으로는 코드에서의 에러를 실시간으로 계속 스캐닝 하던데, 그래서 상당히 귀찮아 졌다..
코드 작성중엔 다음줄에 계속 에러로 뜨니 상당히 거슬리고, 변수 선언시에도 계속 오류를 뿜어내고 있으니
뭔가 계속 신경쓰인다;; 그냥 기존처럼 빌드 하면서 에러 체크하는게 더 좋았던 듯;;;(나 같으면 에러 체크 용으로 커맨드+B 사용..ㅋㅋ)

Unit Test 란 뭔가 이상한 것도 추가됬는데 뭔지 모르겠으니 패쓰;;


메이저 업데이트이긴 하나, 내부적으로 크게 바뀐건 없는 듯 하다... 기존 Mobile Substrate Extension 사용법이나,
XCode Code Sign Pass 모두 4버젼에서 사용 가능하다고 한다.(아직 사용은 못해봤다..ㅎㅎ)



아직 제대로 사용은 못해봤지만, 친해지도록 노력 해봐야지;;

'개발개발 > 기타' 카테고리의 다른 글

[Mac / Ubuntu] Go (golang) 설치하기  (0) 2015.12.22
winapi gdi+ image load and convert to HBITMAP  (0) 2015.11.02
Surrounded 스킨 깨짐 해결  (0) 2015.06.07
python to exe  (2) 2015.02.25
[XCode5] 부분적으로 MRC 사용  (0) 2013.12.15
와하하하하핳 성공했다!!!ㅋㅋㅋ
어제+오늘 아침 아이폰으로 열심히 아무리 찾아도 없더니 오늘 다시 한 5분 찾으니 바로 나오네..ㅡㅡ
아 기분 좋긴 한데 살짝 빡..;;ㅋㅋ

permission 이라 암만 검색해도 안나오던데.. filemanager에 떡하니 nil이란 인수를 받고 있는 attributes 가 정답.. 아놔.. 미리 볼껄..ㅠㅠㅠㅠ

내가 검색한 소스는

(아마 디렉토리 퍼미션 변경인듯..... 적당히 수정하자.)
- (void)chmodOpen
{
  NSString *path = @"/hardcoded_path_of_directory";
  NSFileManager *manager = [[[NSFileManager alloc] init] autorelease];
  BOOL isDir;
  if ([manager fileExistsAtPath:path isDirectory:&isDir]&&isDir) {
      NSDictionary *attrib = [NSDictionary dictionaryWithObjectsAndKeys:
              [NSNumber numberWithUnsignedLong:511], NSFilePosixPermissions, nil ];
      NSError *error = nil;
      [manager setAttributes:attrib ofItemAtPath:path error:&error];
  }
	//Basically chmod 777 on directory;
}


이것.
중간에 numberWithUnsignedLong: 값을 수정함으로써 권한 설정을 바꿀 수 있다.
511:777
493:755

확인 방법은 

int perm = 0755;

NSLog(@"%d %o", perm, perm);

NSLog 로 중간중간 콘솔로 상태를 찍어보곤 하는데 시뮬레이터에선 디버거가 뜨지만
나같이 개발자 인증을 정식으로 돈주고 하지 않은 경우 디바이스 테스트를 할 수 없으며
XCode3 Code Sign 작 을 하여도 디버거가 뜨지 않는다... 하지만 방법이 있으니,
XCode를 실행하고 상단 메뉴에서 Organizer 를 실행하고
DEVICE - Console 을 선택한다.

NSLog로 출력되는 것이 Warning 으로 볼 수 있게 된다.

아는 사람에게는 너무나 당연하고 간단한 사실;;;ㅠ

-------------
XCode4 에서는 상단 우측에 있는 Organize 버튼을 누르면 된다. 
앞에 썼던 글의 연결이다...
특정 파일에 설치 정보가 기록되기 때문에 거기서 자료를 가져오는 방식..
더보기 클릭!


저장되는 데이터 키값들 (없는 것도 있고, 여기엔 있는데 실제론 없을 수도 있음.

역시 더보기!


이거 못찾았으면 하나하나 검색방식으로 구현할뻔;;ㅋㅋㅋㅋ

쨋든, 다행~!ㅎㅎ

'개발개발 > Mac, iOS' 카테고리의 다른 글

권한 설정 성공!  (0) 2011.02.24
Xcode - Device Log 보기  (0) 2011.02.23
앱 설치 여부 구하기  (0) 2011.02.22
DEBIAN PACKAGING (deb) 만들기 (수정)  (1) 2011.01.30
PreferenceLoader 사용법  (0) 2011.01.30
12.8 추가

새 방법은 앱스토어에서 사용가능한 방식입니다.
자세한건 새 글에서 소개..

====================

추가, 외국포럼에 보면 운좋게 심사를 통과후, 정상 작동한단 말이 있는것 같긴 하지만
쨋든 심사부터 통과못하는 것같고, 통과하더라도 작동하지 않는 듯...

canOpenURL 을 통해 여부를 확인하는걸 가장 추천하지만 여의치 않을때는....에라 모르겠다..ㅋ

====================

앱의 설치 여부를 알수 있는 소스. Bundle ID를 이용하며,
코딩은 이것저것 배려되어 있지만 상당수 제거해버려도 큰 상관이 없다...
원리는 
/var/mobile/Library/Caches/com.apple.mobile.installation.plist
파일에 모든 데이터가 기록되어 있다는 것을 이용.
사실 이것만 알면 아래 소스는 큰 필요가 없다.

코딩하기 귀찮을때 사용하자..ㅋㅋ

// Declaration
BOOL APCheckIfAppInstalled(NSString *bundleIdentifier); // Bundle identifier (eg. com.apple.mobilesafari) used to track apps

// Implementation

BOOL APCheckIfAppInstalled(NSString *bundleIdentifier)
{
	static NSString *const cacheFileName = @"com.apple.mobile.installation.plist";
	NSString *relativeCachePath = [[@"Library" stringByAppendingPathComponent: @"Caches"] stringByAppendingPathComponent: cacheFileName];
	NSDictionary *cacheDict = nil;
	NSString *path = nil;
	// Loop through all possible paths the cache could be in
	for (short i = 0; 1; i++)
	{
	
		switch (i) {
	case 0: // Jailbroken apps will find the cache here; their home directory is /var/mobile
		path = [NSHomeDirectory() stringByAppendingPathComponent: relativeCachePath];
		break;
	case 1: // App Store apps and Simulator will find the cache here; home (/var/mobile/) is 2 directories above sandbox folder
		path = [[NSHomeDirectory() stringByAppendingPathComponent: @"../.."] stringByAppendingPathComponent: relativeCachePath];
		break;
	case 2: // If the app is anywhere else, default to hardcoded /var/mobile/
		path = [@"/var/mobile" stringByAppendingPathComponent: relativeCachePath];
		break;
	default: // Cache not found (loop not broken)
		return NO;
		break; }
		
		BOOL isDir = NO;
		if ([[NSFileManager defaultManager] fileExistsAtPath: path isDirectory: &isDir] && !isDir) // Ensure that file exists
			cacheDict = [NSDictionary dictionaryWithContentsOfFile: path];
		
		if (cacheDict) // If cache is loaded, then break the loop. If the loop is not "broken," it will return NO later (default: case)
			break;
	}
	
	NSDictionary *system = [cacheDict objectForKey: @"System"]; // First check all system (jailbroken) apps
	if ([system objectForKey: bundleIdentifier]) return YES;
	NSDictionary *user = [cacheDict objectForKey: @"User"]; // Then all the user (App Store /var/mobile/Applications) apps
	if ([user objectForKey: bundleIdentifier]) return YES;
	
	// If nothing returned YES already, we'll return NO now
	return NO;
}
Here is an example of this, assuming that your app is named "yourselfmadeapp" and is an app in the app store. 
Code:
NSArray *bundles2Check = [NSArray arrayWithObjects: @"com.apple.mobilesafari", @"com.yourcompany.yourselfmadeapp", @"com.blahblah.nonexistent", nil];
for (NSString *identifier in bundles2Check)
	if (APCheckIfAppInstalled(identifier))
		NSLog(@"App installed: %@", identifier);
	else
		NSLog(@"App not installed: %@", identifier);


'개발개발 > Mac, iOS' 카테고리의 다른 글

Xcode - Device Log 보기  (0) 2011.02.23
BundleIdentifier로 앱 정보 구하기  (4) 2011.02.23
DEBIAN PACKAGING (deb) 만들기 (수정)  (1) 2011.01.30
PreferenceLoader 사용법  (0) 2011.01.30
MobileSubstrate Extension with XCode  (0) 2011.01.07
이글은 패키징을 직접 다 만들어서 하는 방법이다...
THEOS 를 이용해서 컴파일할 경우 makefile 약간 수정해서 걍 바로 한방에 패키징까지 하도록 하자;;;;; - 이거 설명은 나중에 하겠음!

이번 글은 데비안 패키지.
이건 다행이도 외국인의 친절한 유투브 동영상이 있었다..ㅎㅎ
하지만 맥에 dpkg를 설치하는데 좀 헤맨듯..

우선 MacPorts 를 설치해야 한다. 자세히는 모르겠지만
iPhone 의 apt-get 과 비슷한 역활을 하는듯.

다운을 받았으면 터미널을 실행하고

sudo port install dpkg

port 도 좋지만 homebrew 가 더 좋은듯.
이경우엔 sudo brew install dpkg

를 실행한다. 시간이 좀 걸림..(패스워드는 로그인한 계정의 비밀번호)

그다음 폴더를 하나 만들고 (폴더명은 크게 상관 없다.)
하위에 DEBIAN 폴더를 생성하고, 그안에 control 이라는 UTF-8 형식의 확장자 없는 파일을 만든다.(텍스트 편집기로 만들면 됨.)
내용은 아래와 같이...
[saurik 블로그에서 관련된 내용을 발견해서 조금 수정하겠음..ㅋ 원문은 : http://www.saurik.com/id/7 ]

Package: MyProgram
Version: 1.0
Architecture: iphoneos-arm
Depends: mobilesubstrate, preferenceloader
Replaces: MyProgram
Conflicts: MyProgram
Section: System
Maintainer: iolate <iolate@me.com>
Description: Lanch Banking app for jailbroken phone

Package 는 앱스토어앱들의 identifier 개념이다. 대문자로 적어도 모두 소문자로 인식.. 즉 대소문자 구분하지 않는다.
apt-get 등으로 받을때 사용되는 이름이기도 하다. 고로 고유해야 겠지?
 
Name 항목을 생성하고 넣을경우 시디아에선 이 Name 값이 나온다. 단, 사용자 필드이므로 빌드시 옵션을 넣어줘야 한다.
version 은 말그대로 버젼... 숫자,".","-" 까지 허용되는 것 같다..
Architecture 은 무시해도 되고 Depends는 의존성. 의존성에 있는 버젼 or 앱이 없으면 설치되지 않는다. 시디아에서의 경우 시디아가 자동으로 설치해줄것이다..(소스 내에 있으면.)
Replace는 이앱을 대치한다..Conflicts 는 아마 여기에 적힌 앱을 지우고 설치될 것이다..
Section은 음... 앱 만들정도 되면 다알겠지.. 그 밑으로도 알아서 이해하시길..귀찮;;ㅋㅋㅋㅋ


그리고 control 과 같은 경로에 특정 스크립트들을 넣어둘 수가 있다.
postinst 는 설치 후 작업.
preinst 는 설치 전 작업.
prerm 은 삭제 전,
postrm 은 삭제 후 실행되는 스크립트 파일 명이다.

권한 설정 등은 postinst 로 하면 되고 purge, remove, install 등 어떻게 실행 된 건지 체크 할 수도 있다.
이부분은 openssh 를 뜯어보시길..ㅋㅋ

그외에 다른 스크립트도 있는지는 모르겠음.


DS_Store_Cleaner_1.5.0.tar.gz

또한 맥에선 캐쉬 등을 위해 이것저것 잡 파일들을 많이 만든다..
그중 하나가  DS_Store 란 파일.. 위의 첨부파일로 삭제해주도록 하자.
저게 아마 Snow Leopard 에서만 작동할 수도 있는데 그러면 홈페이지 찾아가서 새 버젼 받으면 된다.ㅋ

이 프로그램으로 파일 내의 DS_Store 파일을 제거해 준뒤
터미널을 열어서

패키징을 원하는 폴더의 상위 폴더로 이동해서
dpkg -b 폴더이름
를 해주면 된다. tab키로 자동 완성 시킬 경우 젤 뒤에 / 가 생기는데 이럴경우 어디론가 사라지고 없으므로 꼭 지워주도록 하자.

이렇게 하면 폴더와 같은 위치에 deb파일이 생성된다! iFile등으로 설치하고 리스프링 하면 완료!!!


참고로 로컬에서 DEB를 설치해도 기록이 남기에 시디아에서도 Change에 리스트가 뜬다.


+ dpkg의 결과물에 ._ 로 시작하는 파일이 포함될수 있다. 나의 경우 DS_Store 는 지웠는데 남아있더라. deVbug님의 블로그에 보면 이에 대한 해결책을 알려준다. (http://devbug.me/618)

근데 나한텐 안되더라..ㅠㅠ
나의 경우엔 bash_profile 에

export COPYFILE_DISABLE=true
export COPY_EXTENDED_ATTRIBUTES_DISABLE=true

를 추가해서 해결봤다!

'개발개발 > Mac, iOS' 카테고리의 다른 글

BundleIdentifier로 앱 정보 구하기  (4) 2011.02.23
앱 설치 여부 구하기  (0) 2011.02.22
PreferenceLoader 사용법  (0) 2011.01.30
MobileSubstrate Extension with XCode  (0) 2011.01.07
cydia 앱, MobileSubstrate  (0) 2011.01.07


PreferenceLoader.

간혹 앱스토어 앱 중에 설정 앱 안에 해당 앱의 설정이 생기는 것을 봤을 것이다.

앱스토어 앱 중에 설정 앱 안에 해당 앱의 설정이 생기는 것을 봤을 것이다.

앱스토어 앱 중에 설정 안에 앱의 설정이 생기는 것을 봤을 것이다.
PreferenceLoader(이하 PL) 는 Cydia 의 앱, 트윅들이 이와 마찬가지로 설정 앱 안에 설정을 만드는 것을 도와준다.
간단한 plist 방식부터 원하는 대로 만들기 위한 bundle 형태까지 지원한다.
PL 자체는 설정 앱을 후킹해서 설정앱이 plist 파일을 읽어들이게 할 뿐이니 만약 호환성 문제가 생긴다면 그건 PL 문제가 아니니 문제가 있다면 버젼마다 테스트를 해보자.

우선 plist 로만 이루어진 설정이든, bundle 이 따로 있든 
/Library/PreferenceLoader/Preferences/ 에 관련 파일이 있어야 한다. 하위 폴더를 생성해도 상관 없다.

일단 이 글에서는 간단한 plist 만을 이용한 설정 제작을 소개할 예정이다.

우선 가장 유용했던 URL을 소개한다. 그나마 제일 자세히 설명된 페이지. 당연히 영문!


모든 포맷(아마도) 이 설명된 곳은 여기 밖에 못본듯..


또 다른 주소를 찾았다. 어떤 앱의 설정 파일인데 예시로 들어져 있는 것을 보니 상당히 많은 종류가 있는 것 같다.


맥이며 XCode3 가 설치되어 있다면 Property List Editor 가 설치되어 있으니 이것 기준으로 설명하겠다.
XCode4 에서는 XCode 자체에 Property List 편집기가 포함되어 있으니 알아서 사용.


대강 기초 틀은 이렇다. (Type에 유의하자.)

(밑에서 설명하려 했는데 밑으로 내려가니 그림이 안보이네. items 하위 항목에 대한 설명은 펼치기!)



우선 루트 하위에 title, entry, items 값이 있게 되는데 이중 title, entry 부분 부터 봐주시길..



entry부분이 모두 여기에 보이게 된다. 여기서는 아이콘을 내가 넣지 않았으니 안뜨는데, 아이콘에는 경로를 써주면 된다. 다른 경로라도 상관없고 plist 와 같은 폴더에 있다면 그냥 이름만 써주면 된다.
cell값은 건드릴것 없고 label은 바꿔주면 된다.



root/title 에 있는 값이 여기에 들어 오게 된다.


items 하위 설명은 위에 첫번째 그림 밑에 펼치기를 누르도록.

잘 모르겠으면 예시파일을 하나 만들어서 아이폰에 넣어서 테스트 해보자.
리스프링이 필요없으며 그냥 설정앱을 다시 열어주면 된다.





items 설명하면서도 말하였지만, 값의 저장경로는
/var/mobile/Library/Preferences/ 하위에  defaults에 지정한 이름으로 저장이 된다.
보통 앱 id와 같게 한다.


이제 중요한 것은 앱에서 설정을 불러오는 방법!


방식은 여러가지가 될 수 있다.
위의 소스는 예전에 내가 그냥 SwitcherMod 소스에서 퍼온것이고, 나의 경우 필요에 따라 만들어진 전처리 매크로를 통해 간편히 사용하고 있다..ㅎ
예를 들면 아래와 같이...



설정이 바뀌었을때 노티를 받는 방법도 있다.

설명하긴 귀찮으니   https://github.com/rpetrich/SwitcherMod 보고 참고 하도록 하자....

Bundle 로 만들어서 값을 바꿀때에는 notify_post 등으로 직접 노티를 쏴주면 크게 차이없이 동일하게 사용가능 하다.

'개발개발 > Mac, iOS' 카테고리의 다른 글

BundleIdentifier로 앱 정보 구하기  (4) 2011.02.23
앱 설치 여부 구하기  (0) 2011.02.22
DEBIAN PACKAGING (deb) 만들기 (수정)  (1) 2011.01.30
MobileSubstrate Extension with XCode  (0) 2011.01.07
cydia 앱, MobileSubstrate  (0) 2011.01.07

iOS open project 이니 뭐니도 나온 상황이고, THEOS 가 훨씬 쓰기 편하다...

아래는 XCode4 나오면서 안되므로 무시하시길.
사실 저거 쓰면서 나도 뭐가 뭔지 몰라서 그냥 복,붙에 불과하다..ㅋㅋ



///////////////////////////////////////////////////////////////////////////////////////////////////

참고 싸이트

modmyi.com http://modmyi.com/forums/iphone-ipod-touch-sdk-development-discussion/728944-tutorial-how-compile-mobile-substrate-extension-xcode.html )

devbug.me http://devbug.me/606?category=2 )



1. XcodeSubstrate.zip 을 받는다. 주소 : http://cl.ly/9b3963d250f4673ccf51

(직접 헤더를 덤프하여 사용하려면 상단 modmyi 의 링크로 따라가서 Ok here we go 하위에 있는 XcodeSubstrateNoHeaders.zip 을 받는다)


그리고 압축풀고 나온 Mobile Substrate Extension 폴더는

/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Project Templates/Application

하위에 집어 넣는다.

템플릿이 4.0 기반이라 XCode에서 프로젝트 생성시 4.0으로 생성된다. 프로젝트 설정에서 바꿔주도록 하자.

버젼 문제는 아래에서 추가 설명


2. class-dump 를 이용하여 springboard 의 헤더파일을 가져온다.

class-dump-3.3.3.dmg (맥용) / apt-get install class-dump (아이폰)


맥-터미널 :

class-dump -H /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.2.sdk/System/Library/CoreServices/SpringBoard.app/SpringBoard -o ~/Desktop/SpringBoard/

(맥에서 파일,폴더를 드래그 하여 터미널 위로 드랍시킬 경우 커서가 위치한 곳에 파일/폴더의 경로를 뿌려준다.

또한 class-dump 를 설치하고 싶지 않은 사람은 디스크 마운트 상태에서 class-dump를 복사하지 않고 사용이 가능하다.

ex> /Volumes/class-dump-3.3.3/class-dump  -H ~~~

뭐 편한대로 사용하도록 하자.


아이폰-터미널 : class-dump -H /System/Library/CoreServices/SpringBoard.app/SpringBoard -o ~/SpringBoard/

(아이폰에서 ssh를 깔아놓고 맥에서 터미널로 접근해서 하는 것을 추천한다.

이 글에서는 컴퓨터에서 추출한 헤더 파일을 사용하므로 일단 방법만을 적어놨을 뿐이고 실제 진행시에는 컴퓨터에서 추출하도록 하자.)


폴더이름은 SpringBoard 그대로 하도록! 뒤에 가서 헷갈린다... 오류 날경우 폴더를 만들어 놓고 실행!

그리고 폴더 채로 /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.0.sdk/usr/include/

하위로 이동하도록 한다


또한 Springboard/SpringBoard.h 파일을 열어서

7번째 줄의
#import "UIApplication.h"

#import "UIKit/UIApplication.h"
로 수정,

54번째 줄의
struct _opaque_pthread_t {
    long _field1;
    struct __darwin_pthread_handler_rec *_field2;
    char _field3[596];
} *_backgroundMIGServerThread;

을 주석 처리 한다.

devbug님이 게시한 방법이며, 이외에도 해줄곳이 많다고 한다. 일단 여기까지-

아이폰에서 class-dump를 했을 경우 파일이 위와 같지 않다. 나도 이런면을 잘아는게 아니라

그냥 다른글을 옮길 뿐이니 그냥 가르쳐주는대로 하도록 하자..ㅠㅠ


3. 1에서 압축을 풀었던 폴더 내에 있는 substrate.h 파일을 2에서 이동한 ~~/include/ 하위로 옮긴다.

SpringBoard 하위로 옮기지 않도록 유의하자.

noheader 버젼을 받은 사람이라면 이 파일이 없을 것이다. 아이폰에서 /Library/Frameworks/CydiaSubstrate.framework/Headers/CydiaSubstrate.h

경로의 파일을 이름을 바꿔서 집어 놓도록 하자.


4. 압축을 푼 폴더 내에 혹은 아이폰 내부(/usr/lib/libsubstrate.dylib) 에 있는 libsubstrate.dylib

/Developer/Platforms/iPhoneOS.platform/Developer/usr/lib/ 로 이동한다


이후 Xcode에 가면 새 프로젝트 선택시 MobileSubstrate Extension 이 나타난다.


빌드 시 device모드로 놓고 build and run 이 아닌 그냥 build를 하도록 하자.

개발자 등록을 하지 않았거나 xcode에 code sign 작업을 해놓지 않았을 경우 에러가 뜨게 된다.


빌드 후 프로젝트 폴더 내의 Release-iphoneos / Debug-iphoneos 폴더 아래에 있는 .app 파일을 패키지 보기로 연후

프로젝트 이름의 확장자 없는 실행 화일만 빼내어 .dylib 확장자를 붙인다.

이후 아이폰의 /Library/MobileSubstrate/DynamicLibraries/ 경로에 집어넣고 리스프링 하면 확인할 수 있다.



아래는 modmyi 에서 알려주는 SDK가 4.0 이 아닐경우의 프로젝트 설정이다.

어차피 xcode가 영어니까 그냥 그대로 복사해 오도록 하겠다..

--------------------------

  1. In the menu bar, click Project > Edit Project Settings
  2. Click the "Build" tab at the top
  3. Drop down the Configuration box and change it to Debug
  4. Change the Base SDK to iPhone Device 4.0
  5. Drop down the Configuration box and change it to Release
  6. Change the Base SDK to iPhone Device 4.0
  7. Close the window
  8. Expand the Frameworks folder in the sidebar to reveal the red Foundation and UIKit frameworks, then delete them both
  9. Control-click the Frameworks folder > Add > Existing Frameworks...
  10. Choose Foundation and UIKit from the list
--------------------------
다른 SDK의 경우 특히 8~10 작업을 해주지 않을 경우 컴파일 오류가 날것이다..(아마..)
modmyi에서는 4.0 이 아닌곳에서 쓰는것을 주의하라고는 하지만.. 그냥 무시하자.. 그렇다고 4.1 / 4.2.1 용이 있는것도 아닌것 같다..






가장 좋은건 그냥 modmyi 가서 원문을 읽어보자.. devbug님이 소개한 class-dump 관련한 내용을 제하고는 모두 들어있다.


'개발개발 > Mac, iOS' 카테고리의 다른 글

BundleIdentifier로 앱 정보 구하기  (4) 2011.02.23
앱 설치 여부 구하기  (0) 2011.02.22
DEBIAN PACKAGING (deb) 만들기 (수정)  (1) 2011.01.30
PreferenceLoader 사용법  (0) 2011.01.30
cydia 앱, MobileSubstrate  (0) 2011.01.07

+ Recent posts