adsense4


[iPhone][MonoTouch] 10번째 예제 : WhereAmI 미분류

오늘은 GPS를 사용하여 현재 어떤 위치에 있는지 간단히 좌표를 표시하는 어플리케이션을 만들어 보겠습니다. GPS 정보를 얻기 위한 클래스와 그 클래스를 사용하는 방법을 간단히 소개 합니다. 구글 지도와 연계하여 다양한 어플리케이션 개발을 하기 위한 기본 예가 되겠습니다.

"WhereAmI"이름의 솔루션을 만들고 시작합니다. 프로젝트는 Utility형을 지정합니다.
생성된 파일 목록입니다. Utility형은 MainWindow.xib와 2개의 뷰 xib를 갖고 있습니다. MainView.xib가 어플리케이션의 주 화면을 담당하며 FlipsideView.xib가 "info Button"을 눌렀을 때 표시 되는 화면을 담당합니다.
다음 필요한 이미지 리소스를 프로젝트에 추가 하겠습니다. 어플리케이션 아이콘과 시작시 대기화면으로서 사용할 겁니다.
팝업메뉴의 Add - Add Files를 선택하여 열린 화면에서 "Default.png"와 "whereami.png" 이미지를 선택하여 프로젝트에 추가합니다.
추가한 이미지에 대해서 컴파일 옵션을 지정합니다. 어플리케이션 아이콘에 대해서는 필요 없지만, 만약을 위해 두 이미지를 선택하여 화면과 같이 Build Action메뉴에서 "Content"를 지정합니다.
프로젝트의 "Options"윈도우를 열고 어플리케이션 아이콘을 지정합니다. 아이콘 이미지는 "whereami.png"입니다.
GPS좌표를 표시하기 위해 화면을 만들겠습니다. "MainView.xib"를 인터페이스빌더를 이용해 화면을 구성하겠습니다. UILabel을 선택하여 Label을 추가합니다. 방법은 앞의 예제들을 참고하시면 쉽게 할 수 있습니다.
좌표를 표시하기 위해 UITextField를 선택하여 화면에 추가 합니다.
마지막으로 GPS좌표 탐색을 지시하는 버튼을 추가합니다. UIButton을 선택하여 추가합니다.
최종적인 화면은 다음과 같습니다.
추가된 객체들의 목록은 다음 화면과 같습니다.
사용자의 입력을 처리하기 위한 버튼에 대해 Action을 추가 합니다. MainView의 Identity윈도우에서 Action항목에서 "update"를 등록합니다. GPS로부터 얻은 좌표를 각 TextField에 지정하기 위해 Outlet을 등록합니다. 각 Outlet은 "altitude", "latitude" 그리고 "longitude"입니다.
"altitude"를 TextField와 연결해 줍니다. 연결 후의 화면은 아래와 같습니다.
같은 방법으로 "latitude"가 정상적으로 연결되었을 때 화면입니다.
"longitude"가 연결된 화면입니다.
다음으로 Action에 대해서 연결해 줍니다. "update"는 UIButton의 "Touch Up Inside"이벤트와 연결합니다. 정상적으로 연결된 화면입니다.

"info Button"을 눌러 표시되는 화면인 FlipsideView.xib파일을 인터페이스빌더로 작업하겠습니다. 특별히 하는 역할이 없으므로 UILabel 2개를 다음 화면과 같이 구성합니다.
각 UILabel의 텍스트는 화면의 문자열로 지정하겠습니다.
"Title"부분을 더블클릭하여 "Where Am I"로 바꿔 주고 저장합니다.
다음으로 GPS정보를 얻기 위한 코드를 만들겠습니다. GPS정보를 얻기 위해 사용하는 클래스는 클래스는 "MonoTouch.CoreLocation"에 정의되어 있는 "CLLocationManager"를 사용합니다.
변경된 GPS정보는 델리게이션에 의해 전달됩니다. 해당 GPS의 정보를 얻기 위한 델리게이션 클래스를 만들 필요가 있습니다. 델리게이션 클래스는 "CLLocationManagerDelegate"입니다. 이 클래스를 상속하여 구현하면 됩니다.
프로젝트의 팝업메뉴에서 이번엔 Add - New File을 선택합니다.

새 파일에 대해 "Empty Class"를 선택하고 클래스 이름은 "LocationDelegate"로 지정하여 생성합니다.
다음 화면과 같이 "LocationDelegate.cs"파일이 생성됩니다.
생성된 직후의 "LocationDelegate.cs"는 빈 생성자를 같는 클래스 입니다.
LocationDelegate.cs source :

using System;

using MonoTouch.CoreLocation; .... ①

namespace WhereAmI
{
public class LocationDelegate : CLLocationManagerDelegate .... ②
{
MainView _vc; .... ③
public LocationDelegate (MainView view) : base() .... ④
{
_vc = view; .... ⑤
}

public override void UpdatedHeading (CLLocationManager manager, CLHeading newHeading) ... ⑥
{
Console.WriteLine("UpdateHeading : X={0}, Y={1}, Z={2}", newHeading.X, newHeading.Y, newHeading.Z);
}

public override void UpdatedLocation (CLLocationManager manager, CLLocation newLocation, CLLocation oldLocation) .... ⑦
{
this._vc.SetAltitude(newLocation.Altitude.ToString());
this._vc.SetLatitude(newLocation.Coordinate.Latitude.ToString());
this._vc.SetLongitude(newLocation.Coordinate.Longitude.ToString());
this._vc.wasFound = true;
}

}
}
① GPS관련 클래스를 사용해야 하므로 처음에 "MonoTouch.CoreLocation"을 사용하는 것을 정의합니다. 정의가 안되어 있다면 전체 네임스페이스를 사용하여 지정해야 합니다.

