adsense4


[iPhone][MonoTouch] 7번째 예제 : SpeedDial (후편) iPhone

[iPhone][MonoTouch] 7번째 예제 : SpeedDial (전편) 에 이어서 설정에서 전화번호를 읽어들여 전화를 걸어 보겠습니다.

Main.cs파일은 어플리케이션이 시작하는 Main함수와 UIApplication의 시작 코드, 어플리케이션의 메인 이벤트를 처리하는 AppDelegate(UIApplicationDelegate)의 코드를 포함하고 있습니다. 따라서 시작시 UI가 표시되기 전에 필요한 작업은 이 파일에서 해 주면 됩니다. C#의 partial타입을 지원하고 있기 때문에 AppDelegate클래스는 별도의 파일이 추가로 정의하는 것도 가능합니다.
using System;
using System.Collections.Generic;
using System.Linq;
using MonoTouch.Foundation;
using MonoTouch.UIKit;

//include for the Regex
using System.Text.RegularExpressions; ....①

namespace SpeedDial
{
public class Application
{
static void Main (string[] args)
{
bool just_dialed = NSUserDefaults.StandardUserDefaults.BoolForKey("just_dialed"); .... ②
if(just_dialed)
{
NSUserDefaults.StandardUserDefaults.SetBool(false, "just_dialed"); .... ③
NSUserDefaults.StandardUserDefaults.Synchronize(); .... ④
}
else
UIApplication.Main (args);
}
}

// The name AppDelegate is referenced in the MainWindow.xib file.
public partial class AppDelegate : UIApplicationDelegate
{
// This method is invoked when the application has loaded its UI and its ready to run
public override bool FinishedLaunching (UIApplication app, NSDictionary options) .... ⑤
{
// If you have defined a view, add it here:
// window.AddSubview (navigationController.View);

if(TryDial())
{
NSUserDefaults.StandardUserDefaults.SetBool(true, "just_dialed"); .... ③
NSUserDefaults.StandardUserDefaults.Synchronize(); .... ④
return false;
}
window.MakeKeyAndVisible ();

return true;
}

// This method is required in iPhoneOS 3.0
public override void OnActivated (UIApplication application)
{
}

// 전화번호를 읽고 전화를 거는 함수
bool TryDial() .... ⑥
{
string number = NSUserDefaults.StandardUserDefaults.StringForKey("phonenumber_preference"); .... ⑦
Console.WriteLine("PhoneNumber = {0}", number); .... ⑧

//regular expressions
var checkNumberRegex = @"^[0-9]+$"; .... ⑨
bool isNumber = Regex.IsMatch(number, checkNumberRegex); .... ⑩
if(isNumber)
{
string telNumber = String.Format("tel:{0}", number); .... ⑪

UIApplication.SharedApplication.OpenUrl(new NSUrl(telNumber)); .... ⑫

return true;
}
return false;
}
}
}
① 정규 표현식을 사용하기 위해 필요한 라이브러리 System.Text.RegularExpressions를 지정합니다. Regex를 사용할 수 있습니다.

② 사용자의 설정 정보를 참조하기 위해 사용하는 클래스는 "NSUserDefaults"클래스 입니다. 상속을 받아 자신만의 설정 클래스를 생성하여 사용할 수 있습니다.
클래스는 이용자의 설정 파일에 접근할 수 있는 정적 프로퍼티로 StandardUserDefaults를 제공합니다.
앞서 생성했던 Settings.bundle의 Root.plist를 가리킵니다. 화면은 자동생성 기능에 의해 확인 된 모습입니다. 설정 정보를 읽고 쓰기 위해 필요한 자료형에 맞게 미리 정의된 메소드를 제공해 주고 있습니다.
불(bool)형의 자료를 읽기 위해 "BoolForKey(keyName)"메소드를 사용합니다. 화면은 자동 생성 기능에서 제공해 주는 메소드의 도움말 입니다.
설정 파일에서 "just_dialed"키로 저장된 bool형 값을 읽고 있습니다. 메소드는 자료형을 포함하고 있기 때문에 사용하기 쉽습니다.

③ 설정 파일에 필요한 정보를 저장하기 위한 코드입니다. 읽기 위한 메소드는 자료형이 처음 나오지만 저장하기 위한 메소드는 Set으로 시작합니다. 뒤에 저장되는 자료의 자료형이 위치합니다. 코드의 SetBool()은 bool형 자료를 저장하는 메소드입니다.
파라미터는 값과 참조에 사용될 키입니다.
NSUserDefaults.StandardUserDefaults.SetBool(true, "just_dialed");
"just_dialed"키 이름으로 "true"값을 저장하는 코드입니다.

④ Syncronize()메소드는 설정 파일에 저장되는 것을 물리적으로 동기화 해 주는 함수 입니다.
Set메소드의 사용 위치에 따라 명시적으로 동기화를 지정해 주지 않으면 반영이 안되는 경우가 있습니다. 따라서 확실히 지정해 주는 것이 안전하다고 생각합니다.

