출처 : http://lambert.tistory.com/416

최근에 기업용 아이폰 앱을 In-house 방식으로 배포해 보았다. 엔터프라이즈 계정의 경우 iTunes, iPhone Configuration Utility 또는, 지금 이야기하려는, In-house 방식으로 앱을 배포할 수 있다. 이 방식들 중 In-hous를 통한 배포 방식이 사용자가 접근하기 가장 쉬운 방법이 아닌 가 한다. 

이 것은 OTA(Over the Air)로 AdHoc 앱 배포하기(에서는 데스트 용이어서 프로파일 배포에 관애 언급을 안했는데 실제 배포를 위해서는 애드혹 배포 역시 프로파일이 필요하다.)와 거의 같고, 몇 가지 설정만 주의하면 된다. 애드혹 배포와 다른 점만 살펴 본다. 가장 큰 차이는 배포용 프로비저닝 프로파일을 같이 사용해야 한다는 것이다. 자세한 내용은 Distributing Enterprise Apps for iOS 4 Devices의 내용을 참고 하라.

1. Share Archived Application 설정
다음 그림과 같이  Share Archived Application 설정 시, Distribute for Enterprise...을 선택한다. 물론 배포용 프로비저닝 프로파일을 선택하고...


그리고 이어 나타나는 세부 설정 항목에 관련 내용을 채운다. 물론 애드혹 배포와 다른 점은 없다. 다만 앱 배포 시 사용할 아이콘(사전 준비!)들을 설정해 준다. 물론 해당 웹서버의 URL을 사용한다. 설정을 끝낸 후, 저장위치를 선택하여 실제 생성하려는 앱의 이름을 입력하면 *.ipa와 *.plist 파일이 생성될 것이다.


2. 웹서버에 배포용 페이지 준비
위에서 언급했듯이, 이 때 OTA(Over the Air)로 AdHoc 앱 배포하기 차이가 있다. 다음 그림과 같이 두 개의 링크가 필요하다. 하나는 프로비저닝 프로파일을 위한 것이고 다른 하나는 앱의 다운로드를 위한 것이다.



<a href="http://192.168.0.46:8080/inhouse/MyApp.mobileprovision">Install Provisioning Profile</a>

<a href="itms-services://?action=download-manifest&url=http://192.168.0.46:8080/inhouse/MyApp.plist">클릭하시면 MyApp. 앱을 설치하실 수 있습니다.</a>

이 외에도 Distributing Enterprise Apps for iOS 4 Devices 배포 시 다음과 같은 사실에 주의해야 한다.
  • 배포 인증서 만료에 맞춰 1년에 한 번씩 업데이트(최소)
  • 앱 업그레이드 시 기존 데이터를 유지하기위해서는 동일한 bundle-idenfier을 사용해야 한다.
  • oscp.apple.com과 ax.init.itunes.apple.com 서버들은 3 ~7일 동안만 캐시를 유지한다.(앱 런칭 시 해당 서버에 접속한다.)


tabbar 프로젝트로 시작해서
각 탭에 tableView를 넣는 것을 하다가 위와 같은 에러를 콘솔창에 찍고는 프로그램이 종료된다.
하루종일 고생끝에 구글에서 답을 찾았다.

클래스, xib 파일 모두 다 잘 셋팅이 되었다면 xCode 왼쪽아래 Targets 라고 되어 있는 곳을 열어서
모른다고 하는 클래스의 파일이 있는지 확인한다.

없다면 위쪽 코드부분에서 드래그해서 넣어준다.

그리고 실행하면 잘 된다. 

원래는 자동으로 넣어주어야 할 것 같은데 버그인지...
출처
http://ishimitsujin.blogspot.com/2011/03/id-sel.html

<호출하고자 하는 오브젝트 클래스>

interface에 다음과 같이 넣어두자.

id target;

SEL selector;


<호출하는 오브젝트 클래스>

- (void) example {

SampleObj* obj = [[SampleObj alloc] init];

obj.target = self;

obj.selector = @selector(callbackFunc);

//or

obj.selector = @selector(callbackFunc:);// 변수를 받을때 ":"를 반드시 붙여야함.!!!

...

}

- (void) callbackFunc {

}

//or

- (void) callbackFunc:(id)sender {


}


//sampleObject에서의 처리.

if([self.target respondsToSelector:self.selector]) {// 응답할수 있는지 체크하고.

[self.target performSelector: self.selector]; // 부른다.

//or

[self.target performSelector: self.selector withObject:@"아무거나..배열도되고 스트링도 되고."]; // 오브젝트를 변수로 넣어서 부른다.

}


출처

http://ishimitsujin.blogspot.com/2011/03/https.html

아이폰개발: https로 요청하기....

