앞에 썼던 글의 연결이다...
특정 파일에 설치 정보가 기록되기 때문에 거기서 자료를 가져오는 방식..
더보기 클릭!


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

역시 더보기!


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

쨋든, 다행~!ㅎㅎ

'개발개발 > 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
사실 이문제 때문에 되게 많이 고민했다.
.app 은 어플만 삭제, 혹은 기껏해야 library 삭제만 하면 됬는데 .pkg는 어디에 설치되는지도 알 수 없을 뿐더러
uninstaller 를 제공하는 프로그램도 많지 않다.. 결국 찾은것은 패키지 프로그램이 설치하는 경로의 앱들을 직접 지우는것;;; 자동화 해주는 프로그램을 찾아봤는데 아직 찾지 못했다.. OTL..
직접 지우다 보니 공유자원도 삭제할수 있는 위험한 방법.. 

이것보다 더 좋거나 안정적인 방법이 있으면 알려주시길..

우선 설치된 파일의 pkg 파일이 필요하다. 알아서 구하자..
마운트된 볼륨안에 있다면 터미널 상에서
cd /Volume/
까지 치고 Tab을 두번 누르면 디스크 리스트가 뜨는데 거기서 해당하는 디스크의 앞 두글자 정도만 치고 다시 탭을 누르면 주소가 완성된다 그러고 이동하자.

그리고 설치한 pkg 파일로 들어간다. pkg도 디렉터리 개념인지 그냥 cd 커맨드로 들어가 진다.
그다음 유일한 폴더인 Contents 폴더로 진입.. 한줄로 줄이자면
cd /Volume/[마운트 디스크 이미지 이름]/패키지이름.pkg/Contents/
혹은
cd 패키지이름.pkg/Contents/

그다음
lsbom -pf Archive.bom | less
라고 입력하면 리스트가 쫙 뜬다. 대부분 특정 폴더안에 다 들어 있으니 찾아가서 삭제하면 된다.
참고로 이 상태에서 Control+F 를 누르면 한페이지씩 넘어가고 q를 누르면 빠져나오게 된다.
/usr 등 파인더로 접근 불가능한 폴더는
파인더에서
Cmd+Shift+G 를 눌러서 경로로 이동 매뉴를 사용하거나
터미널로 해당 폴더가 있는 폴더까지 접근 후(해당 폴더 전부 지울때)
sudo rm -rf 폴더이름
하면 된다. 조금 주의를 가지도록 하자...^^ 문제 생겨도 난 책임안짐 ㅋ

+ Recent posts