2014. 1. 20. 19:06
# 추가해야하는 FrameWorks
> 다운받아서 추가해야 하는 frameWorks
GoogleOpenSource.framework, GooglePlus.bundle, GooglePlus.framework

> 자체라이브러리에서 추가해야 하는 frameworks
CoreMotion.framework, MobileCoreServices.framework, CoreText.framework, AssetsLibrary.framework

Build Setting 의 other linker flag 에 -ObjC 옵션 추가할것 (빠지면 Link Error 발생함)



AppDelegate.h


#import <GooglePlus/GooglePlus.h>


@interface AppDelegate : UIResponder <UIApplicationDelegateGPPDeepLinkDelegate>


- (void)didReceiveDeepLink:(GPPDeepLink *)deepLink;


AppDelegate.m


#import <GooglePlus/GooglePlus.h>

...

static NSString * const GooglePlusAppClientID = @"App Key";


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

{

[GPPSignIn sharedInstance].clientID = GooglePlusAppClientID;

...

[GPPDeepLink setDelegate:self];

[GPPDeepLink readDeepLinkAfterInstall];

}


ViewController.h


#import <GooglePlus/GooglePlus.h>


- (IBAction)OnTouchUpGooglePlusLogin:(id)sender;



ViewController.m


#import <GoogleOpenSource/GoogleOpenSource.h>

#import <GooglePlus/GooglePlus.h>


/* For GooglePlusLogin

 by YG.Seo 2014.1.16 */

- (IBAction)OnTouchUpGooglePlusLogin:(id)sender

{

    GPPSignIn *signIn = [GPPSignIn sharedInstance];

    signIn.shouldFetchGooglePlusUser = YES;

    signIn.shouldFetchGoogleUserEmail = YES;

    signIn.delegate = self;

    

    if([signIn authentication] == nil)

    {

        [signIn authenticate];

    }

    else

    {

        [signIn disconnect];

    }

}


- (void)finishedWithAuth:(GTMOAuth2Authentication *)auth error:(NSError *)error {

    if (error) {

        NSLog(@"Received error %@ and auth object %@",error, auth);

        return;

    }

    m_strGooglePlusAccount = [GPPSignIn sharedInstance].userEmail;

    NSLog(@"GooglePlusUser : %@", m_strGooglePlusAccount);


}

- (void)didDisconnectWithError:(NSError *)error {

    if (error) {

        NSLog(@"Status:Failed to disconnect: %@", error);

    } else {

        NSLog(@"Status: Disconnected");

    }

}

Posted by 은돌군
2014. 1. 20. 19:03

Android의 broadcast와 비슷한 유형의 개념으로 어플끼리의 통신을 사용하는 듯 하다.

이 부분을 ios 에서는 InterOP라 하며,

delegate 의 함수들 중.. 아래 함수의 개념에 대해 알아보려 하다가 나왔다.

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation

{

 return URL;

}


개념은 찾아보니 잘 나와있더라~,

나는.. url을 동시에 여러개를 써야하는데.. 형태가 return 형이네;;; OTL 

아무튼 개념은 아래와 같고!!!

여러개 쓰는건 내일 해보고!!!!

오늘은 퇴근하자!!!


출처 : http://iceemperor.springnote.com/pages/6512823

iOS 어플리케이션간 통신방법

 

 iOS 는 어플리케이션간 통신을 위하여 URL 을 사용하는 방법을 쓴다. URL 의 프로토콜 부분에 해당하는 부분, 예를 들면 http:// 의 http 와 같은 부분을 특정 어플리케이션이 연결하는 것으로 해당 어플리케이션에 메시지를 전달할 수 있다.

 즉 TestApplication1 이라는 어플리케이션이 다른 어플리케이션으로부터 어떤 메시지를 받고 싶다면 testapp1 이라는 이름으로 등록해 두면, 다른 어플리케이션이 testapp1:// 과 같은 URL 형태로 요청을 할 경우 iOS 가 TestApplication 을 찾아 실행하는 것이다.

개요

 간단한 흐름을 정리하면 다음과 같다.