요청하기....

NSURL *url;

NSMutableURLRequest *request;

NSURLConnection *connection;

//NSString *httpBody;

//URL reques 할당.

url = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@", AUTHENTICATION_URL, phoneNumberFld.text]];

request = [[NSMutableURLRequest alloc] initWithURL: url];

connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];

[connection release];

[request release];


델리게이트에선....

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

{

//NSLog(@"did receivedata [%@]byte",[NSString stringWithUTF8String:(const char*)[data bytes]]);

//if([data length] > 0)

[responseData appendData:data];

}


- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response

{

NSLog(@"didReceiveResponse");

NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;

NSLog(@"Headers = [%@]", [httpResponse allHeaderFields]);

[responseData setLength:0];

}


- (void)connectionDidFinishLoading:(NSURLConnection *)connection

{

NSLog(@"connectionDidFinishLoading");

//JSON처리는 이쪽에서 행할것!

//NSString* recvString = [NSString stringWithUTF8String:(const char*)[responseData bytes]];

NSString *recvString = [[NSString alloc] initWithData:responseData

encoding:NSUTF8StringEncoding];


dispRecvData.text = [NSString stringWithFormat:@"", recvString];

[self checkJsonValue:dispRecvData.text];

}


- (void)connection:(NSURLConnection *)connection

didSendBodyData:(NSInteger)bytesWritten

totalBytesWritten:(NSInteger)totalBytesWritten

totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite

{

NSLog(@"didSendBodyData");

}

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

{

NSLog(@"didFailWithError");

return;

}

// 나중에 필요하면 주석을 풀어 사용하세요.

//- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace {

// NSLog(@"canAuthenticateAgainstProtectionSpace");

// return [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust];

//}


//인증처리가 필요해요!!!!

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {

NSLog(@"didReceiveAuthenticationChallenge");

if ([challenge previousFailureCount] == 0) {

[[challenge sender] useCredential:[NSURLCredential credentialWithUser:KUSER password:KPASS persistence:NSURLCredentialPersistenceForSession] forAuthenticationChallenge:challenge];

} else {

[[challenge sender] cancelAuthenticationChallenge:challenge];

}

}


SFHFKeychainUtils 사용법
http://gorgando.com/blog/tag/sfhfkeychainutils

SFHFKeychainUtils 다운로드
https://github.com/ldandersen/scifihifi-iphone/tree/master/security/



Simple iPhone Tutorial: Password Management using the keychain by using SFHFKeychainUtils

May 23rd, 2010 admin 11 comments

Keychain is really a pain to use, and I didn’t want to spend the time to figure it all out, so I went looking for a framework that would do the dirty work for me. I found SFHFKeychainUtils and it has been super slick! In this tutorial, I’ll show you how to leverage SFHFKeychainUtils in order to save a username/password to keychain and also retrieve the password given the username. Just follow these simple steps:

1. Get SFHFKeychainUtils

I found it on GitHub at http://github.com/ldandersen/scifihifi-iphone/tree/master/security/ – just get the SFHFKeychainUtils.h and SFHFKeychainUtils.m files and add them to your project.

2. Import it

In the implementation file where you want to save or retrieve the password, be sure you import the SFHF Keychain Utils header file as shown below:

#import “LoginViewController.h”
#import “SFHFKeychainUtils.h”
@implementation LoginViewController

3. Save a Username/Password

xCode SFHFKeychainUtils iPhone Keychain Example





Here you can see how simple it is to add the username/password to the iPhone’s keychain. The storeUsername:andPassword:forServiceName:updateExisting:error method will take care of all the work for us if we give it the correct parameters. I am getting the username and password from two UITextFields in the app called usernameField and passwordField, respectively. The Service Name can be anything you want, as long as you remember it as you’ll need to enter that same string value in order to retrieve the password (see step 4).

4. Retrieve the Password from Keychain

xCode SFHFKeychainUtils iPhone Keychain Example




As you can see, it’s not any more difficult to retrieve the password from keychain using SFHFKeychainUtils. I specified my username “Gorgando” and the same service name we used before “myApp”. The password that corresponds to this username and service name in the keychain will be returned as an NSString.

So don’t be afraid to use the keychain! It is the most secure way to store passwords in an iPhone application. Both plists and the Settings.Bundle are very insecure ways to store passwords because the passwords are stored in plaintext, visible to anyone who accesses them. Let me know if you have any questions – good luck!


    appDelegate = (WeatherAppDelegate *)[[UIApplication sharedApplication] delegate];

Wrapper 클래스 사용시

http://theeye.pe.kr/entry/http-wrapping-class-with-iphone-network-programming