② 빈 클래스에 대해서 상속 클래스를 지정합니다. 관련 클래스 리스트 중에 "CLLocationManagerDelegate"를 선택합니다.

③ 델리게이트에서 MainView를 참조하기 위해 멤버 변수를 정의 합니다. 변수명은 "_vc"로 하겠습니다.

④ 생성자에 MainView를 파라미터로 받도록 수정합니다. base()를 사용하여 부모클래스의 생성자를 호출합니다.

⑤ 멤버변수 _vc에 MainView를 지정하는 간단한 코드입니다.
⑥ "UpdateHeading" 이벤트를 추가합니다. 추가하는 방법은 편집기에서 "override"를 입력하면 자동완성 기능에 의해 쉽게 추가할 수 있습니다.
이번 예제에서는 사용되지 않습니다.

⑦ 위치정보를 반환하는 "UpdateLocation" 이벤트를 정의 합니다. 이벤트에 대한 정의는 다음과 같습니다.
변경된 새 GPS좌표는 "newLocation" 파라미터로 전달됩니다. 높이는 newLocation.Altitude 속성을 참고합니다. 위도와 경도는 각각 newLocation.Coordinate.Latitude속성과 newLocation.Coordinate.Longitude속성을 참고합니다. 각각을 MainView에 정의된 함수를 통해 전달하고 있습니다.

GPS정보를 얻기 위한 델리게이션을 구현했습니다. GPS를 구동하고 화면에 표시하는 MainView.cs 코드를 작성합니다.

MainView.cs source :

using MonoTouch.UIKit;
using System.Drawing;
using MonoTouch.Foundation;
using System;
using MonoTouch.CoreLocation; ... (1)


namespace WhereAmI
{
public partial class MainView : UIView
{
CLLocationManager locmanager; .... (2)
LocationDelegate locactionDelegate; .... (3)
public bool wasFound;

public MainView (IntPtr handle) : base(handle)
{
}

public override void Draw (RectangleF rect)
{
//Drawing code
}

partial void update (UIButton sender) .... (4)
{
this.locmanager = new CLLocationManager(); .... (5)
this.locactionDelegate = new LocationDelegate(this); .... (6)
if(this.locmanager.LocationServicesEnabled) .... (7)
{
this.locmanager.Delegate = this.locactionDelegate; .... (8)

this.locmanager.StartUpdatingLocation(); .... (9)
}

}

public void SetAltitude(String altitude) .... (10)
{
this.altitude.Text = altitude;
}

public void SetLatitude(String latitude) .... (11)
{
this.latitude.Text = latitude;
}

public void SetLongitude(String longitude) .... (12)
{
this.longitude.Text = longitude;
}
}
}
(1) GPS관련 클래스를 사용하기 위해 델리게이션 클래스와 마찬가지로 "MonoTouch.CoreLocation"를 사용함을 정의 합니다.

(2) GPS 정보를 얻기 위해 사용하기 위해  "CLLocationManager"를 멤버 변수 "locmanager"로 정의 합니다.
(3) 앞에서 만든 델리게이션 "LocationDelegate"의 멤버 변수"locationDelegate"를 정의 합니다.

(4) 인터페이스빌더에서 정의한 Action인 "update"를 구현합니다. 편집기에서 "partial"을 입력하면 현재 정의 가능한 Action목록이 나타납니다. "update"를 선택하여 필요한 코드 작업을 합니다.

(5) "CLLocationManager"의 객체를 생성합니다.

(6) "LocationDelegate"의 객체를 생성합니다. 이때 this를 이용하여 MainView객체를 생성자에 전달합니다.

(7) 현재 GPS를 사용할 수 있는지 체크하는 속성입니다.
(8) "CLLocationManager"의 Delegate속성에 생성한 "CLLocationManagerDelegate"인 "locationDelegate"를 지정합니다.

(9) GPS에 현재 좌표를 요청하는 메소드 "StartUpdatingLocation()"을 호출합니다.
비동기 처리이므로 결과는 델리게이트를 통해 전달 됩니다.

(10) 높이를 전달 받아 화면에 표시하는 메소드를 만듭니다.

(11) 위도 값을 전달 받아 화면에 표시하는 메소드를 만듭니다.

(12) 경도 값을 전달 받아 화면에 표시하는 메소드를 만듭니다.

이제 컴파일 하여 실행시켜 결과를 확인 합니다. 화면의 "Update"버튼을 클릭하면 잠시 후에 GPS좌표가 화면에 표시 됩니다. 다음 화면은 실행 하여 버튼을 눌러 좌표를 표시한 화면 입니다.

오늘은 GPS 정보를 얻는 방법에 대해 만들어 봤습니다. 다음은 Accelerometer를 이용해 보겠습니다.
샘플코드 : WhereAmI.zip








 

통계 위젯 (화이트)

13
101
400774

160x600스크래퍼

네이버Analysis