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).
음... MobileSubstration Extension 을 동적라이브러리로 불러도 되는건가..? 뭐 일단 이 문제는 패쓰하고;;
이것 역시 유입경로 보고 하는 포스팅! ㅋ
LibActivator 와 연동하기 위해선 우선
libactivator.h (THEOS 를 사용하기 위해 헤더들을 받았다면 그안에 있다.[<LibActivator/libactivator.h>] 없다면... 구글에 검색하면 아마 나올듯..?)
그리고 libactivator.dylib . 어디서 가져왔는지 기억이 안난다;; 걍 두개다 첨부할께요..ㅠ
를 추가해준다. %%%%%는 알아서 수정해 둘것. 앱이름이나 BundleIdentifier 등으로 해두면 된다. 크게 상관없으니 중복만 안되도록 해줄것. 참고로 나같이 프로그래밍 잘 모르면서 덤비는 사람을 위해 적자면, 따로 load 를 호출안해줘도 된다.
앱 활성화 확인 방법은 걍 간단하게 BOOL 변수 하나 만들어서 사용해도 잘되더라.
그다음 /Library/Activator/Listeners/%%%%%/info.plist 를 만든다. %%%%%는 당연히 알겠지만 위에서 지정한 것과 똑같이 하면 된다. info.plist 에서 String 타입의 Description과 title 키를 만들어 알아서 값 넣어주고 아이콘도 있으면 지정해주면 뜬다.
자. 이제 Activator 에서 보면 내가 지정한대로 뜰것이다.
호출되는지 까지 확인하면 Activator 와 사용할 준비는 끝!
// 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);
맥이며 XCode3 가 설치되어 있다면 Property List Editor 가 설치되어 있으니 이것 기준으로 설명하겠다.
XCode4 에서는 XCode 자체에 Property List 편집기가 포함되어 있으니 알아서 사용.
대강 기초 틀은 이렇다. (Type에 유의하자.)
(밑에서 설명하려 했는데 밑으로 내려가니 그림이 안보이네. items 하위 항목에 대한 설명은 펼치기!)
items 하위에 순서대로 설정 안에서 나타나게 된다.
각 키의 순서는 큰 상관없으니 대강 저것과 비슷하게 만들어 놓자.
key는 일종의 고유값? 이다. 설정을 호출할때 필요하니 겹치지 않게 하자. 뭔가 데이터를 입력받는 값에만 필요.
cell은 역시 설정에서 나타낼 타입을 나타낸다. 위 링크에서 형식들을 확인하자.
default는 기본값. 지금 같은 경우엔 cell이 스위치로 되어있어서 Boolean 으로 설정하였는데 아닐경우 String 등으로 타입을 바꿔줘여 한다. 데이터를 입력받는 값에만 필요.
defaults 는 설정 파일의 이름. preferenceLoader가 설정앱 내에서 사용자가 설정한 값을 알아서 저장해 주는데 이 저장되는 파일의 경로가 /var/mobile/Library/Preferences/ 하위이며, 이 안은 아이튠즈 백업시 백업이 되는 곳이다. 왠만하면 모든 키가 같게 하자..자세한 설명은 밑에서.. 입력 받는 값에만 필요.
label은 나타나는 이름..
모두 한번씩 써보면 알게 된다...ㅎㅎ
우선 루트 하위에 title, entry, items 값이 있게 되는데 이중 title, entry 부분 부터 봐주시길..
entry부분이 모두 여기에 보이게 된다. 여기서는 아이콘을 내가 넣지 않았으니 안뜨는데, 아이콘에는 경로를 써주면 된다. 다른 경로라도 상관없고 plist 와 같은 폴더에 있다면 그냥 이름만 써주면 된다.
cell값은 건드릴것 없고 label은 바꿔주면 된다.
root/title 에 있는 값이 여기에 들어 오게 된다.
items 하위 설명은 위에 첫번째 그림 밑에 펼치기를 누르도록.
잘 모르겠으면 예시파일을 하나 만들어서 아이폰에 넣어서 테스트 해보자.
리스프링이 필요없으며 그냥 설정앱을 다시 열어주면 된다.
items 설명하면서도 말하였지만, 값의 저장경로는
/var/mobile/Library/Preferences/ 하위에 defaults에 지정한 이름으로 저장이 된다.