NSURLConnection 사용하기

2013. 4. 25. 00:09 from iPhone Dev.

NSURLConnection, NSURLConnectionDelegate 사용 예제

다음 코드는 야후 Weather API를 사용하여 데이터를 받아오는 것을 구현


Delegate 메소드

1)데이터 수신

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data


2)연결 오류

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error


3)연결 종료

- (void)connectionDidFinishLoading:(NSURLConnection *)connection


#pragma mark -

#pragma mark Custom Methods


- (void)loadData {

    NSLog(@"loadData");


    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];


    NSURL *weatherURL = [[NSURL alloc] initWithString:@"http://weather.yahooapis.com/forecastrss?w=2502265"];

    NSURLConnection *URLConnection = [[NSURLConnection alloc] initWithRequest:[NSURLRequest requestWithURL:weatherURL] delegate:self];

    [URLConnection release];

    [weatherURL release];

}


#pragma mark -

#pragma mark NSURLConnectionDelegate


- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {

    NSLog(@"connection:didReceiveData:");


    if (receiveData == nil) {

        receiveData = [[NSMutableData alloc] init];

    }

    [receiveData appendData:data];

}


- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {

    NSLog(@"connection:didFailWithError:");


    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];


    [receiveData release];

    receiveData = nil;

}


- (void)connectionDidFinishLoading:(NSURLConnection *)connection {

    NSLog(@"connectionDidFinishLoading:");


    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];


    NSString *receiveString = [[[NSString alloc] initWithData:receiveData encoding:CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingEUC_KR)] autorelease];


    NSLog(@"%@", receiveString);


    [receiveData release];

    receiveData = nil;

}


Posted by NuBiFoRM :

아래 화면과 같이 -DDEBUG=1 항목을 추가



프로젝트명-Prefix.pch 파일에 다음을 추가


#ifdef DEBUG

    #define NSLog( s, ... ) NSLog( @"<%p %@:(%d)> %@", self, [[NSString stringWithUTF8String:__FILE__] lastPathComponent], __LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__] )

#else

    #define NSLog( s, ... )

#endif


출처 : 아이군의 블로그

http://theeye.pe.kr/entry/upgrade-NSLog-only-working-debug-mode


'iPhone Dev.' 카테고리의 다른 글

NSURLConnection 사용하기  (0) 2013.04.25
Default.png 설정  (0) 2013.04.22
IB없는 Window-based Application 프로젝트 시작하기  (0) 2011.05.11
NSArray를 plist 파일로 저장  (0) 2011.05.04
C# Push Notification Provider 구현  (8) 2010.07.31
Posted by NuBiFoRM :

Default.png 설정

2013. 4. 22. 21:06 from iPhone Dev.

디바이스 따른 Default.png 파일명 및 해상도 설정 방법


 - Default.png (320x480)


 - Default@2x (640x960)


 - Default-568h@2x (640x1136)


Posted by NuBiFoRM :

Window-based Application 으로 프로젝트를 생성한다. 여기서는 프로젝트명을 Sample 이라고 하였다.



MainWindow.xib 파일을 선택하여 delete 키를 눌러 삭제한다.


Also Move to Trash 를 선택하여 프로젝트에서 완전히 삭제한다.



Sample-Info.plist 파일을 열고 Main nib file base name 항목을 삭제한다.


main.m 파일을 다음과 같이 수정한다.



#import <UIKit/UIKit.h>


int main(int argc, char *argv[]) {

    

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    int retVal = UIApplicationMain(argc, argv, nil, @"SampleAppDelegate");

    [pool release];

    return retVal;

}


SampleAppDelegate.h 파일에서 다음과 같이 @property 부분을 삭제한다.

#import <UIKit/UIKit.h>


@interface SampleAppDelegate : NSObject <UIApplicationDelegate> {

    UIWindow *window;

}


@property (nonatomic, retain) IBOutlet UIWindow *window;


@end


SampleAppDelegate.m 파일에서 @synthesize 부분을 삭제한다.

@synthesize window;


