거창하게 적고 싶은 마음도 있지만, 어차피 보는 사람 몇 없을거니 그냥 대충 적기로 합시다..
Cydia Store 에 앱을 올린다면 알만한 전제, 정의, 설명 다 생략합니다.
제가 Bigboss 를 사용해서 올리므로, Bigboss 기준임.
이런걸 봤을겁니다...
시디아 스토어 체크하고 밑에 저기 나열한것만 다 적으면 되는 줄 알았음.....ㅠㅠ
0) 원하는 가격. - 나중에 수정 가능하다
1) 이름 (나의 경우 Kim, Seung-ho)
2) South Korea
3) just me~~
4) paypal email
저거대로 작성해서 보내면 Optimo 로 부터 장문의 메일을 받을 수 있을거임..
1. 미국인이 아니므로, w-8ben 서류 작성을 요구함. optimo 는 18세 미만이면 부모님이나 다른 어른의 이름으로 하라지만 이리저리 봐도 크게 문제 없을 것이라 판단하여 일단 무시하고 내 이름으로 서명해서 보냈음. (밑에서 다시 조금 자세히 설명)
2. Cydia Store number 필요 - PC 에서 http://cydia.saurik.com/connect 로 로그인 하거나, cydia 에서 직접 로그인 하면 #00000 식의 번호를 확인할 수 있다. 이것이 내 아이디.
3. 판매 대금에 대한 설명 - 70% / 30% 가져가며, 70% 에 대해 정부에 세금 떼야함. 조금 길어서 접었다. 주저리주저리 펼쳐보자..ㅎㅎ
메일에서 옵티모가 설명해주는 부분.
우선 saurik 은 paypal 계좌로만 돈을 보내주며, 매달 1,15 일날 보내준다고 한다. -> 시차때문인지 2,16일날 오후에 받음.
또한 정확한 독해는 아니지만 경황상, 구매자의 결제를 정확히 확인하기 위해 구매자가 구매한 뒤 한달 뒤에 보내준다고 한다. 즉, 구매자가 구매하고 한달이 지난 다음 송금날에 해당 돈이 입금되는 것으로 보임. 아직 내가 한달이 안되서 모르겠다..ㅎㅎ
세금에 대한 부분은 잘 모르겠음.
이리저리 자꾸 바뀌어서.. 앱스토어 기준으로 보자면 현재는 미국에 원천징수는 당하지 않고, 한국에서 소득신고 하는 방향으로 해야 하는 것 같은데, 미국인들은 세금이 별개이므로 중복과세 관련 법안에 따라 국내에서 해당 부분에 대한 세금을 내야할 필요는 없음.
하지만 시디아 스토어도 그렇고 앱스토어도 그렇고 한국인이 구매한 금액만을 확인하는건 불가능. 따라서 그냥 70% 부분 전체로 소득신고 하고 세금 뗀다.. 뭐 이러는 것 같은데 일단 나는 미국에서 원천징수 10% 당하고 오기를 바라며(세금내야 되면 미성년자라 문제가 생기거든) 세금 쿨하게 씹고 그냥 진행했음. 문제 생기면 안되는데..ㅠㅠ
4. app id 에 대해. 이게 무료앱은 상관이 없는데 유료앱은 아닌가 봄. bundle identifier 의 도메인에 대한 소유권이 있어야 함. 즉 kr.iolate.touchpose 로 앱을 올렸다면 touchpose.iolate.kr 로 접속이 가능해야하며, 그 도메인을 내가 소유하고 있어야 함. 만약 도메인이 없을 경우 org.thebigboss.[product name] 으로 해서 올리게 됨.
5. 기기 제한을 알려달라고 한다. 즉, 지원하는 기기가 아니면 애초에 팔지를 않겠다는 거.
테스트 하거나 대충 range 를 보내주자.
처음 유료앱을 올리게 되면 이렇게 해야할 것이 이것저것 많다.. 특히 다른건 똥씹은 표정으로 그냥 하면 되는데(일단 세금 문제는 무시하자..) w-8ben 에 당황...
Part 1 에 이름, 2에 국가(South Korea), 3 에 Individual 체크, 4에 영문주소, 5,6,7,8 다 건너뛰고 Part2 에 9-a 체크, 옆에 빈칸에 South Korea 적고 젤밑에 Sign Here 에 이름 적고 우측에 Date. 밑에 형식있으니 그 형식대로 적으면 끝.
한 문장으로 설명했음!! 이렇게 적은 후 잘 보이게 스캔해서 optimo 이메일로 보내주면 된다.
처음 보낼 경우 w-8ben 때문인지 시간이 좀 걸린다.
나의 경우 일요일날 보냈고(옵티모가 일요일날 확인할거라고 미리 말해줬었다) 그 주 목요일날(밤이니까 금요일?) 등록됬다.
구글:
지정된 핀(임의 위치): http://maps.google.com/maps?f=q&q=좌표
그냥 핀 찍고 위치 공유로 나오는 주소를 때려 넣으면 됨. 좌표 뒤에 검색어 등은 지워도 됨. 있으면 작동 안할 수도 있음.
ex> @"http://maps.google.com/maps?f=q&q=35.855387,128.637478"
등록된 위치: maps://?q=검색어&cid=아이디
이 역시 지도 앱에서 검색한 후에 링크를 쏘는 것 추천...
특이하게 cid 가 있어도 쿼리 이름이 없으면 안되더라..지정된 핀의 경우 그냥 풀 URL 다 날려도 iOS 가 알아서 지도 앱을 실행시켜 주는데 등록된 위치의 경우 안되더라..
앱으로 직접 url 쏴줘야 함.
ex> @"maps://?q=%EA%B2%BD%EC%8B%A0%EA%B3%A0%EB%93%B1%ED%95%99%EA%B5%90&cid=16795864946373944557"
다음:
(요넘 힘들었다.. 결국 다음팀에 문의..ㅋ)
지정된 핀: daummaps://look?p=좌표
이 넘 역시 핀 찍고 주소 공유하면 http://local~~ 어쩌구 주소가 나오는데 그 뒷부분만 빼오면 된다.
ex> daummap://look?p=35.850000,128.630000
검색 결과: daummaps://search?q=검색어
정말로 검색 결과를 보여줌. 예시 필요도 없다. 위에 그대로 쿼리로 쏴도 된다..ㅋ
등록된 위치: daummaps://place?id=아이디
이 넘은 핀 찍고 주소 공유하면 http://~~~~place?confirmid=아이디
이렇게 주소를 준다. confirm 만 지워주면 됨. 노란색 핀으로 찍어준다.ㅋ
ex> @"daummaps://place?id=8197517"
네이버:
별거 없다. 모바일 페이지로 들어가면 앱에서 보기 링크가 있는데 그거 클릭해서 주소 빼오면 된다.
참고로 iOS 디바이스에서 실행하면 바로 지도앱이 켜져 버리니 불가능 하고, 사파리에서 모바일 페이지로 진입 후,
개발자 모드를 켜서 user agent 를 iOS 로 바꿔준다. 그러면 앱으로 보기 버튼이 활성화 되는데 그거 누르면 주소를 알아낼 수가 있다. 더럽게 길기도 하고 그 많은 값 중 하나라도 빼면 제대로 작동안함.
등록된 위치 뿌려주는 예시:
@"navermaps://?menu=location&pinType=place&lat=35.855549&lng=128.637438&title=%EA%B2%BD%EC%8B%A0%EA%B3%A0%EB%93%B1%ED%95%99%EA%B5%90&pinId=11594033"
참고로 사파리가 아니라 앱에서 openURL 로 실행할 때 url에 한글이 있을경우 escape 해서 보내야 함.
NSURL 이 알아서 해줄줄 알았건만, 한글로 보내면 아예 URL 자체를 무시해버린다..
7. saurik 의 블로그 (http://www.saurik.com/)
시디아 개발자, saurik 의 블로그.
내용은 거의 없지만, 다른 곳에서 찾기 힘든 것들이 있다.(그런 만큼 크게 쓸모 있는 사람도 많지 않으리...)
글 목록을 찾기 힘든데 오른쪽 사진 밑에 최근 글 목록이 있다.. 그냥 그게 다인듯....?
ㄴ 덧, 크게 필요한 내용은 아니지만, 시디아 메인페이지 하단에
요런 개발자들을 위한 메뉴가 있었다. ㅋ
뭐.. 딱히 볼만한 내용은 없다....
현재 생각나는건 여기까지...
뭐 더 있겠나 싶냐만은, 혹시나 더 있으면 추가하도록 하겠음..
그냥 저렇게 하면 나타난다...ㅋㅋㅋ
[aWindow makeKeyAndVisible]; 등으로도 나타나게 할 순 있지만 keyWindow 로 만들 것이 아니니까
그냥 hidden값만 바꿔주면 된다. (keyWindow 는 아이폰이든 맥이든 하나만 존재 가능.. 이라곤 하던데 예전에 makeKey 를 남발해도 크게 문제는 없더라.. 단지 자잘한 오류를 경험했기에 비추....)
크기를 전체화면이 아니게 할 경우 윈도우 이 외 부분은 원래 그대로 터치가 되니 윈도우를 하나 더 만들어서 막거나, 애초에 전체화면으로 만들거나 등등 알아서 머리 잘 쓰자..
숨기기와 관련해서.. hidden =TRUE; 가 아니라 alpha 를 0으로 줘서 숨길 경우 잠금화면->홈 화면 으로 갈때 등 특정 상황에서 숨겨뒀던 윈도우 잔상이 나타나는 버그가 있으니 참고.
여기서 끝내긴 아쉬우니, 내가 좀 삽질했던 회전 관련 팁..
View 도 아니고, 애플이 제공하는 틀 안도 아니기에 화면 회전 관련이 좀 불편하다..
기기 방향을 알기 위해서 [[UIApplication sharedApplication] statusBarOrientation] 를 호출 하면 된다.
윈도우는 이렇게 돌려주면 되는데..........................
이게 X 같은게 돌리고 나면 Window 하위로 붙이는 뷰는 회전된 윈도우의 해당 방위에 맞게 알아서 잘 되는데 문제는 Window 자신의 좌표가 좀 꼬인다..
화면을 돌리더라도, 기기 내부 앱이든 뭐든이 회전하더라도 좌표의 기준점, 즉 (0,0) 의 위치가 변하지 않는다! 게다가 x축 y축 방향도 변하지 않는다!!
즉, 90도를 돌린 경우에 사용자가 보는 세로가 그대로 x축이고 가로는 y축.....
좀 다르게 말하자면,, 방위에 따라서 화면 좌측 상단의 좌표(3Gs 기준)가 (0,0) (320,0) (0, 480) (320, 480) 으로 제각각이다.. 크게 상관 없는 사람들도 있겠지만 나의 경우 이 좌표 떄문에 매우 곤란 했었다..
지금 와서 생각해보면 상위에 전체 화면의 윈도우를 하나 더 띄우고 내부에 뷰로 작업하는 것도 괜찮을 것이라는 생각이 든다.. 필요한 사람은 어떻게든 알아서 해보셔~
아 빼먹을 뻔 했다. 화면 회전 이벤트 감지는
SpringBoard 의 noteInterfaceOrientationChanged 이벤트를 체크하면 된다. 이 부분은 알아서..
한참 트윅제작 강의를 하고 계신 deVbug 님이 써주시거나 내가 곧 쓸 수도 있다....
내가 잘못했다거나, 더 좋은 방법이 있지만 몰라서 못 적은 거일 수도 있다.
혹시나 더 좋은 방법, 혹은 다른 팁 등이 있다면 댓글로 살포시........ㅎㅎ 돕고 삽시다 좀!!! ㅋ
근데,, 사실 저 코드 만으로는 문제가 있는게, PreferenceBundle Extension 에서 네비게이션의 뒤로가기 버튼을 누를 경우
-(void)setRootController:(id)controller; 메소드를 호출하게 된다.
따라서 LAEventSettingsController 를 상속받는 새로운 클래스를 만들고 -(void)setRootController:(id)controller; 메소드를 만들어 두자..
다음은 Activator Listener 직접 호출. Activator 에다가 이벤트를 등록하지 않고 직접적으로 호출하는 방법이며, Listener 이름만 알고 있으면 된다.
(참고로 Activator 는 리스프링 직후 트윅들이 Activator 에 이벤트를 등록하면서 넘겨주는 delegate 를 가지고 있다가 activator:receiveEvent:forListenerName: 메소드를 호출해주는, 싱글톤 방법을 사용한다.)
역시나 LibActivator 소스에서 가져오는 libactivator.h 를 임포트 해주고
아래와 같이 해주면 된다.
iOS5 에선 수정되었음. 단, iOS4 와의 호환성을 위해서라면 여전히 유효한....
PreferenceLoader 자체가 설정을 "로드" 해주는게 다라서 PL 버젼 보다는 iOS 버젼을 따라가는듯...
======
당췌 PreferenceBundles 부분은 관련 문서를 구할 수가 없다..
게다가 open source 인데 소스가 git 에서 사라진 상태;;(검색해도 안나오고 말이쥐;;) (수정.. 소스가 있긴 있다. 근데 이제보니 별로 도움안되는 소스더라..)
이런 상황에서 용케 만드는 사람들이 신기하군..ㅠㅠ
하여간,
PSViewController 에서 다음 뷰로 넘기기 위해선
PushViewController:animated: 가 아니라 PushController: 를 사용하면 되는데
문제는 PSViewController 클래스만 지원한다..
아니, UIViewController 도 되긴 되는데 UIViewController 로 넘어간 후에 뒤로가기를 누르면 튕겨버린다.
이유는 뒤로가면서 원래 보던 뷰에 setRootController:(id)controller 라는 메소드를 호출하는데
UIViewController 에는 해당 메소드가 없다..ㅠ
PreferenceBundles 에서 사용되는 클래스들은 일반적으로 쓰는 클래스를 하나도 상속 받지 않더라..ㅠ
(뭐 NSObject 정도는 상속 받겠지만)
게다가 PSViewController 에는 addSubView: 같은 메서드도 없다! 이런...
방법은
1. PSViewController 에서 -(id)view 를 재정의 한다.
즉 -(id)view 메소드에서 내가 쓰려는 뷰나 뷰컨트롤러를 만들고 그 뷰를 return 해주면 된다.
하지만 나의 경우엔 LibActivator 의 EventSettingView 를 가져오는데 저렇게 하니 깨짐;;ㅠㅠ
그래서 곰곰히 생각해보다가 해결!!
2. UIViewController 에서 setRootController: 정의 하면 된다 ㅋ
원랜 Preference 소스 보고 원래대로 작동하게 할려고 했는데 소스도 없고 테스트 해보니 걍 아무 작업 안해줘도 잘만 되더라.