1. 메시지를 받을 어플리케이션의 info.plist 에, 특정 URL 프로토콜과 바인딩하도록 등록한다.
2. 어플리케이션이 설치되면 iOS 는 프로토콜 목록에 위의 어플리케이션과 프로토콜 이름을 연결해 둔다.
3. 특정 어플리케이션이 UIApplication 의 openURL 을 사용할 경우, iOS 는 URL 내에 존재하는 프로토콜을 보고, 이와 바인딩 된 어플리케이션이 있다면 그 어플리케이션을 실행한다. 이미 실행되어 있다면 이미 실행중인 인스턴스를 활성화시킨다.
4. 실행한 어플리케이션의 UIApplicationDelegate 단에 handleOpenURL 이 정의되어 있으면 이것을 호출하고, 이 함수의 인자로, 어플리케이션 실행을 요청한 URL 데이터를 보내준다.

 따라서 URL 형식에서 프로토콜 부분을 통해 실행할 어플리케이션을 결정하고, 나머지 형식에 데이터를 실어보내는 방식으로 통신을 수행할 수 있다.

 다만 이 방식은 해당 어플리케이션에 메시지를 전달하기만 하고 거기서 아무것도 하지 않으므로, 반환값을 받는다거나 하는 등의 피드백을 받기 위해서는 역시 호출하는 쪽에서도 똑같이 위의 방법을 구현해 주어야만 한다. 즉 두 어플리케이션이 요청-응답 방식으로 통신하려면 둘 다 위의 방식으로 등록작업을 수행해야 한다.


 URL 방식으로 상호 데이터를 전달하지만, http 가 프로토콜 구조상의 한계로 4096 바이트밖에 전달받지 못하는 것과는 달리, 이것은 어플리케이션간 데이터를 전달받는 구조이기 때문에 딱히 길이 제한이 존재하지 않는다. 다만 문자열로 선처리하는 구조상 (즉 받은 데이터를 모조리 메모리상에 적재할 수 밖에 없는 구조) 과도하게 큰 데이터는 어플리케이션 실행 자체에 문제를 일으킬 수 있다.


구체적 방법
  1. 어플리케이션에서 먼저 리스닝을 할 수 있도록 설정을 수행한다.

    1. 어플리케이션-info.plist 를 연다.
    2. URL types 항목을 추가한다.
    3. 추가된 URL types 항목을 열고 Item 0 를 다시 열어 URL identifier 와 URL Schemes 를 추가한다.
    4. URL identifier 의 값에 현재 어플리케이션의 번들 도메인을 그대로 넣어두면 된다. (보통은)
    5. URL Schemes 를 다시 열고, Item 0 항목의 값에, URL 로 호출 시 반응하게 될 프로토콜 이름을 적는다. 예를 들어 bindingaddr 이렇게 이름을 적었다면, URL 호출 시 bindingaddr:// 을 앞에 붙여서 호출하였을 때 이 어플리케이션이 실행될 것이다.

      1. 여기서 생각할 수 있는 것이, 이 어플리케이션 하나가 여러 개의 URL 프로토콜에 반응하도록 만들 수 있을 것이라는 점이다. 즉 URL Schemes 에 기본으로 제공되는 Item 0 외에 다른 아이템을 더 추가하면 여러 개의 프로토콜에도 반응하게 할 수 있다.
    6. 다음 메소드를 추가한다.

      -(BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url

  2. 다른 어플리케이션으로부터, 등록한 어플리케이션을 호출한다.

    1. URL 로 사용할 적절한 문자열을 생성한다.

      1. 호출할 어플리케이션의 URL Schemes 에 등록된 값 중 하나를 프로토콜로 설정한다.
        예) bindingapps2://
      2. 어플리케이션에 전달할 메시지를 문자열로 적절히 기술한다. URL 구조를 따르는 형식으로 메시지를 만든다면 쉽게 메시지를 파싱할 수 있을 것이다.
    2. NSURL 을 이용하여 URL 개체로 만든다.

      1. [NSURL URLWithString:문자열] 을 사용하면 반환값으로 돌려준다.
    3. 어플리케이션에서 지원하는 openURL 을 사용하여 OS 에게 URL 호출을 부탁한다.

      1. [[UIApplication sharedApplication] openURL:생성한주소]


Posted by 은돌군
2014. 1. 17. 16:50

우선 Facebook SDK 다운!


다운받은 SDK 압축 파일 안의

Facebook Frameworks 와 FBUserSettingsViewResources.bundle 을 xcode의 Frameworks 에 추가한다.

Xcode에서 제공하는 (4 버젼 이후만 가능하다고 함)

Social.framework 와 Adsupport.framework 추가한다.