application:didFinishLaunchingWithOption: 메서드를 다음과 같이 구현해 준다.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    

    // Override point for customization after application launch.

    

    window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    

    [window makeKeyAndVisible];

    

    return YES;

}


이로써 IB가 완전히 제거된 Window-based Application 프로젝트가 생성되었다.

 
Posted by NuBiFoRM :

NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"list.plist"];

NSMutableArray *list = [[NSMutableArray alloc] initWithContentsOfFile:path];


if (list == nil) {

    list = [[NSMutableArray alloc] init];

}


[list addObject:@"서울"];

[list addObject:@"대전"];

[list addObject:@"대구"];

[list addObject:@"부산"];


[list writeToFile:path atomically:YES];

[list release];


다음과 같은 경로로 이동하면 list.plist 파일이 하나 생성되어 있다.

/Users/[User Name]/Library/Application Support/iPhone Simulator/[Version]/Applications/[Bundle Identifier]/Documents

이것을 Property List Editor로 열어보면 입력한 데이터를 확인할 수 있다.


여기서 중요한 것은 initWithContentsOfFile: 메서드를 통해NSArray 를 초기화 할때 해당 파일이 존재 하지 않는 경우 리턴되는 값은 nil 이라는 것이다. 그러므로 plist 파일을 읽어들여 초기화를 할 경우 반드시 nil 검사를 하여 파일이 존재하지 않을 경우 init 메서드를 통한 초기화가 필요하다.
Posted by NuBiFoRM :


Apple Development Push Service 인증서와 private key를 함께 선택하여 P12 형식으로 Export 한다.

터미널을 실행시켜 다음과 같이 입력하여 P12 파일을 PEM 형태로 변경한다.

$ openssl pkcs12 -in cert.p12 -clcerts -out cert.pem

다음과 같은 C# 코드를 통해서 Push Message를 보낼 수 있다.

int port = 2195;
String hostname = "gateway.sandbox.push.apple.com";
String certificatePath = "cert.pem";

X509Certificate2 clientCertificate = new X509Certificate2(certificatePath);
X509Certificate2Collection certificatesCollection = new X509Certificate2Collection(clientCertificate);

TcpClient client = new TcpClient(hostname, port);
SslStream sslStream = new SslStream(client.GetStream(), false, new RemoteCertificateValidationCallback(ValidateServerCertificate), null);

try
{
sslStream.AuthenticateAsClient(hostname, certificatesCollection, SslProtocols.Tls, true);
}
catch(Exception e)
{
client.Close();
return;
}

MemoryStream memoryStream = new MemoryStream();
BinaryWriter writer = new BinaryWriter(memoryStream);
writer.Write((byte)0);  //The command
writer.Write((byte)0);  //The first byte of the deviceId length (big-endian first byte)
writer.Write((byte)32); //The deviceId length (big-endian second byte)

String deviceID = "00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000";
writer.Write(HexStringToByteArray(deviceID.ToUpper()));

String payload = "{\"aps\":{\"alert\":\"Push notification test\",\"badge\":0,\"sound\":\"default\"}}";

writer.Write((byte)0);
writer.Write((byte)payload.Length);

byte[] b1 = System.Text.Encoding.UTF8.GetBytes(payload);
writer.Write(b1);
writer.Flush();

byte[] array = memoryStream.ToArray();
sslStream.Write(array);
sslStream.Flush();

client.Close();

public static bool ValidateServerCertificate(Object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
return true;
}

public static byte[] HexStringToByteArray(String s)
{
s = s.Replace(" ", "");
byte[] buffer = new byte[s.Length / 2];
for (int i = 0; i < s.Length; i += 2)
{
buffer[i / 2] = (byte)Convert.ToByte(s.Substring(i, 2), 16);
}
return buffer;
}

Posted by NuBiFoRM :

NSURL *url = [NSURL URLWithString:@"http://www.naver.com"];

NSString *htmlSource = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];

NSLog(@"%@", htmlSource);



NSUTF8StringEncoding  // UTF-8 Encoding


CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingEUC_KR// EUC-KR Encoding


Posted by NuBiFoRM :