[헤더파일]
    // Google Weather Service
    NSMutableData *responseData;  //서버로부터 받은 자료를 담는 변수
    NSURL *theURL;
   
    // Information
    NSString *location;
    NSString *date;
   
    // Current Conditions
    UIImage *icon;
    NSString *temp;
    NSString *humidity;
    NSString *wind;
    NSString *condition;
   
    // Forecast Conditions
    NSMutableArray *days;
    NSMutableArray *icons;
    NSMutableArray *temps;
    NSMutableArray *conditions;


[소스파일]
- (void)queryService:(NSString *)city withParent:(UIViewController *)controller {
    viewController = (MainViewController *)controller;
    responseData = [[NSMutableData data] retain];
   
    NSString *url = [NSString stringWithFormat:@"http://www.google.com/ig/api?weather=%@", city];    //서버url을 적는다.
    theURL = [[NSURL URLWithString:url] retain];
    NSURLRequest *request = [NSURLRequest requestWithURL:theURL];
    [[NSURLConnection alloc] initWithRequest:request delegate:self];
}

- (NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)redirectResponse {
    [theURL autorelease];
    theURL = [[request URL] retain];
    return request;
}

// 서버로 부터 답변이 처음 오면 호출된다. 자료는 없다.
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    [responseData setLength:0];
}
    
// 서버로 부터 데이터를 받으면서 계속 호출된다. responseData에 계속 추가한다.
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    [responseData appendData:data];
}
    
// 에러가 발생하면 호출된다.
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    // Handle Error
}