Facebook에 개발자로 로그인하여 Facebook App Id 를 받아 

내가만든 App 에 입력한다.


AppDelegate.h 에 추가한 코드


#import <FacebookSDK/FacebookSDK.h>


extern NSString *const FBSessionStateChangedNotification;


- (BOOL) openSessionWithAllowLoginUI:(BOOL)allowLoginUI;

- (void) sessionStateChanged:(FBSession *)session state:(FBSessionState)state error:(NSError *)error;



AppDelegate.m 에 추가한 코드


#import <FacebookSDK/FacebookSDK.h>


NSString *const FBSessionStateChangedNotification = @"본인의 App Bundle Identifier:FBSessionStateChangedNotification";


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

{

[FBSettings setDefaultAppID:@"202225256635972"];//이거때문에 엄청난 삽질을 함.

}


/* For FaceBookLogin

 by YG.Seo 2014.1.16 */

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation

{

    return [FBSession.activeSession handleOpenURL:url];

}


/* For FaceBookLogin

 by YG.Seo 2014.1.16 */

- (BOOL) openSessionWithAllowLoginUI:(BOOL)allowLoginUI {


    return [FBSession openActiveSessionWithReadPermissions:nil allowLoginUI:allowLoginUI completionHandler:^(FBSession *session,FBSessionState state, NSError *error) {

        [self sessionStateChanged:session state:state error:error];

    }];

}


- (void)sessionStateChanged:(FBSession *)session state:(FBSessionState)state error:(NSError *)error

{

    switch (state) {

        case FBSessionStateOpen:

            if(!error) {

                NSLog(@"Facebook User session found");

            }

            break;

        case FBSessionStateClosed:

            NSLog(@"Facebook SessionStateClosed");

            break;

        case FBSessionStateClosedLoginFailed:

            NSLog(@"SessionStateColsedLoginFailed");

            [FBSession.activeSession closeAndClearTokenInformation];

            break;

        default:

            break;

    }

    

    [[NSNotificationCenter defaultCenter] postNotificationName:FBSessionStateChangedNotification object:session];

    

    if(error) {

        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error" message:error.localizedDescription delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];

        [alertView show];

    }

}


ViewController.h 추가한 코드


#import <FacebookSDK/FacebookSDK.h>


@interface ...

{

NSString *m_strFacebookAccount;

...

}


@property (nonatomic, retain)NSString *m_strFacebookAccount;


/* For FacebookLogin

 by YG.Seo 2014.1.16 */

- (IBAction)OnTouchUpFacebookLogin:(id)sender;

- (void)setFacebookID;


ViewController.m 추가한 코드


#import <FacebookSDK/FacebookSDK.h>


@synthesize m_strFacebookAccount;


- (void)viewDidLoad

{

    [super viewDidLoad];

    /* For FacebookLogin

     by YG.Seo 2014.1.16 */

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

    [appDelegate openSessionWithAllowLoginUI:NO];

    

    [self setFacebookID];

}


/*Facebook 버튼 클릭

 by YG.Seo 2014.1.16 */

- (IBAction) OnTouchUpFacebookLogin:(id)sender

{

    if (FBSession.activeSession.state == FBSessionStateOpen || FBSession.activeSession.state == FBSessionStateOpenTokenExtended) {

        [FBSession.activeSession closeAndClearTokenInformation];

    } else {

        [FBSession openActiveSessionWithReadPermissions:@[@"basic_info"] allowLoginUI:YES completionHandler:^(FBSession *session, FBSessionState state, NSError *error) {

             AppDelegate* appDelegate = [UIApplication sharedApplication].delegate;

             [appDelegate sessionStateChanged:session state:state error:error];

         }];

    }

    [self setFacebookID];

}


- (void)setFacebookID

{

    [FBRequestConnection startForMeWithCompletionHandler:^(FBRequestConnection *connection, id<FBGraphUser> result, NSError *error) {

        if (!error) {

            m_strFacebookAccount = result.username;

            NSLog(@"user info: %@", result.username);

        } else {

            NSLog(@"Facebook connection Error!!");

        }

    }];

}


역시... 하고나면 별거없다.

우선 ios 쪽 object C 언어가 생소해서 시간도 꽤 걸렸으나,

별거 없네. 안드로이드 GCM 하는 느낌???

암튼 그냥 뒤적이며 하면 됩니다.

자료는 인터넷에 많~아요

Posted by 은돌군