[THEOS] Dynamic Library 를 weak 로 사용하기
Activator 를 꺼려하는 사람이 은근히 많아서,
Activator 가 필수적이지 않은 BeeKeyboard 에서는 의존성을 없애야 겠다,, 는 생각만 하고 놔두다가
어제 weak link 로 바꿨다..ㅎ
잠깐 확인해 봤는데 잘됨!
1. Makefiles 의 LDFLAGS 를 아래처럼 사용한다
@@@@_LDFLAGS = -weak_library /opt/theos/lib/libactivator.dylib
내가 못하는건지, 원래 안되는 건지 -weak_library 로 할때는 경로 전체를 적어줘야 하더라..
2. 앱 내에선 클래스의 존재 유무로 라이브러리가 로드 됐는지 확인한다.
다른 방법도 있는 것 같지만, 난 간단하게 저렇게 했음.
확인 안하고 냅두면 크래쉬 남 ㅇㅇㅋ
Class LAE = NSClassFromString(@"LAEvent");
if (LAE != nil) {
}
요런식으로...
설정 부분 같으면 불러오는 부분은 PSListController 를 사용하고,
Activator 를 사용하는 컨트롤러에서는 내부 변수로 Activator 의 클래스를 사용하고 있어서,
PSListController 에서 tableView:didSelectRowAtIndexPath: 를 오버라이드 해서 체크하고 있다.
다른 부분에서 비슷한걸 구현해 사용하고 있기 때문에 쉽게 끝냈음 ㅋ
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
int group = [self indexOfGroup:indexPath.section];
int pIndex = group + indexPath.row + 1;
PSSpecifier* spec = [self specifierAtIndex:pIndex];
if ([[spec propertyForKey:@"detail"] isEqualToString:@"GActivatorSettings"]) {
Class LAE = NSClassFromString(@"LAEvent");
if (LAE != nil) {
[super tableView:tableView didSelectRowAtIndexPath:indexPath];
}else{
[tableView deselectRowAtIndexPath:indexPath animated:YES];
NSString* message = LS(@"NEED_ACTIVATOR");
UIAlertView* alert = [[UIAlertView alloc] initWithTitle:LS(@"BeeKeyboard") message:message delegate:self cancelButtonTitle:LS(@"OK") otherButtonTitles:nil];
[alert show];
[alert release];
return;
}
}
[super tableView:tableView didSelectRowAtIndexPath:indexPath];
}
단, 이 경우 PSListController 의 헤더에 tableView:didSelectRowAtIndexPath: 가 선언되어 있지 않기 때문에
선언해주고 써야 한다.
@interface PSListController (p)
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;
@end
+ 확실하진 않은데, PSListController 에서 불러오는 plist 에서 index 0 의 항목이 PSGroupCell 이 아닐 경우 index 번호가 한개씩 밀릴 수도 있음... ㅎㅎ;;
여튼 이렇게 하면, Activator 와의 연계 부분을 사용하고 싶은 사람만 Activator 를 설치, 사용할 수 있게 된다!
다른 Dynamic Library 나 OS버젼 따라 다른 프레임워크 등도 이런식으로 사용하면 된다.
프레임워크의 경우엔 -weak_framework 임.