// 모든 응답이 오고나서 연결이 해제되면 호출된다.
// responseData에 있는 자료를 사용하면 된다.
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
   
    //NSString *content = [[NSString alloc] initWithBytes:[responseData bytes] length:[responseData length] encoding:NSUTF8StringEncoding];
    //NSLog( @"Data = %@", content );
   
    days = [[NSMutableArray alloc] init];
    icons = [[NSMutableArray alloc] init];
    temps = [[NSMutableArray alloc] init];
    conditions = [[NSMutableArray alloc] init];
   
    NSString *xpathQueryString;
    NSArray *nodes;

    // Forecast Information
    // NSString *location;
    xpathQueryString = @"//forecast_information/city/@data";
    nodes = PerformXMLXPathQuery(responseData, xpathQueryString);
    for ( NSDictionary *node in nodes ) {
        for ( id key in node ) {
            if( [key isEqualToString:@"nodeContent"] ) {
               location = [node objectForKey:key];
            }
        }
    }
    NSLog(@"location = %@", location);
   
    // NSString *date;
    xpathQueryString = @"//forecast_information/forecast_date/@data";
    nodes = PerformXMLXPathQuery(responseData, xpathQueryString);
    for ( NSDictionary *node in nodes ) {
        for ( id key in node ) {
            if( [key isEqualToString:@"nodeContent"] ) {
                date = [node objectForKey:key];
            }
        }
    }
    NSLog(@"date = %@", date);   

    // Current Conditions
    // UIImage *icon;
    xpathQueryString = @"//current_conditions/icon/@data";
    nodes = PerformXMLXPathQuery(responseData, xpathQueryString);
    for ( NSDictionary *node in nodes ) {
        for ( id key in node ) {
            if( [key isEqualToString:@"nodeContent"] ) {
                icon = [NSString stringWithFormat:@"http://www.google.com%@", [node objectForKey:key]];
            }
        }
    }
    NSLog(@"icon = %@", icon);
   
    // NSString *temp
    NSString *temp_f;
    NSString *temp_c;
    xpathQueryString = @"//current_conditions/temp_f/@data";
    nodes = PerformXMLXPathQuery(responseData, xpathQueryString);
    //NSLog( @"nodes = %@", nodes );
    for ( NSDictionary *node in nodes ) {
        for ( id key in node ) {
            if( [key isEqualToString:@"nodeContent"] ) {
                temp_f = [node objectForKey:key];
            }
        }
    }
    xpathQueryString = @"//current_conditions/temp_c/@data";
    nodes = PerformXMLXPathQuery(responseData, xpathQueryString);
    //NSLog( @"nodes = %@", nodes );
    for ( NSDictionary *node in nodes ) {
        for ( id key in node ) {
            if( [key isEqualToString:@"nodeContent"] ) {
                temp_c = [node objectForKey:key];
            }
        }
    }
    temp = [NSString stringWithFormat:@"%@F (%@C)", temp_f, temp_c];
    NSLog(@"temp = %@", temp);   
   
    // NSString *humidity;
    xpathQueryString = @"//current_conditions/humidity/@data";
    nodes = PerformXMLXPathQuery(responseData, xpathQueryString);
    for ( NSDictionary *node in nodes ) {
        for ( id key in node ) {
            if( [key isEqualToString:@"nodeContent"] ) {
                humidity = [node objectForKey:key];
            }
        }
    }
    NSLog(@"humidity = %@", humidity);

    // NSString *wind;
    xpathQueryString = @"//current_conditions/wind_condition/@data";
    nodes = PerformXMLXPathQuery(responseData, xpathQueryString);
    for ( NSDictionary *node in nodes ) {
        for ( id key in node ) {
            if( [key isEqualToString:@"nodeContent"] ) {
                wind = [node objectForKey:key];
            }
        }
    }
    NSLog(@"wind = %@", wind);

    // NSString *condition
    xpathQueryString = @"//current_conditions/condition/@data";
    nodes = PerformXMLXPathQuery(responseData, xpathQueryString);
    for ( NSDictionary *node in nodes ) {
        for ( id key in node ) {
            if( [key isEqualToString:@"nodeContent"] ) {
                condition = [node objectForKey:key];
            }
        }
    }
    NSLog(@"condition = %@", condition);
       
    // Forecast Conditions
    //NSMutableArray *days;
    xpathQueryString = @"//forecast_conditions/day_of_week/@data";
    nodes = PerformXMLXPathQuery(responseData, xpathQueryString);   
     for ( NSDictionary *node in nodes ) {
        for ( id key in node ) {
            if( [key isEqualToString:@"nodeContent"] ) {
                [days addObject:[node objectForKey:key]];
            }
        }
    }
    NSLog(@"days = %@", days);
   
    //NSMutableArray *icons;
    xpathQueryString = @"//forecast_conditions/icon/@data";
    nodes = PerformXMLXPathQuery(responseData, xpathQueryString);   
     for ( NSDictionary *node in nodes ) {
        for ( id key in node ) {
            if( [key isEqualToString:@"nodeContent"] ) {
                [icons addObject:[NSString stringWithFormat:@"http://www.google.com%@", [node objectForKey:key]]];
            }
        }
    }
    NSLog(@"icons = %@", icons);
   
    //NSMutableArray *temps;
    NSMutableArray *highs = [[NSMutableArray alloc] init];
    NSMutableArray *lows = [[NSMutableArray alloc] init];
   
    xpathQueryString = @"//forecast_conditions/high/@data";
    nodes = PerformXMLXPathQuery(responseData, xpathQueryString);   
     for ( NSDictionary *node in nodes ) {
        for ( id key in node ) {
            if( [key isEqualToString:@"nodeContent"] ) {
                [highs addObject:[node objectForKey:key]];
            }
        }
    }
    xpathQueryString = @"//forecast_conditions/low/@data";
    nodes = PerformXMLXPathQuery(responseData, xpathQueryString);   
     for ( NSDictionary *node in nodes ) {
        for ( id key in node ) {
            if( [key isEqualToString:@"nodeContent"] ) {
                [lows addObject:[node objectForKey:key]];
            }
        }
    }
    for( int i = 0; i < highs.count; i++ ) {
        [temps addObject:[NSString stringWithFormat:@"%@F/%@F", [highs objectAtIndex:i], [lows objectAtIndex:i]]];
    }
    NSLog(@"temps = %@", temps);
    [highs release];
    [lows release];
   
    //NSMutableArray *conditions;
    xpathQueryString = @"//forecast_conditions/condition/@data";
    nodes = PerformXMLXPathQuery(responseData, xpathQueryString);   
     for ( NSDictionary *node in nodes ) {
        for ( id key in node ) {
            if( [key isEqualToString:@"nodeContent"] ) {
                [conditions addObject:[node objectForKey:key]];
            }
        }
    }
    NSLog(@"conditions = %@", conditions);
   
    [viewController updateView];
}

- (NSString *) copyDatabaseToDocuments {
NSFileManager *fileManager = [NSFileManager defaultManager];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask, YES);
NSString *documentsPath = [paths objectAtIndex:0];
NSString *filePath = [documentsPath stringByAppdendingPathComponent:@"dbfile.sqlite"];

if ( ![fileManager fileExistsAtPath:filePath] ) {
NSString *bundlePath = [ [ [NSBundle mainBundle] resourcePath]
stringByAppendingPathComponent:@"dbfile.sqlite"];
[fileManager copyItemAtPath:bundlePath toPath:filePath error:nil];
}
return filePath;
}

http://www.pcraft.kr/145

https://github.com/mocra/fmdb-migration-manager


https://github.com/ccgus/fmdb
맥에서
프로젝트 생성할 폴더로 이동 후

git clone [github 사이트에서 제공하는 url]

[fmdb를 불러오는 예]
git clone https://github.com/ccgus/fmdb.git

을 하면 최신으로 파일을 가져온다

+ Recent posts