http://www.cocos2d-iphone.org/forum/topic/8424
애드몹을 사용 하시기 위해서는 위의 사이트에서 등록 하여 고유 넘버 키를 받으셔야 사용이가능 합니다.
참고 사이트 입니다.


=============================================================================
AdViewController.h
#import <UIKit/UIKit.h>
#import <iAd/iAd.h>
#import "AdMobDelegateProtocol.h"

@protocol AdViewControllerDelegate;

@interface AdViewController : UIViewController <ADBannerViewDelegate, AdMobDelegate>
{
 id <AdViewControllerDelegate> delegate;
 id adBannerView;

 AdMobView* adMobAd;
}

@property (nonatomic, assign) id <AdViewControllerDelegate> delegate;

- (id)initWithMasterView:(UIView*)masterView;
- (void)rotateBannerView:(UIDeviceOrientation)toDeviceOrientation;

@end

@protocol AdViewControllerDelegate

- (void)adController:(AdViewController*)controller didLoadiAd:(id)iadBanner;
- (void)adController:(AdViewController*)controller didFailedToRecieveiAd:(id)iadBanner;

- (void)adController:(AdViewController*)controller didLoadAdMobAd:(AdMobView*)adMobBanner;
- (void)adController:(AdViewController*)controller didFailedToRecieveAdMobAd:(AdMobView*)adMobBanner;

@end

AdViewController.m

#import "AdViewController.h"
#import "cocos2d.h"

#import "AdMobView.h"

@implementation AdViewController

@synthesize delegate;

- (UIDeviceOrientation)currentOrientation
{
 return [[CCDirector sharedDirector] deviceOrientation];
}

- (id) initWithMasterView:(UIView*) masterView
{
 if( nil != (self = [super init]) )
 {
  [self setView:masterView];

  //Initialize the class manually to make it compatible with iOS < 4.0
  Class classAdBannerView = NSClassFromString(@"ADBannerView");
  if (classAdBannerView != nil)
  {
   adBannerView = [[classAdBannerView alloc] initWithFrame:CGRectZero];
   [adBannerView setDelegate:self];
   [adBannerView setRequiredContentSizeIdentifiers: [NSSet setWithObjects:
                 ADBannerContentSizeIdentifier320x50,
                 ADBannerContentSizeIdentifier480x32, nil]];

   [self.view addSubview:adBannerView];

   [self rotateBannerView:[self currentOrientation]];

   [adBannerView setHidden:YES];

  }
  else
  {
   //Request an AdMob Ad
   adMobAd = [AdMobView requestAdOfSize:ADMOB_SIZE_320x48 withDelegate:self];
   [adMobAd retain];
  }
 }

 return self;
}

- (void)rotateBannerView:(UIDeviceOrientation)toDeviceOrientation
{
 if (adBannerView)
 {
  if (UIDeviceOrientationIsLandscape(toDeviceOrientation))
   [adBannerView setCurrentContentSizeIdentifier:ADBannerContentSizeIdentifier480x32];
  else
   [adBannerView setCurrentContentSizeIdentifier:ADBannerContentSizeIdentifier320x50];

  [(UIView*)adBannerView setTransform:CGAffineTransformIdentity];

  //Set the transformation for each orientation
  switch (toDeviceOrientation)
  {
   case UIDeviceOrientationPortrait:
   {
    [(UIView*)adBannerView setCenter:CGPointMake(160, 455)];
   }
    break;
   case UIDeviceOrientationPortraitUpsideDown:
   {
    [(UIView*)adBannerView setTransform:CGAffineTransformMakeRotation(CC_DEGREES_TO_RADIANS(180))];
    [adBannerView setCenter:CGPointMake(160, 25)];
   }
    break;
   case UIDeviceOrientationLandscapeLeft:
   {
    [(UIView*)adBannerView setTransform:CGAffineTransformMakeRotation(CC_DEGREES_TO_RADIANS(90))];
    [adBannerView setCenter:CGPointMake(16, 240)];
   }
    break;
   case UIDeviceOrientationLandscapeRight:
   {
    [(UIView*)adBannerView setTransform:CGAffineTransformMakeRotation(CC_DEGREES_TO_RADIANS(-90))];
    [adBannerView setCenter:CGPointMake(304, 240)];
   }
    break;
   default:
    break;
  }
 }

 if (adMobAd)
 {
  [adMobAd setTransform:CGAffineTransformIdentity];

  //Set the transformation for each orientation
  switch (toDeviceOrientation)
  {
   case UIDeviceOrientationPortrait:
   {
    [adMobAd setCenter:CGPointMake(160, 456)];
   }
    break;
   case UIDeviceOrientationPortraitUpsideDown:
   {
    [adMobAd setTransform:CGAffineTransformMakeRotation(CC_DEGREES_TO_RADIANS(180))];
    [adMobAd setCenter:CGPointMake(160, 24)];
   }
    break;
   case UIDeviceOrientationLandscapeLeft:
   {
    [adMobAd setTransform:CGAffineTransformMakeRotation(CC_DEGREES_TO_RADIANS(90))];
    [adMobAd setCenter:CGPointMake(24, 240)];
   }
    break;
   case UIDeviceOrientationLandscapeRight:
   {
    [adMobAd setTransform:CGAffineTransformMakeRotation(CC_DEGREES_TO_RADIANS(-90))];
    [adMobAd setCenter:CGPointMake(296, 240)];
   }
    break;
   default:
    break;
  }
 }
}

#pragma mark -
#pragma mark ADBannerViewDelegate

- (BOOL)allowActionToRun
{
 return YES;
}

- (void) stopActionsForAd
{
 //Pause background music here

 [adBannerView setHidden:YES];

 [[CCDirector sharedDirector] stopAnimation];
 [[CCDirector sharedDirector] pause];
}

- (void) startActionsForAd
{
 //Resume background music here

 [self rotateBannerView:[self currentOrientation]];
 [[UIApplication sharedApplication] setStatusBarOrientation:(UIInterfaceOrientation)[self currentOrientation]];
 [adBannerView setHidden:NO];

 [[CCDirector sharedDirector] stopAnimation];
 [[CCDirector sharedDirector] resume];
 [[CCDirector sharedDirector] startAnimation];
}

- (BOOL)bannerViewActionShouldBegin:(ADBannerView *)banner willLeaveApplication:(BOOL)willLeave
{
 BOOL shouldExecuteAction = [self allowActionToRun];
    if (!willLeave && shouldExecuteAction)
    {
  [self stopActionsForAd];
    }
    return shouldExecuteAction;
}

- (void)bannerViewDidLoadAd:(ADBannerView *)banner
{
 [adBannerView setHidden:NO];
 [delegate adController:self didLoadiAd:banner];
}

