2012-09-19 6 views
3

이것은 단단합니다. 하루에 12 번 비행기 모드를 토글하고 빠른 수행 방법을 원합니다. 나는 비행기 모드 전용의 물리적 버튼을 죽일 희귀 한 사용자입니다. 볼륨 다운 버튼으로 시도하고 싶습니다. 이것은 앱 스토어에는 없으며 개인 라이브러리를 사용하는 것이 행복 할 것입니다. 실제로, 나는 전화를 탈옥시킬 필요가 있음을 알 수있다. 이 단계에서 일반 아키텍처 조언을 찾고 있는데 특정 코드가 아 닙니다.iPhone에서 음량 버튼을 사용하여 비행기 모드 전환하기

문제는 다음과 같습니다.이 문제를 해결하기위한 최상의 아키텍처는 무엇입니까? 나는 이런 식으로 문제를 해결한다.

1) 앱이 볼륨 버튼 누름을 듣고 응답 할 수 있도록 앱을 백그라운드에서 실행하는 방법 (그리고 아마도 원격 제어 장치의 볼륨이 작아지는 이벤트). 여기에 세 가지 선택 사항이 있습니다. - VOIP 앱 만들기 - 내비게이션 앱 만들기 - 오디오 앱 만들기 오디오 앱이 가장 합리적인 방법 인 것 같습니다. 백그라운드에서 앱을 계속 사용하기 위해 반복적으로 무음 트랙을 계속 재생해야합니까? 다른 앱에서 오디오 트랙을 재생하면 앱에 문제가 생길 것 같습니다.

2) 볼륨 다운 이벤트를 차단하는 방법. 이 문제에 대한 한 가지 대답 : program access to iPhone volume buttons

3) 비행기 상태를 확인하고 변경하는 방법. 일부 마하 코드와 동적 링크와이 문제에 대한 오래된 대답은 이해가 안 : 더 나은 개인 라이브러리에 대한 http://theiphonewiki.com/wiki/index.php?title=/System/Library/Frameworks

어떤 제안 : 이 http://blogs.oreilly.com/iphone/2009/01/bring-airplane-mode-control-ba.html

개인 라이브러리를 이해하기위한 가장 좋은 자원이 여기에있을 것 같다 "docs"또는 Zdziarski의 "iPhone Open Application Development"책에 대한 업데이트가 환영받을 것입니다.

나와 함께 생각해 주셔서 감사합니다!

+0

다음은 [비행기 모드 전환 방법]입니다. (http://stackoverflow.com/a/13464144/119114) – Nate

답변

2

나는 그것이 서로 관련이 없기 때문에 여러 개의 개별 질문으로 나누는 것이 낫다고 생각합니다.

1) 배경에. LocationManager를 사용하고 주기적으로 켜고 끄는 것이 좋습니다. 이것은 백그라운드에서 머무를 수있는 시간을 세는 타이머를 재설정합니다. 여기

몇 가지 유용한 링크 없습니다 :

iPhone - Backgrounding to poll for events

setKeepAliveTimeout and BackgroundTasks

http://www.slideshare.net/tranq72/ios4-multitasking-development-notes

2) 아무 생각.

3) SBSetAirplaneModeEnabled API가 제거되었으므로이 방법은 더 이상 작동하지 않습니다.

#define SBSERVPATH "/System/Library/PrivateFrameworks/SpringBoardServices.framework/SpringBoardServices" 

이는 단지 다른 동적으로로드 된 라이브러리로하는 저장소 위치를 정의

그러나, 나는 제공된 링크의 코드가 어떻게 작동하는지 설명 할 수 있습니다.

void *sbserv = dlopen(SBSERVPATH, RTLD_LAZY); 

동적 라이브러리이 코드는 다음과 같은 두 가지 작업을 수행

int (*setAPMode)(mach_port_t* port, BOOL yorn) = 
     dlsym(sbserv, "SBSetAirplaneModeEnabled"); 

로드로드됩니다. dlsym은이 동적으로로드 된 라이브러리에서 SBSetAirplaneModeEnabled 함수를 찾아서 주소 지정합니다. 그리고 그것을 setAPMode 변수에 저장합니다.

setAPMode(p, yorn); 

이것은 단지이 함수를 호출합니다.

dlclose(sbserv); 

이렇게하면 핸들이 닫힙니다 (더 이상 필요하지 않음).

많은 개인 API 호출의 일부로 많이 mach_port_t이 표시됩니다. 일반적으로 this mach port is part of inter process communication system

다음은 매우 간략한 설명입니다. 다른 응용 프로그램과 통신하려면 해당 응용 프로그램에 메시지를 보내야하며 mach_port_t은 이러한 메시지를 보내는 핸들입니다. 예를 들어 setAPMode은 내부적으로 비행기 모드를 켜고 끄는 SpringBoard 응용 프로그램에 메시지를 보냅니다. 그것이 우리가 이러한 기능에 전달해야하는 이유입니다.

다른 응용 프로그램의 포트를 얻는 방법에는 여러 가지가 있습니다. 그러나 가장 일반적인 API는 개인용 API를 호출하여 포트를 반환합니다.

스프링 보드 서버 포트를 반환하고 다른 Sprinboard 클라이언트 측 API로 전달하는 API 인 SBSSpringBoardServerPort이 있습니다.

+0

네,이 질문을 3 가지 질문으로 분리해야합니다. 매우 유용한 링크. 감사! 개인 API 프로그래밍 속도를 높이고 Mach 포트를 다루는 방법에 대한 제안 사항은 무엇입니까? –

+0

2Russ : 이메일을 보내주십시오 (내 프로필에서 내 이메일 주소를 찾을 수 있음). 개인 API에 대한 정보를 보내 드리겠습니다. –

관련 문제