⑤ 어플리케이션의 화면이 구성되고 실행 준비가 끝났을 때 자동으로 호출되는 이벤트입니다. 대부분의 호출되는 이벤트처럼 옵션입니다.
public override bool FinishedLaunching (UIApplication app, NSDictionary options) 
{
return true;
}
역할은 어플리케이션이 시작된 후 바로 어떤 처리가 필요할 때 사용될 수 있는 이벤트입니다. 이곳에 전화를 걸기 위한 코드를 작성하겠습니다.

⑥ TryDial()함수는 설정에서 전화번호를 읽고 전화를 거는 실제 처리가 정의 된 함수입니다.

⑦ StringForKey메소드를 이용하여 문자열로 된 전화번호를 읽습니다.
화면은 NSUserDefaults.StandardUserDefaults의 자동 생성 기능으로 StringForKey함수를 지정한 것입니다.
코드는 Root.plist에 "phonenumber_preference"가 키인 값을 읽고 있습니다. 반환값이 String형 이라는 것을 쉽게 알 수 있습니다.

⑧ Console객체를 이용해서 실행시에 확인 하고 싶은 내용을 MonoDevelop의 "Application Output"윈도우에 출력할 수 있습니다.
Console.WriteLine("PhoneNumber = {0}", number);
초기 버젼에서 디버깅 기능이 상당히 약했을 때 매우 유용한 도구였습니다. 디버깅이 보강 된 현재 버젼에서도 매우 유용하게 사용됩니다. 디버깅 모드로 실행시키지 않고도 실행되는 내용을 추적할 수 있습니다.
아이폰 시뮬레이터에서 실행시에 출력된 내용의 예입니다.

⑨ 정규표현식 입니다. @"^[0-9]+$" 식은 문자열이 숫자만으로 구성되어 있는지 검사하기 위해 사용할 수 있습니다.
 
⑩ 정규표현식을 이용하여 문자열을 비교하기 위해 Regex.IsMatch()를 사용합니다. Regex클래스를 사용하기 위해 처음에 System.Text.RegularExpressions를 지정했습니다.
IsMatch() 메소드는 2가지 종류가 있지만 예제에선 간단히 화면에 보이는 것을 사용하겠습니다. 결과는 true/false로 반환합니다.

⑪ 문자열을 지정된 포멧으로 만들기 위해 String.Format()을 매우 자주 사용합니다. 전화를 걸기 위한 필요한 문자열을 만들겠습니다. 포멧의 지정 방법에 대해서는 C#의 설명을 참조해 주세요.
아이폰에서 전화를 걸기 위해 웹시대에 아주 익숙한 형식을 사용합니다. 프로토콜로서 "tel"을 지정해 주면 간단히 됩니다. 정확한 형식은 "tel:전화번호" 입니다. 전화번호는 숫자를 지정해 주시면 됩니다. 코드는 다음과 같습니다.
string telNumber = String.Format("tel:{0}", number);

⑫ 전화를 걸기 위한 작업을 하겠습니다. 필요한 클래스를 간단히 알아 보죠.
UIApplication클래스는 어플리케이션을 실행시키는 메인 처리를 담당합니다. 코드에서 어플리케이션을 참조하기 위해 사용됩니다.
SharedApplication 속성은 현재 실행 중인 어플리케이션을 나타냅니다.
네트워크 동작 표시를 나타내거나 OpenUrl을 이용하여 외부 어플리케이션을 실행시키거나 하기 위해 자주 사용됩니다. OpenUrl()메소드는 NSUrl에 지정된 사이트를 프로토콜에 맞게 실행시켜 줍니다.
사용되는 코드는 다음과 같습니다.
예제:
UIApplication.SharedApplication.OpenUrl(new NSUrl(telNumber));

또 다른 예:
UIApplication.SharedApplication.OpenUrl(new NSUrl("http://neojjang.egloos.com"));
이번 예제에선 지정된 전화번호로 전화를 걸어줍니다.

어플리케이션의 로직은 매우 간단합니다. "just_dialed"의 값이 true이면 이미 한번 전화를 걸었기 때문에 false로 변경하고 프로그램을 종료 합니다. false의 경우는 TryDial()함수를 실행하여 설정에 지정된 전화번호를 읽고 전화를 겁니다. 전화를 걸었을 경우는 "just_dialed"의 값을 true로 지정하여 재다이얼이 되는 것을 방지합니다.

이번 예제에서 가장 중요한 부분은 Settings.bundle을 생성하여 설정 기능을 추가하는 것과 그 값을 참조하는 것이 되겠습니다.

SpeedDial은 여기까지 입니다.
샘플 예제 소스 : SpeedDial.zip
그럼 다음 예제로....








 

통계 위젯 (화이트)

67
50
400459

160x600스크래퍼

네이버Analysis