2012-04-29 3 views
3

우리가 개발중인 안드로이드 (또는 아이폰) 클라이언트가 있습니다. 클라이언트는 안드로이드 사용자가 우리가 개발 한 서버에 항목을 보낼 수 있습니다. 사용자가 서버에 항목을 보내는 순간에 클라이언트에 데이터 서비스 (GPRS)가없는 경우 클라이언트는 항목을 오프라인 데이터베이스에 저장하고 나중에 서버로 전송하는 기능도 지원합니다.안드로이드/아이폰에서 서버로 정확한 시간을 받으십시오.

전체 프로세스의 한 가지 중요한 측면은 사용자가 (항목이 실시간으로 이루어 또는 오프라인 데이터베이스에서 클라이언트가 전송되는지 여부) 서버로 항목을 전송하는 타임 스탬프

의 정확성이다 클라이언트에서 사용할 수있는 GPS 위치를 얻고 GPS 타임 스탬프를 사용하여이를 서버로 보내거나 오프라인 DB에 GPS 타임 스탬프를 저장하고 나중에 서버로 보냅니다. 그러나 사용자가 GPS (및 다른 모든 위치 서비스)를 끄면 장치에 GPS 수정 사항이 없으므로 서버가 항목을 만들 때 정확하게 확인할 수 없습니다. 사용자가 실제 발생 시간과 다른 시간에 항목을 만들기 위해 시계를 변경할 수 있으므로 로컬 장치 시계를 사용할 수 없습니다 (이러한 항목은 사용자 급여의 일부이므로 해당 항목을 "수정"하는 데 관심이있을 수 있습니다).

그래서 기본적으로 나는 모바일의 내부 시계를 신뢰할 수 없을 때 몇 가지 항목을 만들 때 최선을 다할 수있는 방법을 찾고 있습니다. 알고리즘은 실시간으로 보낸 항목이나 오프라인 DB에서 보낸 항목을 모두 지원해야합니다. 알고리즘은 사용자가 모바일 시간을 변경하고, 모바일을 켜고 끄고, 애플리케이션이 모바일 등에서 실행되는 동안 GPS를 켜고 끄는 경우도 지원해야합니다.

생각한 아이디어가 거의 없습니다. 의 : I 모바일의 시간을 신뢰할 수는 없지만

  1. , 그것은 여전히 ​​스톱워치로 수행 할 수 있습니다 는 응용 프로그램이 존재 때까지 루프, 루프는 1 초 자고 내부 클록 변수를 증가하는 클래스가 1 초. 모든 GPS 위치에서 내 코드는 내부 시계 변수를 업데이트합니다. 이렇게하면 장치 외부에서 온 절대 시계 (GPS)가 있으며 클라이언트가 서버에 항목을 보낼 때 내부 시계를 절대 시간으로 사용할 수 있습니다.

총 : 그것은 단지 업데이트 될 때 우리는 GPS에서

단점을 위치를 얻을 때 사용자가이 시계를 수정할 수 없습니다 : 사용자가 신뢰할 수있는 모든 항목을 만들 수 있습니다 전에 응용 프로그램이 적어도 하나의 GPS 수정 필요

  1. 정확한 시계가 서버에 있다는 사실을 활용할 수 있습니다. 클라이언트가 서버 정보에 항목의 유효 기간을 10 분으로 보내는 경우 서버는 내부 시간을 사용하고 항목이 작성된 정확한 시간을 알 수 있습니다.

가장 큰 문제는 진입 연령을 아는 것입니다. 나는 0의 나이를 가진 오프라인 DB에 엔트리를 저장하는 것에 대해 생각하고, 매 1 초마다 엔트리의 나이를 늘렸다. 문제는 응용 프로그램이 닫히거나 기기가 꺼져있는 경우 발생합니다.

현재 내가 멈추고있는 곳입니다. 이 문제를 해결하는 방법에 대한 모든 아이디어를 android.os.SystemClock에 오신 것을 환영합니다

감사보다 더

답변

2

내가 내 요구에 가장 적합한 솔루션을 제공 할 하나의 솔루션으로 Jules과 Joel의 답변을 결합한다고 생각합니다. 모바일이 GPRS를 가지고 있지 않을 때 사용자가 시계를 변경할 수 있으므로 시간 변경 이벤트 만 감지합니다. 우리가 그 순간에 새로운 시간이 맞는지 확인할 수 없기 때문에 우리를 도와주지 못할 것입니다.

조엘은 내 응용 프로그램이 시작될 때 (필자는 여전히 서버와 통신해야하거나 다른 응용 프로그램이 시작되지 않음) 내 서버에서 시간을 가져올 것을 권장합니다. 현재 장치 upTime과 함께 서버에서 가져온 시간이 저장됩니다.

사용자가 항목을 만들고 싶을 때 (서버 기본 시간 + 현재 가동 시간 - 기본 가동 시간)을 사용하여 현재 시간을 계산합니다. 내가 상관없이이 defenitly 아이폰에 안드로이드

에서 작동 장치

의 현재 시계 시간의 독립적 인 소스를해야합니다 이런 식으로 우리는 가동 시간

를 얻을 수 http://www.cocoadev.com/index.pl?FindingUptime 무언가를 사용하려고합니다

줄리아 & 조엘, 답변 해 주셔서 감사합니다!

1

봐입니다. 특히, elapsedRealtime()은 전화가 켜진 이후 시간을 반환합니다. 사용자가 시계를 변경하면 영향을받지 않습니다.

전원을 켰을 때 실행되는 코드와 실시간 시계를 확인함으로써 전화가 꺼지게 될 때 시간을 상호 연관시킬 수 있습니다. 휴대 전화가 꺼져있을 때 시계를 바꿀 수 없기 때문에이 간단한 방법을 사용하여 부정 행위를 저지르는 시스템을 만들 수 있습니다. (사용자가 휴대 전화를 뿌리면 모든 베팅이 해제되며 사용자의 아래에서 API의 동작을 수정할 수 있습니다.)

매초마다 코드를 실행하면 휴대 전화의 배터리 수명이 단축됩니다. 대부분의 휴대 전화는 하루를 끝내기 어려울 것입니다.

2

다음은 iPhone에서이 문제를 처리하는 방법입니다. 응용 프로그램이 시작되면 내 서버에 전화를 걸어 현재 GMT 시간을 요청합니다 (원하는 경우 공개 NTP 서버를 호출 할 수도 있음). 나는 그것을 시스템 시간과 비교한다. 그것이 X 이상으로 다르다면, 당신의 시스템 시간이 잘못되어서 미안합니다. 그래서 당신이 이것을 고칠 때까지는 앱을 사용할 수 없습니다. 그런 다음 사용자가 응용 프로그램이 실행되는 동안 시스템 시간을 변경하는 것을 모니터링하고, 그렇게하면 다시 비교합니다 (그리고 시간이 X 이상인 경우 오류 메시지가 나타납니다). 이렇게하면 자신의 시스템 시간이 (적절한 합당한 범위 내에서) 항상 정확하고 [NSDate 날짜]를 신뢰할 수 있습니다. 그러나이 솔루션에는 유효한 네트워크 연결이 필요합니다. 이 솔루션이 효과가 있다면 샘플 코드를 게시 할 수 있습니다.

관련 문제