- (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error
{
 [adBannerView setHidden:YES];
 [delegate adController:self didFailedToRecieveiAd:banner];
}

- (void)bannerViewActionDidFinish:(ADBannerView *)banner
{
 [self startActionsForAd];
}

#pragma mark -
#pragma mark AdMobDelegate methods

- (NSString *)publisherIdForAd:(AdMobView *)adView
{
 return @"your_admob_publisher_id";    //replace it with you publisher id
}

- (UIViewController *)currentViewControllerForAd:(AdMobView *)adView {
 return self;
}

- (UIColor *)adBackgroundColorForAd:(AdMobView *)adView
{
 return [UIColor colorWithRed:0 green:0 blue:0 alpha:1]; // this should be prefilled; if not, provide a UIColor
}

- (UIColor *)primaryTextColorForAd:(AdMobView *)adView
{
 return [UIColor colorWithRed:1 green:1 blue:1 alpha:1]; // this should be prefilled; if not, provide a UIColor
}

- (UIColor *)secondaryTextColorForAd:(AdMobView *)adView
{
 return [UIColor colorWithRed:1 green:1 blue:1 alpha:1]; // this should be prefilled; if not, provide a UIColor
}

- (NSArray *)testDevices
{
 return [NSArray arrayWithObjects: ADMOB_SIMULATOR_ID, nil];
}

- (void)didReceiveAd:(AdMobView *)adView
{
 CCLOG(@"AdMob: Did receive ad");

 [self rotateBannerView:[self currentOrientation]];
 [self.view addSubview:adMobAd];

 [delegate adController:self didLoadAdMobAd:adView];
}

// Sent when an ad request failed to load an ad
- (void)didFailToReceiveAd:(AdMobView *)adView
{
 CCLOG(@"AdMob: Did fail to receive ad");
 [adMobAd removeFromSuperview];
 [adMobAd release];
 adMobAd = nil;

 [delegate adController:self didFailedToRecieveAdMobAd:adView];
}

#pragma mark -
#pragma mark Memory Management

- (void) dealloc
{
 if (adMobAd)
 {
  [adMobAd setDelegate:nil];
  [adMobAd removeFromSuperview];
  [adMobAd release];
  adMobAd = nil;
 }

 if (adBannerView)
 {
  [adBannerView setDelegate:nil];
  [adBannerView removeFromSuperview];
  [adBannerView release];
  adBannerView = nil;
 }

    [super dealloc];
}

@end

The usage is very simple, #importAdViewController.h in you Layer's .h and add the delegate protocol AdViewControllerDelegate

#import "AdViewController.h"

@interface Menu : CCLayer <AdViewControllerDelegate>
{
 AdViewController *adController;
}

And in your layer's .m add this

- (void)onEnter
{
 [super onEnter];

 adController = [[AdViewController alloc] initWithMasterView:[[CCDirector sharedDirector] openGLView]];
 [adController setDelegate:self];

}

- (void)onExit
{
 //Completely remove the controller
 [adController setDelegate:nil];
 [adController release];
 adController = nil;

 [super onExit];
}

- (void)adController:(AdViewController*)controller didLoadiAd:(id)iadBanner;
{
 //Do something when the ad loads, like moving objects.
}

- (void)adController:(AdViewController*)controller didFailedToRecieveiAd:(id)iadBanner;
{
 //Do something when the ad fails to load, like moving objects.;
}

- (void)adController:(AdViewController*)controller didLoadAdMobAd:(AdMobView*)adMobBanner;
{
 //Do something when the ad loads, like moving objects.
}

- (void)adController:(AdViewController*)controller didFailedToRecieveAdMobAd:(AdMobView*)adMobBanner;
{
 //Do something when the ad fails to load, like moving objects.
}
<script src="http://gods2000.tistory.com/plugin/CallBack_bootstrapper?&src=https://s1.daumcdn.net/cfs.tistory/v/0/blog/plugins/CallBack/callback&id=29&callbackId=gods2000tistorycom292340&destDocId=callbacknestgods2000tistorycom292340&host=http://gods2000.tistory.com&float=left&random=631"></script> 출처 :http://gods2000.tistory.com/29
Posted by 오늘마감

아이폰 용 애플리케이션을 제대로 개발하려면 애플 개발자 센터에 개발자로 등록을 해야 한다.

 

솔직히 이 과정이 짜증이 나기도 하지만 무쟈게 복잡하다. 정리해 두지 않으면 휘발성 메모리에서 훌훌 날아가 버릴 것 같아 이 참에 문서화 해둔다.

 

개발자 등록을 하지 않는다고 SDK를 다운로드 받는 데 제약이 있는 건 아니다.

 

Xcode 등 개발 환경을 못 쓰는 것도 아니다.

  

애플리케이션 개발 자체에 제약을 받는 것도 아니다.

 

그럼 뭐 하러 그 짜증나고 복잡한 짓을 하냐고?

  

개발자로 정식 등록하지 않으면 하다 못해 자신의 기기라 하더라도 자신이 개발한 애플리케이션조차 설치를 못하기 때문이다.

  

개발 단계에서는 시뮬레이터를 통해 시험 및 디버깅을 할 수 있지만 기기 자체에 설치해보려면 어쩔 수 없이 개발자로 등록해야 한다는 거다.

  

http://developer.apple.com/iphone/program

  

  

여기 가서 Enroll Now 버튼을 누질러 주시는 걸로 개발자 등록 과정이 시작된다.

  

한 걸음씩 가보자.

  

1. 개발자 등록

   

  

  

이제 대망의 아이폰 개발자로 등록하는 거다. 컨티뉴~~~

  

  

기존 애플 ID를 사용하거나 새로 만들어야 한다. 세금 문제를 고려해 따로 만들기를 권하는데 난 걍 기존 ID 썼다.

  

개발자로 등록하려면 개인의 경우 연간 $99를 내야 한다. (기업은 더 비싸다.) 인증을 위해서라도 어쩔 수 없는 선택이니 투덜거릴 거면 개발 안 하면 된다.

  

  

하루 이틀쯤 지나면 메일로 활성화 코드(activation code)가 날라온다.

  

  

등록하고 나면 드디어 개발자 사이트가 열린다.

  

  • Xcode - 매킨토시 Objective-C 통합 개발환경 (아이폰 포함)
  • iPhone Simulator - 아이폰이 없어도 시뮬레이터를 통해 개발한 애플리케이션을 실험 및 디버깅 할 수 있다
  • Instruments - 디버거와 프로파일러가 포함돼 있다
  • InterfaceBuilder - GUI 디자인 환경으로 직접 코딩을 하지 않고도 손쉽게 뷰 디자인을 할 수 있다. 특이한 건 VisualStudio 등 여타 IDE내 디자이너처럼 코드를 자동 생성하는 게 아니라 아예 객체(objects)를 인스턴스화해서 냉동실에보관(freeze)하는 구조라는 거다. 애플의 소프트웨어 최적화 신화의 근간이 아닌가 싶다.
  • 나머지는 모두 레퍼런스 자료들이다. 배터지게 읽거나 보고도 남을 정도로 넘쳐난다. 물론, 다 영어다. (근까, 우린 영어 공부 안하면 뭘 해도 먹고 살기 힘들다. 특히, 영어 공부 안하고 한글화를 기다리는 호모 사피엔스는 늘 뒤쳐질 수 밖에 없는 현실이다.구실 찾지 말고 걍 영어 공부하는 게 상책이다.)

  

2. 개발 인증서 발급 받기

  

인증서는 개발자가 애플리케이션에 사인을 하는 것과 같다. 어떤 넘이 만든건지 전자 꼬리표가 따라다닌다는 거다. 금융 거래 할 때공인인증서를 통해 신분을 증명하는 절차와 다를 게 없다. 이 과정이 없다면 게나 고동이나 익명으로 애플리케이션을 개발하고 악성코드를 심어둘 수도 있으니 당연한 절차라 할 수 있다.

  

인증서는 개인 키(private key)와 공개 키(public key)로 구성된다. 개인 키는 개발자 혼자 꿍쳐 두는 열쇠고 공개 키는 개인 키로 암호화된 디지털 데이터를 풀기 위해 공개적으로 배포하는 열쇠다.

  

예컨대, 중요한 워드 문서 하나를 대두족장의 개인 키로 암호화해서 대두족장의 공개 키와 함께 배포하면 오로지 대두족장의 공개키로만 암호화를 풀 수 있다는 거다. 소두족장이란 넘이 이 문서에 장난질을 하고 대두족장의 문서인 것처럼 배포를 하면? 개인키로 암호화했던 데이터와 다르기 때문에 공개 키와 아귀가 맞지 않게 된다. 근까, 대두족장 본인이 사인하지 않은 장난질 문서를누군가 '대두족장이 서명한 문서'로 오인할 가능성이 없다는 말이다. 서명 위조도 하는데 뭐 그까짓 게 안 되겠냐고? 해 보시라.128비트 쯤 되는 키를 깰만한 알고리즘 짱구굴릴 수 있으면 (이 따위 짓이 가능하다고 생각한다면 24같은 드라마나Swordfish 같은 영화 넘 많이 본거다ㅡ.ㅡ) 워렌 버핏 부럽지 않은 부자… 아니 세계 정복 야심도 키울 수 있을 거다.(아마 빈 라덴한테 납치될 지도 모른다…쿨럭~)

  

데이터 보안을 위해 대두족장과 소두족장이 손잡고 일할 수도 있다. 대두족장의 개인 키 + 소두족장의 공개 키로 문서를 암호화 해대두족장이 소두족장에게 메일로 보낸 다음 소두족장의 개인 키 + 대두족장의 공개 키로 풀어 보면 전송 과정에서 데이터가왜곡되거나 변질되지 않았는지 확인이 가능하다는 거다. 예컨대, 0100…..0111 로 보냈으면 당근 도착 후 까봐도0100…0111 이어야 한다는 거다. 0111….1010 따위로 바뀌어져 있다면 껍데기는 그럴 듯 해 보여도 중간에 누군가장난질을 한 거라는 말이다. 보안은 유지하면서도 대두족장과 소두족장은 자신의 도장(개인 키)를 외부에 공개할 필요가 없다. 달랑공개 키만 주고 받으면 (개인 키와 맞물리는 열쇠) 되기 때문이다.

  

그럼 아이폰에서는 왜 쓰냐고?

  

개발자는 개인 키로 애플리케이션에 서명을 하고 공개 키와 함께 설치를 하면 아이폰에서 그 공개 키로 개발자의 신분을 확인한 다음애플리케이션을 실행한다. 분명 서명한 넘은 대두족장인데 사인이 어딘가 짝퉁스럽다면? 글타. 실행 안 된다.

  

아리까리하다면 걍 아이폰 사용자의 안전을 위한 장치라고 생각하면 그만이다.

  

근데 인증서를 지 혼자 만들어 지 혼자 쓰면 애플이 확인할 길이 없다. 그래서 인증서는 공신력 있는 기관에서 확인을 받아야 한다.동사무소 가서 인감도장 등록하는 과정이라 생각하면 된다. 이른바 CSR(certificate signaturerequest)이라는 걸 동사무소(이 경우는 애플)에 제출해야 하는데 이게 바로 개발자의 공개 키가 된다. (과거 사이트 운영할때 이 과정 지랄 맞게 복잡했는데 요즘은 손 안 대고 코 푸는 수준이다ㅠ.ㅠ)

  

개인 키 및 공개 키(CSR)는 맥의 키체인 유틸리티로 생성할 수 있다.

  

메뉴에서 '키체인 접근 -> 인증 지원 -> 인증 기관에서 인증서 요청'을 순서대로 클릭해 다음처럼 인증 정보를 입력하고 디스크에 저장한다.

  

  

디폴트로 키 크기가 2048비트, RSA 알고리즘의 키를 생성해 준다.

  

2048비트로 암호화된 데이터를 깨는 해커는 영화에도 등장할 가능성이 없다. 외계인 캐릭터가 아닌 이상 이 따위 헛소리를 지껄이면 욕먹기 딱이니깐ㅡ.ㅡ

  

CSR을 저장했다면 개발자 프로그램 사이트로 가서 신청을 한다.

  

http://developer.apple.com/iphone/manage/overview/index.action

  

 

왼쪽 메뉴에서 Certificate을 클릭하면 뜨는 화면이다. 난 이미 인증서를 받았기 때문에 저렇게 나오지만 아직 인증서 발급을받지 않은 상태라면 CSR을 선택해 업로드 할 수 있는 화면이 뜬다. 개발용은 Development 화면에서, 배포용은Distribution 탭에서 처리할 수 있다. 

  

근까, 개발용이든 배포용이든 기본적으로 다음과 같은 화면에서 CSR을 업로드하게 된다. (다음은 배포용의 경우다.)

  

  

CSR을 업로드하면 승인할지 묻는 화면이 뜨는데 오케바리를 눌러주면 그만이다.

  

  

그런 다음 Download 버튼을 클릭해서 발급 받은 인증서를 개발자 맥에 다운받으면 된다.

  

인증서를 더블클릭하면 키체인 유틸리티가 떠서 '추가하까?' 물어본다. 추가 안할거면 이 개고생 할 이유가 없다. 당근이라고 클릭해 준다.

  

요기까지 하면 이제 대두족장의 맥북은 대두족장 전용 아이폰 개발 머신이 된다. 다시 말해, 이 개발 머신에서만 대두족장 신분으로개발한 애플리케이션을 디지털 서명하고 실행할 수 있다는 거다. 돈이 좀 튀어서 개발 머신이 두 세대 쯤 된다면 함께 생성한 개인키를 해당 개발 머신에도 복사해 주면 된다.

  

  

키체인에서 개인 키 클릭하고 내보내기 해서 2차, 3차, 4차…n차(오우~ 돈이 좀 많이 튀나 보지?ㅡ.ㅡ) 머신에 심어 주면 되신다고 하는데 나도 안 해봤으니 돈을 주체하지 못해서 맥을 2대 이상 굴리는 분은 해 보시라. 

3. 개발 기기 등록

  

개발자의 아이폰도 등록해 줘야 한다.

  

역시 개발자 프로그램 사이트 오른쪽 메뉴에서 Devices를 클릭한다.

  

  

Add Device 버튼을 클릭해 기기 이름(자신이 식별하기 위한 거니까 아무거나 쓰면 된다)과 Device ID를 입력해 준다. Device ID는 아이폰 연결하고 아이튠즈에서 확인할 수 있다.

  

4. 애플리케이션 ID 생성

  

왼쪽 메뉴를 보면 App IDs라는 게 있다. 기기 뿐 아니라 애플리케이션도 ID를 등록한다.

  

  

1Z3K14B128.so.what

  

애플리케이션 ID는 두 부분으로 나뉘는데 앞의 암호 같은 부분이 번들 시드(bundle seed)라는 걸로 애플이 알아서 만들어주는 거고 나머지는 개발자가 입력한다. 애플리케이션마다 일일이 만들기 귀찮으면 와일드카드를 쓸 수도 있다.

  

  

와일드카드를 쓰면 개발할 때마다 일일이 신경 쓰지 않아서 편하겠지만, Push Notification 기능을 사용할 수 없다고경고한다. 푸시는 딱 꼬집어 그 넘과만 연동돼야 하기 때문에 구체적으로 애플리케이션 ID를 만들어줘야 한다는 거다.

  

5. 개발용 프로비전 생성

  

프로비전이란 앞에서 마련한 디지털 신원 확인 데이터(개발 인증서, 기기 ID, 애플리케이션 ID 등)를 한 데 묶은 패키지라 할수 있다. 이걸 개발용으로 쓰려는 아이폰에 깔아주면 그제서야 개발용 아이폰이 완성되는 거다. 개발자의 인증서로 디지털 서명이 돼있고, 프로비전에 포함된 기기 ID와 실제 아이폰 ID가 동일해야 하며, 애플리케이션 ID도 일치해야 애플리케이션이 실행된다.(배포할 때는 모든 기기에서 쓸 수 있어야 하기 때문에 애플리케이션 ID 정보는 빠진다.)

  

  

NewProfile 버튼을 클릭해 프로파일 이름을 입력하고 인증서를 선택한 다음 애플리케이션 ID 및 사용 기기를 골라 Submit해주면 Download할 수 있는 화면이 나오고 *.mobileprovision 이라는 파일을 다운로드 받게 된다. 이걸더블클릭하면 Xcode Organizer가 뜬다. 프로비전 파일을 my iPhone에 드래그해주면 개발자의 아이폰에 설치가된다.

  

  

5. 프로젝트 설정

  

아이폰에 프로비전을 설치했으면 프로젝트에서도 궁합을 맞춰줘야 한다. 다음 화면은 개인적으로 Stanford University의아이폰 애플리케이션 개발 강좌를 따라해보며 만든 Stalker란 프로젝트의 Info 화면이다. Xcode의 Project메뉴에서 Edit Project Settings를 클릭하고 Build 탭을 누르면 Code Signing Identity 항목을볼 수 있다. Any iPhone OS Device를 클릭하면 다음과 같은 화면이 뜬다.

 

*참고로 영어가 부담스럽지 않은 분이라면 아이튠즈에서 무료로 볼 수 있는 Stanford University의 iPhoneApplication Programming 강좌를 강추한다. 어떤 책 보다도 감 잡기 쉬울 거다. (특히, 질의응답을 형식이아닌 필수 요소로 생각하는 외넘들의 대학 강의 모습에 감동 받을 기회가 되기도 한다…쿨럭~)

  

  

여기서 원하는 프로비전을 선택해 주면 된다. (구체적으로 만든 애플리케이션 ID가 아니라 와일드카드를 써서 퉁친 애플리케이션ID라면 여러 프로젝트에서 공용으로 쓸 수 있다. 근까, 공부하는 중이라 프로젝트를 남발할 게 뻔하다면 와일드카드 애플리케이션ID를 만들어 둬야 생고생 안 한다.)

  

여기까지 마치고 아이폰 연결한 다음 프로젝트를 실행하면 (시뮬레이터가 아닌 Device를 타겟으로 설정해야 한다) 짜잔~ 아이폰에서 프로그램이 뜨는 걸 목도할 수 있다.



출처 : http://blog.naver.com/PostView.nhn?blogId=knifeven&logNo=130095318358
Posted by 오늘마감
[아이폰 앱 개발] iphone crash log 위치 on the MAC 및 로그까는 symbolicatecrash프로그램 및 설치하기 명령어

IPhone Crash Logs

Sometimes programs crash. This annoys users and developers alike. Users are frustrated because they cannot use crashing software, developers are frustrated because they have to hunt bugs instead of doing something creative and rewarding. How do we communicate if an iPhone application crashes?

I’ll start with a disclaimer. I’m not sure whether the information provided in this post is covered by iPhone Developer Program NDA or not. If it is, the post will be removed. Secondly, this post is a result of googling, so I haven’t invented anything new here.

Working with crash logs typically involves certain interaction between developers and users, unless they are automagically sent to the developer. First of all, the user should get the crash log and send it to the developer, who should examine it, find the bug and fix it.

iPhone OS and Mac OS X are remarkably similar architectures. Both store crash logs to help identify crashing bugs. The difference between the two is how users retrieve them. On Mac OS X every user has unrestricted access to crash logs related to the applications she runs. The iPhone does not even have a file browser. What to do? iTunes comes to the rescue.

Whenever you synchronize your iPhone or iPod Touch, all the crash logs are transferred to your computer. Here are their locations:

  • Mac OS X:~/Library/Logs/CrashReporter/MobileDevice/<DEVICE_NAME>
  • Windows XPC:\Documents and Settings\<USERNAME>\Application Data\Apple computer\Logs\CrashReporter/<DEVICE_NAME>
  • Windows VistaC:\Users\<USERNAME>\AppData\Roaming\Apple computer\Logs\CrashReporter/MobileDevice/<DEVICE_NAME>

The log file names start with application name and have the extension “crash”. They are just plain text files and can be sent by e-mail in original or zipped form, or even copy-pasted into your e-mail program.

The second part is trickier. Both Apple and common sense suggest that all AppStore binaries are shipped with stripped symbols. If you ever saw a crash log like this, read on:


까보면 아래처럼 나옮.. 저 밑에 어플리케이션하나 설치하면 크래쉬로그를 인간이 이해할 수 있는 

메모리에서 돌아가던 콘트롤명이나 생성한 객체들이나 이벤트들이 보이게됨.


Thread 0 Crashed:
0   libobjc.A.dylib           0x300c87ec 0x300bb000 + 55276
1   MobileLines               0x00006434 0x1000 + 21556
2   MobileLines               0x000064c2 0x1000 + 21698
3   UIKit                     0x30a740ac 0x30a54000 + 131244
4   UIKit                     0x30a66110 0x30a54000 + 74000
5   UIKit                     0x30a6565c 0x30a54000 + 71260
6   GraphicsServices          0x3169b0b4 0x31696000 + 20660
7   GraphicsServices          0x3169d818 0x31696000 + 30744
8   IOMobileFramebuffer       0x31f3e8f8 0x31f3d000 + 6392
9   com.apple.framework.IOKit 0x30f342b8 0x30f30000 + 17080
10  CoreFoundation            0x3025ced4 0x30229000 + 212692
11  CoreFoundation            0x3025bed6 0x30229000 + 208598
12  CoreFoundation            0x3025b584 0x30229000 + 206212
13  GraphicsServices          0x316998e4 0x31696000 + 14564
14  UIKit                     0x30a5e308 0x30a54000 + 41736
15  UIKit                     0x30a671dc 0x30a54000 + 78300
16  MobileLines               0x00002090 0x1000 + 4240
17  MobileLines               0x0000202c 0x1000 + 4140

In a nutshell, it contains function addresses and offsets instead of function names and line numbers. The structure is obvious, but, to be honest, I don’t know what “MobileLines 0×00006434 0×1000 + 21556″ is, even though I have all the source code. Thanks to Apple Developer Tools and to Craig Hockenberry who wrote about it, we have a perfect solution called symbolicatecrash.


위의 크래쉬로그를 가독성있게 분석할 수 있도록하는 툴


/usr/local/bin/으로 위의 프로그램 옮기고

$ sudo cp /Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Plug-ins/iPhoneRemoteDevice.xcodeplugin/Contents/Resources/symbolicatecrash /usr/local/bin/

위의 명령어로 설치하고

$ symbolicatecrash report.crash MobileLines.app.dSYM > report-with-symbols.crash

통해  크래쉬로그를 가독성있도록 바꿈


I copied it to /usr/local/bin/ so that I can run it whenever I want without trying to remember its original location (you may prefer a symbolic link):
$ sudo cp /Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Plug-ins/iPhoneRemoteDevice.xcodeplugin/Contents/Resources/symbolicatecrash /usr/local/bin/

Running this script with the -h option provides the minimal help:

$ symbolicatecrash -h
usage:

    symbolicatecrash [-Ah] LOGFILE [SYMBOL_PATH ...]

    Symbolicates a crashdump LOGFILE which may be "-" to refer
  to stdin. By default, all heuristics will be employed
  in an attempt to symbolicate all addresses. Additional
  symbol files can be found under specified directories.

Options:
    -A  Only symbolicate the application, not libraries
    -h  Display this message
    -v  Verbose

To add symbols to the crash log you need the dSYM file generated by the linker when you compiled your application for AppStore. In other words, when you build for AppStore you should keep the dSYM package in a safe place backed up by Time Machine. This is very important. You should keep a copy of the dSYM for each version of your application ever shipped. If you have the package, translating code offsets to function names with line numbers has never been easier:

$ symbolicatecrash report.crash MobileLines.app.dSYM > report-with-symbols.crash

Here is the result:


Thread 0 Crashed:
0   libobjc.A.dylib           0x300c87ec objc_msgSend + 20
1   MobileLines               0x00006434 -[BoardView setSelectedPiece:] (BoardView.m:321)
2   MobileLines               0x000064c2 -[BoardView touchesBegan:withEvent:] (BoardView.m:349)
3   UIKit                     0x30a740ac -[UIWindow sendEvent:] + 264
4   UIKit                     0x30a66110 -[UIApplication sendEvent:] + 248
5   UIKit                     0x30a6565c _UIApplicationHandleEvent + 4088
6   GraphicsServices          0x3169b0b4 PurpleEventCallback + 428
7   GraphicsServices          0x3169d818 HeartbeatVBLCallback + 152
8   IOMobileFramebuffer       0x31f3e8f8 IOMobileFramebufferNotifyFunc + 124
9   com.apple.framework.IOKit 0x30f342b8 IODispatchCalloutFromCFMessage + 304
10  CoreFoundation            0x3025ced4 __CFMachPortPerform + 72
11  CoreFoundation            0x3025bed6 CFRunLoopRunSpecific + 2364
12  CoreFoundation            0x3025b584 CFRunLoopRunInMode + 44
13  GraphicsServices          0x316998e4 GSEventRunModal + 268
14  UIKit                     0x30a5e308 -[UIApplication _run] + 404
15  UIKit                     0x30a671dc UIApplicationMain + 1064
16  MobileLines               0x00002090 main (main.m:16)
17  MobileLines               0x0000202c start + 44

Now, this is much better. Happy debugging!

Other useful references:

http://www.anoshkin.net/blog/2008/09/09/iphone-crash-logs/
    Posted by 오늘마감
    picker의 스크롤로 값선택여부 및 선택된 값 자동감지

    #pragma mark -

    #pragma mark UIPickerViewDelegate


    - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component

    {

    if (pickerView == myPickerView)// don't show selection for the custom picker

    {

    // report the selection to the UI label

    label.text = [NSStringstringWithFormat:@"%@ - %d",

    [pickerViewArrayobjectAtIndex:[pickerView selectedRowInComponent:0]],

    [pickerView selectedRowInComponent:1]];

    }

    }


    Posted by 오늘마감
    아이폰 어플, text파일 생성 및 내용 저장하는 방법

    TEXT파일 생성 & 파일에 내용 저장

    NSArray* paths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES );
    NSString* documentsDirectory = [paths objectAtIndex:0];

    NSString* fullFileName = [NSString stringWithFormat:@"%@/%@", documentsDirectory,@"log.txt"];

     const char* szFilePath = [fullFileName UTF8String];

     FILE* fp = fopen( szFilePath, "w" );
     if(fp == nil)     NSLog(@"do not exist log file");
     else

    {

       NSString *tableAtt = @"haejinLee";

       // NSString을 char로 바꾸는 작업,

       // 굳이 NSString을 만들지 않아도 되는상황에선 char를 먼저 사용합니다.

       const char* ctableAtt = [tableAtt UTF8String];

       fputs(ctableAtt, fp);

    }

    아이폰으로 실행시켜 보면

    파일이 저장경로는 My Computer에서 Raw File System에서

    (저는 i-FunBox에서 확인하였습니다)

    //var/mobile/Applications/어플번호/Documents에서 확인하실수 있습니다.

    어플번호를 몰라서 당황하시는 분들은

    당황하실 필요 없습니다..그냥 자신의 아이폰에 저장되어 있는 어플 (개발 목적으로 넣은어플)

    중에 하나..입니다.



    출처 : http://blog.naver.com/PostList.nhn?blogId=heajin722¤tPage=27
    Posted by 오늘마감
    picker의 스크롤로 값선택여부 및 선택된 값 자동감지

    #pragma mark -

    #pragma mark UIPickerViewDelegate


    - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component

    {

    if (pickerView == myPickerView)// don't show selection for the custom picker

    {

    // report the selection to the UI label

    label.text = [NSStringstringWithFormat:@"%@ - %d",

    [pickerViewArrayobjectAtIndex:[pickerView selectedRowInComponent:0]],

    [pickerView selectedRowInComponent:1]];

    }

    }




    출처 : http://blog.naver.com/PostList.nhn?blogId=philipousys¤tPage=12
    Posted by 오늘마감
    아이폰기본사용2010.08.26 07:57

    6월 19일 아이폰(iPhone) 3GS가 미국을 비롯한 유럽 몇 개국에서 정시 발매를 시작했습니다. 정식 출시되기 전에 이미 3GS 사진이 유출되기도 했었습니다. 그런데 이번에는 출시된 지 만 하루가 지나기도 전에 3GS 전체 분해 과정이 사진과 함께 자세히 올라왔습니다. 분해 과정 설명도 비교적 자세하게 잘 해 놓았습니다. 분해 과정을 설명해 놓은 곳은 Rapidrepair 라는 애플 제품 및 ZUNE, XBOX, 플레이스테이션, 닌텐도 전문 수리 사이트입니다. 영문 설명과 함께 보다 자세한 분해 과정을 보시려면 이곳 을 클릭해 주세요. ^^




    #1 - LCD 스크린, #2 - 디지털 변환 장치, #3 - 이어(Ear) 스피커, #5 - 헤드폰 잭, #6 - 무선 
    P.S. #3 번은 #1번과 #2번 아래에 숨어 있다. 



    이것이 배터리입니다. 배터리의 지속 시간을 문제삼는 사람들이 많아서 크기가 많이 작을 줄 알았는데 생각보다 많이 작지는 않네요.  
    배터리 정보는 다음과 같습니다. 
    APN: 616-0434
    VPN: APPLE-08-003-01(GG)
    Li-ion Polymer Battery: 3.7V 4.51Whr


    드디어 완전히 다 분해한 모습입니다. 

    왼쪽이 3GS, 오른쪽이 3G 시스템 보드이다. 

    사진만 봐도 엄청 복잡하네요. 저를 비롯한 보통 사람들은 분해 엄두도 못낼 정도로 복잡해 보입니다. 

    CPU - Samsung
    339S0073ARM
    K2132C2P0-50-F
    0N1480911
    APL0298
    N1TVY0Q 0919

    NAND Flash Memory - Toshiba TH58NVG702ELA89
    IA8816
    TAIWAN
    09209AE

    System Memory - 337S3754
    CMA
    G0919
    5Y9307885E4

    Infineon - 36MY1EE
    A9177314
    Z171033B

    iPhone 3G S                           Palm Pre CPU Samsung S5PC100 Texas Instruments OMAP 3430 ARM Cortex A8 600 MHz, PowerVR SGX graphics ARM Cortex A8 600MHZ, PowerVR SGX 530 (GPU), 430MHz C64x, DSP and ISP (Image Signal Processor) Baseband Processor Updating soon Qualcomm MSM6801A Storage Internal 16/32 GB Internal 8 GB Memory 256 MB RAM 256MB DDR2  LCD 3.5-inch 480-by-320-pixel at 163 ppi Multi-Touch display 3.1-inch 480-by-320-pixel Multi-Touch display Connectivity
    UMTS/HSDPA (850, 1900, 2100 MHz)
    UMTS/HSDPA (1900, 2100 MHz) GSM/EDGE (850, 900, 1800, 1900 MHz) GSM/EDGE (850, 900, 1800, 1900 MHz)


    iPhone 2G iPhone 3G iPhone 3G S Palm Pre CPU Baseband Processor Storage Memory LCD Battery Connectivity Size Camera 
     


    출처 : http://blog.naver.com/PostView.nhn?blogId=baek2187&logNo=150074791078
    Posted by 오늘마감
    아이폰뉴스2010.07.01 19:59
    아이폰4 자유낙하시험 및 아이폰4 믹서기로 갈겠다는 예고편~ ㅋㅋㅋ

    아이폰4 자유낙하시험

    (This is what'll happen when you drop your iphone 4)

    역시나 아이폰4 출시하자마자  이런 테스트 하는 곳이  나오는군요. ㅋ 이 비싼 기기를 이렇게 날려버리다니 ㅎㄷㄷ (후원하니까 이렇게 하는거겠죠? ㅎ)

    벽에다 막 집어던지고 믹서기로 갈고 차로 밟고 지나가고 불붙여보고 하여튼 여러 테스트들 많이 나올겁니다. -_-;;;

    인기 있는 제품인게 죄이지요. ㅋㅋ

    첫번째 떨어뜨렸을때는 특별한 변화가 없었고

    두번째 자유낙하시 기기의 전원이 꺼지기는 했지만 액정에는 손상이 없었습니다.

    세번째는 이상이 없었으나 네번째 떨어뜨렸을 때 이전에 보고된 것처럼 강화유리가 깨지는 모습을 보였습니다.

    하지만!! 이런 결과가 일반적인 결과는 아니니 참고하세요. 100번 떨어뜨려도 안깨질수도 있고 그런거 아니겠어요. ㅎㅎ 

    가장 기대되는건 아이폰을 믹서기로 가는 영상입니다. 이제 곧 아이폰4를 믹서기에 가는 동영상도 나오겠네요.

    아이패드, 예전 아이폰 모델들은 이미 갈렸죠. ㅎㅎㅎ

    출처 : http://gizmodo.com/5571304/this-is-whatll-happen-when-you-drop-your-iphone-4

    이건 아이폰(iPhone) 처음 모델 나왔을때 믹서기로 갈던 영상입니다. ㅎㄷㄷ

    맨처음에 믹서기 광고 제대로 하죠. ㅋㅋㅋ

    아이폰 3G 모델

    아이패드(iPad)

    아이폰4 믹서기 예고편. 아이폰4는 출연(?) 안하지만 재밌네요. ㅎㅎㅎ

    25일날 믹서기로 갈겠다고 하네요. ㅋㅋ



    출처 : http://blog.naver.com/PostView.nhn?blogId=jkw1120&logNo=60109759656
    Posted by 오늘마감
    아이폰기본사용2010.06.24 07:58
    탈옥 및 안정화
    원문 : http://litdemon.springnote.com/pages/5723585

    Iphone

     해킹후 할일

    1. AppSync 설치 하기

      1. 이 프로그램은 아이튠즈와 크랙 어플이 동기화 될수 있게 해 주는 프로그램이다. 해킹 후 꼭 설치하기 바란다.
    2.  CategoriesSB 설치 

      1. http://apt.iguides.ru
    3.  deb 파일 설치하기

      1. var/root/Media/Cydia/AutoInstall 에 복사하고 권한 설정 755로 리부팅
      2. 경로가 없을 겨우 새로 만들어 준다.

        1. categoriessb_1.6.3_iphoneos-arm.deb : 카테고리 설치 파

    소스 추가 방법까지 알았으면, 이제는 본격적으로 주요 Cydia 어플들을 아이폰에 깔 차례다.

    처음에는 어떤 어플을 깔아야 할 지 막막할 것이다. 일단 경험자로서 몇 가지 어플을 추천해드린다. 다음에 소개하는 Cydia 어플들은 필자가 오래전에 개인적으로 사용해본 경험을 통해 괜찮다고 생각되는 것들을 고른 것이다. 그러다보니, 좋은 어플이지만 본의 아니게 빠진 것이 있을 수도 있고, 더 좋은 기능을 가진 어플이 있는데도 추천된 경우도 있을 것이다. 그렇더라도 Cydia 어플들의 대표격인 프로그램들이 본인의 필요에 따라 써보면 무리가 없을 것이다.

    일단 앞서 본 방식으로 어플을 통해 아래 소스들을 아이폰에 추가한다.

    Hackulo.us
    http://cydia.hackulo.us/
    xSellize
    http://cydia.xsellize.com/
    SiNfuL iPhone Repo
    http://www.sinfuliphonerepo.com

    아래 2개의 소스는 Cydia에서 유료로 제공되는 어플들의 ‘크랙crack 본'을 제공하는 곳이다. 원래 Cydia를 만든 취지가 개방적인 자료 공개였지만, 인기가 높은 어플들은 유료로 제공되는 경우도 많다. 이들 어플들을 다른 프로그래머들이 무료로 쓸 수 있도록 크랙킹해서 제공하는 곳이다. 물론 유료라고 해도 몇 천원 수준으로 부담되는 것은 아니지만, 처음부터 유료 어플을 쓰기는 Paypal 등 해외 계정을 만드는 등 과정이 번거롭다. 그래서, 일단 유료로 결제한 뒤에 제공되는 비밀번호나 시리얼넘버 등이 필요 없게 만든 크랙본을 제공하는 소스부터 깔고 시작하는 것이다.

    미리 말해둘 것은, 이들 소스를 추가하는 과정에서 접속이 용이하지 않을 수도 있다. 소스 추가가 잘 안 된다면 될 때까지 몇 번 시도해보는 수고가 필요하다. 외국 시간대에 따라 간혹 접속이 되지 않는 경우도 있고, 돌연 소스가 없어질 때도 있기 때문이다.


    위의 소스가 추가됐으면, 어플의 하단 마지막에 있는 [Search] 버튼을 이용해서 해당 소스들에 올라와 있는 어플(프로그램)들을 검색해가면서 자기 아이폰에 설치하면 된다.
    유의할 것은, 어플 중에는 홈 화면에 아이콘이 따로 생기는 것도 있고 없는 것도 있다. 또 어떤 어플들은 아이폰에 설치하면 자동으로 재부팅하는 경우도 있다. 앞서 살펴본 설치 과정을 반복하면서 필요한 프로그램들을 깔면 되겠다.

    이 과정에서 해당 소스의 서버가 불안정해 다운받다가 실패할 경우가 있다. 아이콘이 생기지 않는 프로그램인 경우에는 제대로 깔린 것인지 알기 곤란할 경우도 있다. 제대로 깔린 것인지 확인하려면, 해당 프로그램을 선택했을 때 어플에서 해당 프로그램으로 들어가면, 오른쪽 상단에 [Modify]라는 버튼이 보인다. 만약 설치에 실패한 경우에는 [Install] 버튼이 그대로 있다. 이럴 경우에는 제대로 프로그램이 깔릴 때까지 계속 시도하는 인내심이 필요하다.

    Cydia 어플을 아이폰에 본격적으로 깔기에 앞서, 다음 두 소스부터 추가해야 한다.

    Afc2add
    아이폰 OS 3.1.2 버전에서 Root 메뉴에 접속하기 위해서 깔아야 하는 시스템 유틸
    AppSync for OS 3.1.2
    크래킹 된 어플이 아이폰에 깔리도록 하는 프로그램(아이콘 따로 없음). 이 프로그램은 여러 가지 버전이 있는데, 아래 그림처럼 SiNfuL iPhone Repo 소스로 깔아야 한다.



    이제부터는 자기가 필요한 기능을 가진 프로그램들을 하나하나 설치하면 되겠다. 앞서 과정까지 정상적으로 진행됐다면 [Search] 버튼을 이용해서 해당 프로그램을 선택해서 하나씩 설치하시라. 해당 프로그램을 골라서 설치한 뒤에는 반드시 아이폰을 완전히 껐다가 재부팅해야 한다는 점만 명심하자.

    다음은 필자가 추천하는 Cydia 어플들 리스트와 간단한 설명들을 정리한 것이다. 이들 Cydia 어플들에 대한 기능별 상세한 설명은 <아이폰 실용 탐구생활> 책 407-414에 해당 프로그램의 화면과 함께 정리했으니 참고하시면 되겠다.

    SBSettings
    아이폰의 각종 모드mode 설정을 간편하게 할 수 있게 해주는 프로그램. 아이콘은 따로 없으나 메뉴 바를 건드리면 이 프로그램의 설정 메뉴가 바로 나타난다. 이 프로그램은 아이폰의 각종 설정을 바꿀 수 있는 중요한 프로그램이라 세팅법을 따로 자세히 설명할 것이다.

    Categories
    프로그램들을 폴더로 묶어서 보관하게 해준다(아이콘 있음).

    Categories v1 Icons
    폴더 아이콘으로 쓸 수 있은 것이 추가된다. (아이콘 따로 없음)

    Cyntact Cracked
    연락처에서 사진도 같이 보여주는 프로그램(아이콘 따로 없음). SiNfuL iPhone Repo 소스로 깐다.

    Cydelete
    Cydia 어플들을 정식 어플처럼 지울 수 있게 해 준다. 이 프로그램을 설치하지 않으면, Cydia 어플들을 삭제할 때마다 매번 Cydia에 접속해서 지워야 하는 번거로움이 있다(아이콘 따로 없음).

    Installous
    iTunes 없이도, 크래킹 된 어플을 깔 수 있도록 해주는 프로그램 (아이콘 있음).

    iPotect Cracked
    어플 각각 마다 실행할 때 비밀번호Lock를 걸어놓을 수 있게 해주고, 홈 화면에 있는 어플들의 아이콘을 마음대로 이동하거나 지워지지 않게 하는 프로그램(아이콘 있음).

    Makeitmine
    홈 화면 상단에 있는 '상태 바Status bar'에 있는 통신사 로고(한국은 KT의 ‘Show’)를 비롯해 가운데 배너의 이름을 원하는 대로 바꿀 수 있게 해주는 프로그램(아이콘 있음).

    Map Enhancer
    원래 아이폰에서 지도 관련 어플을 실행하면 무선통신망을 통해 맵데이터를 받았다가(스트리밍 방식), 해당 어플을 끄면 다시 지워진다. 그래서 지도 프로그램을 실행하면 지도가 뜨기까지 시간이 걸리고, 이 과정에서 데이터통신 요금도 발생할 수 있다. 이 프로그램을 깔면 한 번 받은 지역의 맵데이터를 보관하고 있다가, 다시 실행할 때 즉시 로딩하도록 해준다(아이콘 없음).

    MxTube
    아이폰에 기본으로 설치된 어플로 YouTube에 올라온 영상을 보는 것은 지도처럼 스트리밍 방식이라 해당 동영상을 보고나면 사라진다. 하지만 이 어플은 이들 동영상을 mp4 형식으로 변환해서 다운로드해 저장할 수 있게 해준다.

    OpenSSH
    [Search]로 검색하면 같은 이름의 프로그림이 2개 나오는데, 이중 위의 것을 깔면 된다. FTP 프로그램으로, 아이폰 메뉴에 접근할수 있게 해준다(아이콘 따로 없음)

    QuickReply for SMS
    문자가 와서 답장할 때, <몌시지> 등 문자 어플을 실행해서 들어가지 않고, 대기화면에서 바로 보낼 수 있게 해준다(SiNfuL iPhone Repo 소스로 깐다. 아이콘 따로 없음).

    Recent/CallLog Delete
    아이폰 통화 목록은 전체를 한꺼번에 지우는 것만 가능한데, 이 프로그램을 깔면 특정 전화번호만 선택해 삭제할 수 있게 된다(SiNfuL iPhone Repo 소스로 깔자. 아이콘 따로 없음).

    Winterboard
    아이폰의 각종 어플들의 모양을 마음대로 바꾸는 ‘테마’ 설정을 할 수 있게 해주는 프로그램(아이콘 있음).

    3G unrestrictor Crack
    원래 같은 인터넷전화는 Wi-Fi 상태에서만 쓸 수 있는데, 이 프로그램은 3G망 상태에서도 인터넷전화를 쓸 수 있도록 해준다(SiNfuL iPhone Repo 소스로 깐다. 아이콘 있음)

    Siphon
    SIP(세션 개시 프로토콜) 기반의 무료 인터넷전화를 쓸 수 있는 Sip폰을 사용해주는 유틸이다. Wi-Fi 상태만 아니라라 3G망에서도 인터넷전화를 쓰게 해주는 설정이 자체적으로 들어있다. 정식 어플들보다 완성도가 높으므로, Sip폰을 쓸 예정이면 이 어플을 추천한다.

    iMobileCinema
    아이폰에서는 원래 플래시 영상은 재생할 수 없지만, 이 프로그램은 플래시 기반의 동영상 사이트를 감상할 수 있도록 해준다.

    iMobileCinema SBControl
    iMobileCinema 기능을 켜고 끄는 것을 SBSettings의 토글에서 할 수 있게 해주는 프로그램이다.



    출처 : http://blog.naver.com/PostView.nhn?blogId=rioms81&logNo=60107004881
    Posted by 오늘마감
    아이폰기본사용2010.06.21 23:55
    아이폰 바이러스 점검 및 루트 비밀번호 변경방법

    다름이 아니라 아이폰 탈옥 이후 배터리 소비량이 급격히 증가하신 분들은

    poc-bbot 이라는 웜 바이러스를 의심해보셔야 합니다.

    탈옥한 아이폰에서만 발생하는 문제이고 원인은 아마 ssh 개방때문인 것으로 보입니다.

    따라서, 다음과 같은 절차로써 문제를 해결할 수 있습니다.

    1. 아이폰으로 cydia 어플중, mem-tools 라는 프로그램을 다운 받습니다.

    2. mem-tools 프로그램을 실행시키고, 아래탭중 process를 선택합니다.

    3. poc로 검색하여 poc-bbot 이라는 것이 나오는지 확인합니다.

    4. 만약 나왔다면 웜바이러스에 감염된 상태입니다. kill process로 poc-bbot을 종료합니다.

    5. ifunbox같은 파일시스템 브라우저를 통해서 /bin/ 에 접근합니다.

    6. poc-bbot 이라는 바이너리가 있는지 확인하고 삭제합니다.

    7. 역시 /bin/에 접근하여 sshpass 바이너리를 삭제합니다.

    8. blackra1n으로 재부팅합니다.

    일단은 위 절차로 바이러스를 삭제할 수 있습니다.

    앞으로 있을지도 모르는 ssh를 통한 웜바이러스 감염을 막기 위해서는

    ssh의 root 계정의 비밀번호를 바꾸셔야합니다.

    아이폰의 root 계정은 alpine이라는 비밀번호로 일괄 통일 되어있습니다.

    따라서 ssh가 열려있다면 해커는 간단하게 root 계정을 획득할 수 있습니다.

    매우 심각한 일이죠 ^^;

    다음의 절차를 통해서 루트계정의 비밀번호를 변경할 수 있습니다.

    1. cydia 를 실행하고 메인페이지의 feature app중 mobile terminal이라는 프로그램을 다운받습니다.

    2. mobile terminal을 실행시킵니다.

    3. shell이 뜨면 다음과 같이 입력합니다.(프롬프트 설정은 다를 수도 있습니다.)

    iphone-3.1.2] $  su root

        root 계정의 비밀번호를 묻습니다.

        passwd : alpine

    iphone-3.1.2@root] $  passwd

        변경할 비밀번호를 입력합니다.

        passwd : *****

        변경할 비밀번호를 재입력합니다.

        passwd : *****   

    iphone-3.1.2@root] $

    4. 터미널을 종료합니다.

    여기까지 하셨으면 당분간은 ssh를 통한 접근을 막을 수 있습니다.

    제 생각으로는 100% 완벽한 것은 아닙니다만 일단은 이렇게 사용하심이 나을것입니다.

    저같은 경우에도 poc-bbot에 감염 되어있었고, 시간당 idle로 냅둬도 5%이상 배터리가 소진되었지만

    위의 처리를 하고서 1~2%만 감소함을 확인하였습니다.

    또, 일반 어플 실행시에 끊긴다거나 정상적으로 동작하지 않는다거나 하는 문제도 있었는데 해결되었네요.

    한번 검사해보시기를 추천합니다. ^^



    출처 : http://blog.naver.com/PostView.nhn?blogId=dandyher&logNo=150087795381
    Posted by 오늘마감