iOS용 Play 게임 서비스 시작하기

Google Play 게임 서비스를 활용하여 iOS 게임을 개발해 주셔서 감사합니다.

Play 게임 SDK는 업적, 리더보드, 멀티플레이어와 같은 인기 게임 기능을 태블릿 및 모바일 게임에 손쉽게 통합할 수 있도록 크로스 플랫폼 Google Play 게임 서비스를 제공합니다.

여기에서는 Play 게임 SDK를 사용하여 iOS 게임을 개발하는 기본적인 절차를 설명합니다. 이 지침은 iOS용 Google 로그인 문서를 대체합니다.

시작하기 전에

Google 게임 SDK를 사용하여 애플리케이션을 생성하려면 다음이 필요합니다.

  • Xcode 버전 6.0 이상
  • IOS 7.0 이상을 실행하는 휴대기기

1단계: 샘플 게임 살펴보기

아직 샘플 게임을 살펴보지 않았다면 샘플 게임을 다운로드하여 검토하는 방법이 유용할 수 있습니다. 샘플 게임은 iOS에서 지원되는 모든 Google Play 게임 서비스의 올바른 사용법을 보여 줍니다. 모든 iOS용 샘플 게임은 샘플 다운로드 페이지에서 찾을 수 있습니다. 각 샘플에서 README 파일에 있는 지침에 따라 샘플 게임을 초기화하고 실행하는 방법을 알아보세요.

2단계: Xcode 프로젝트 생성 또는 열기

Xcode에서 새 프로젝트를 생성하거나 기존 프로젝트를 엽니다. 다음 단계에서 번들 식별자가 필요하므로 메모해 둡니다. 식별자는 보통 com.*your_company*.*your_project* 형식입니다.

새 프로젝트를 생성하는 경우 단일 뷰 애플리케이션 옵션을 선택하는 것이 좋습니다. 여기에서는 게임의 뷰 컨트롤러 설정을 다룹니다.

3단계: Google Play Console에 게임 추가하기

Google Play Console에서 게임의 항목을 생성합니다. 그러면 애플리케이션에서 Google Play 게임 서비스가 활성화되고 OAuth 2.0 클라이언트 ID가 아직 없는 경우 새로 생성됩니다.

  1. Google Play 게임 서비스 설정하기에 설명된 단계에 따라 iOS 게임의 항목을 추가합니다.
  2. 나중에 필요하므로 게임의 OAuth 2.0 클라이언트 ID를 메모해 둡니다.
  3. (선택사항) 업적과 리더보드 설정하기에 설명된 단계에 따라 업적과 리더보드를 게임에 추가합니다.
  4. 게임 변경사항 게시하기에 설명된 단계에 따라 게임을 테스트할 다른 팀원의 계정을 추가합니다.

4단계: SDK 설치하기

Google Play 게임 서비스 API를 사용하기에 앞서 다음 방법 중 하나를 사용하여 필수 라이브러리를 설치해야 합니다.

옵션 1: CocoaPods 사용하기

CocoaPods는 Objective-C 라이브러리 설치에 필요한 종속 기능 관리자입니다. CocoaPods가 설치되어 있으면 이를 사용하여 다음 절차에 따라 iOS용 Play 게임 SDK를 설치할 수 있습니다.

  1. Podfile을 생성하고 ios 7.0 이상의 플랫폼을 지정했는지 확인합니다.
  2. Podfile에 GooglePlayGames pod를 추가합니다. 일반적인 Podfile은 다음과 같은 형식입니다.

    platform :ios, '7.0'
    pod 'GooglePlayGames'
    // Other pods might go here
    
  3. 명령줄에서 pod install을 실행합니다.

  4. 앱과 관련해 생성한 .xcworkspace 파일을 엽니다.

  5. XCode에서 프로젝트를 열고 아래의 로그인 및 로그아웃 버튼 추가하기 섹션으로 계속 진행합니다.

옵션 2: 수동 설치

CocoaPods를 사용하지 않고 수동으로 iOS용 Play 게임 SDK를 설치하려면 다음 단계를 따르세요.

  1. Google 로그인 다운로드 페이지에서 최신 Google 로그인 SDK를 다운로드하고 추출합니다.
  2. Google 로그인 SDK에서 다음 항목을 프로젝트에 복사합니다.
    • GoogleSignIn.bundle
    • GoogleSignIn.framework
  3. Google+ 다운로드 페이지에서 최신 Google+ iOS SDK를 다운로드하고 추출합니다.
  4. Google+ SDK에서 다음 항목을 프로젝트에 복사합니다.
    • GoogleOpenSource.framework
  5. iOS용 Play 게임 SDK를 다운로드하고 추출합니다. 최신 버전은 SDK 다운로드 페이지에 있습니다.
  6. 다음 항목을 Xcode 프로젝트에 추가합니다.
    • gpg.bundle
    • gpg.framework
  7. 프로젝트 설정을 연 다음 Build Phases 탭의 Link Binary With Libraries 섹션에서 + 기호를 클릭하고 다음 프레임워크를 추가합니다.
    • AddressBook.framework
    • AssetsLibrary.framework
    • CoreData.framework
    • CoreLocation.framework
    • CoreMotion.framework
    • CoreTelephony.framework
    • CoreText.framework
    • Foundation.framework
    • MediaPlayer.framework
    • QuartzCore.framework
    • SafariServices
    • Security.framework
    • StoreKit
    • Security.framework
    • SystemConfiguration.framework
    • libc++.dylib
    • libz.dylib
  8. ObjC 링커 플래그를 앱의 대상 빌드 설정에 추가합니다. 대상 설정에서 Build Settings > Linking > Other Linker Flags를 선택한 다음 -ObjC를 플래그로 추가합니다.

    Other Linker Flags: -ObjC
    

5단계: 로그인 및 로그아웃 버튼 추가하기

뷰 컨트롤러에서 로그인 버튼과 로그아웃 버튼을 추가합니다. 로그인 버튼이 Google 로그인 브랜드 가이드라인을 준수하는지 확인합니다. 개발에 드는 노력을 줄이려면 Google Play 게임 서비스에서 제공되는 여러 기본 제공 사용자 인터페이스에 포함된 로그아웃 옵션을 사용합니다. 그러면 로그아웃 버튼을 직접 추가할 필요가 없습니다.

로그인 및 로그아웃 버튼을 추가하려면 다음 단계를 따르세요.

  1. Ctrl 키를 누른 상태에서 두 버튼을 @interface에 포함된 섹션인 뷰 컨트롤러 .m 파일의 비공개 카테고리로 드래그합니다. 그러면 버튼에 관한 IBOutlet 객체가 생성됩니다.

    @interface ViewController ()
    @property (weak, nonatomic) IBOutlet UIButton *signInButton;
    @property (weak, nonatomic) IBOutlet UIButton *signOutButton;
    @end
    
  2. 이어서 Ctrl 키를 누른 상태에서 두 버튼을 뷰 컨트롤러 .m 파일의 @implementation 섹션으로 드래그합니다. 그러면 플레이어의 버튼 누르기 동작을 처리하는 다음 메서드가 생성됩니다.

    - (IBAction)signInButtonWasPressed:(id)sender {
      // handle the sign-in button press
    }
    
    - (IBAction)signOutButtonWasPressed:(id)sender {
      // handle the sign-out button press
    }
    

6단계: Play 게임 SDK 가져오기 및 로그인 활성화하기

  1. GooglePlayGames 헤더 파일을 가져옵니다. 도움말: 가장 쉬운 방법은 애플리케이션의 .pch 파일을 열고 다음 행을 추가하는 것입니다.

    #import <gpg/GooglePlayGames.h>
    

    이 import 문을 애플리케이션의 사전 컴파일된 헤더 파일에 입력하면 다른 모든 파일에서 이 헤더를 가져올 필요가 없습니다.

  2. 뷰 컨트롤러의 .m 파일이나 별도의 상수 파일에 클라이언트 ID를 설정합니다. 이는 앞서 'Google Play Console에 게임 추가하기' 섹션에서 기록해 둔 문자열입니다.

    static NSString * const kClientID = @"123456789012.apps.googleusercontent.com";
    
  3. 이전에 '로그인 및 로그아웃 버튼 추가하기' 섹션에서 생성한 두 개의 buttonWasPressed 메서드에 다음 코드를 추가합니다.

    - (IBAction)signInButtonWasPressed:(id)sender {
      [[GPGManager sharedInstance] signInWithClientID:kClientID silently:NO];
    }
    
    - (IBAction)signOutButtonWasPressed:(id)sender {
      [[GPGManager sharedInstance] signOut];
    }
    
  4. 플레이어가 Google에 로그인하면 게임 내 웹 뷰에서 로그인 프로세스가 실행됩니다.

    1. 대상 설정 Info 탭에서 아래의 URL Types 섹션까지 아래쪽으로 스크롤하고 + 아이콘을 클릭하여 새 URL 유형을 추가합니다. Identifier 입력란에 두 개의 고유한 문자열을 지정합니다. 첫 번째 URL 유형으로는 URL Schemas 입력란에 클라이언트 ID를 역순으로 지정합니다. 두 번째 URL 유형으로는 URL Schemas 입력란에 앱의 번들 식별자를 지정합니다. 이 정보의 입력과 관련된 추가 세부정보는 Google 로그인 빠른 마이그레이션 가이드를 참조하세요.

      identifier와 URL Schemes 입력란을 보여 주는 그래픽입니다.

    2. 앱 대리자 .m 파일에서 Google 로그인 프레임워크를 가져옵니다.

      #import <GoogleSignIn/GoogleSignIn.h>
      
    3. 앱 대리자의 URL 핸들러에서 GIDSignIn URL 핸들러를 호출합니다. 이 메서드는 인증 프로세스가 끝날 때 애플리케이션이 수신하는 URL을 처리합니다.

        [super application:application
            openURL:url
            sourceApplication:sourceApplication
            annotation:annotation];
      - (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
            sourceApplication:(NSString *)sourceApplication
            annotation:(id)annotation {
        return [[GIDSignIn sharedInstance] handleURL:url sourceApplication:sourceApplication annotation:annotation];
      }
      

이제 애플리케이션을 테스트하고 로그인 및 로그아웃할 수 있습니다. 테스터가 로그인하면 애플리케이션 내의 웹 뷰를 사용해 로그인 프로세스를 완료합니다.

[GIDSignIn sharedInstance].uiDelegate = self;

7단계: GPGStatusDelegate 추가하기

이어서 로그인 프로세스가 완료되면 앱이 이를 알 수 있도록 코드를 추가합니다.

  1. viewDidLoad 비공개 카테고리에서 뷰 컨트롤러가 GPGStatusDelegate임을 선언합니다.

    @interface ViewController () <GPGStatusDelegate>
    
  2. 이어서 GPGManager에게 이 클래스가 상태 대리자가 될 것임을 알립니다. 이 작업은 AppDelegate 같은 애플리케이션의 여러 위치에서 실행할 수 있습니다. 다음 스니펫은 초기 뷰 컨트롤러의 viewDidLoad 메서드에서 이 작업을 실행하는 방법을 보여 줍니다.

    - (void)viewDidLoad {
      [super viewDidLoad];
      [GPGManager sharedInstance].statusDelegate = self;
    }
    
  3. 플레이어의 로그인 완료를 처리하는 didFinishGamesSignInWithError와 플레이어의 로그아웃 완료를 처리하는 didFinishGamesSignOutWithErrorGPGStatusDelegate 메서드를 구현합니다.

    - (void)didFinishGamesSignInWithError:(NSError *)error {
      if (error) {
          NSLog(@"Received an error while signing in %@", [error localizedDescription]);
      } else {
          NSLog(@"Signed in!");
      }
      [self refreshInterfaceBasedOnSignIn];
    }
    
    - (void)didFinishGamesSignOutWithError:(NSError *)error {
      if (error) {
          NSLog(@"Received an error while signing out %@", [error localizedDescription]);
      } else {
          NSLog(@"Signed out!");
      }
      [self refreshInterfaceBasedOnSignIn];
    }
    
  4. refreshInterfaceBasedOnSignIn 호출을 위한 빈 메서드를 생성합니다.

    - (void)refreshInterfaceBasedOnSignIn {
      // We'll be filling this out shortly.
    }
    

    이제 테스터가 로그인하거나 로그아웃할 때 콘솔 로그에 보고된 해당 메시지가 표시됩니다.

  5. refreshInterfaceBasedOnSignIn 메서드의 구현 내용을 입력합니다. GPGManager의 isSignedIn 속성을 사용하여 표시할 버튼을 결정합니다.

    - (void)refreshInterfaceBasedOnSignIn {
      BOOL signedInToGameServices = [GPGManager sharedInstance].isSignedIn;
      self.signInButton.hidden = signedInToGameServices;
      self.signOutButton.hidden = !signedInToGameServices;
    }
    

이제 테스터가 로그인을 마치면 로그인 버튼이 숨겨집니다. 테스터가 로그아웃하면 로그아웃 버튼이 숨겨지고 로그인 버튼이 다시 나타납니다.

8단계: 다시 돌아온 플레이어 자동으로 로그인하기

또한 플레이어가 게임을 시작할 때마다 로그인하지 않아도 되도록 플레이어를 자동으로 로그인할 수도 있습니다. signInWithClientID 메서드에서 silently:YES를 지정하면 GPGManager가 플레이어를 자동으로 로그인합니다. 이 호출은 다음 조건을 모두 충족할 경우 이루어집니다.

  • 플레이어가 이전에 애플리케이션을 승인한 경우
  • 플레이어가 애플리케이션 액세스를 취소하지 않은 경우
  • 플레이어가 마지막으로 로그인한 이후 앱에서 새로운 범위를 요청하지 않는 경우

이 동작으로 silentlyYES로 설정하여 signInWithClientID:silently: 호출을 viewDidLoad 메서드 끝에 추가하면 플레이어가 게임에 자동으로 로그인할 수 있습니다.

[[GPGManager sharedInstance] signInWithClientID:kClientID silently:YES];

애플리케이션을 실행하고 애플리케이션을 마지막으로 사용했을 때 로그아웃하지 않으면 자동으로 로그인되는지 확인하세요.

9단계: 인터페이스 개선사항 추가하기

애플리케이션이 자동으로 플레이어 로그인을 시작하면 로그인 시작과 완료 시점 사이에 약간의 지연이 발생합니다. 이 시간 동안 게임에서 UI를 비활성화해야 합니다. 이렇게 하려면 플레이어가 자동으로 로그인하려는 경우 signInWithClientID:silently 메서드가 YES를 반환한다는 점을 활용합니다.

  1. 먼저 뷰 컨트롤러 클래스에 인스턴스 변수를 추가하여 플레이어가 자동으로 로그인되는지 계속 추적합니다.

    @implementation ViewController {
        BOOL _silentlySigningIn;
    }
    
  2. 이어서 변수를 사용하여 signInWithClientID:silently: 메서드에서 반환된 내용을 기록하고 즉시 refreshInterfaceBasedOnSignIn을 호출합니다.

    - (void)viewDidLoad {
      [super viewDidLoad];
      [GPGManager sharedInstance].statusDelegate = self;
      _silentlySigningIn = [[GPGManager sharedInstance]
              signInWithClientID:kClientID silently:YES];
      [self refreshInterfaceBasedOnSignIn];
    }
    
  3. 플레이어가 자동으로 로그인할 경우 다음 행을 refreshInterfaceBasedOnSignIn 메서드에 추가하여 로그인 및 로그아웃 버튼을 비활성화합니다.

    self.signInButton.enabled = !_silentlySigningIn;
    self.signOutButton.enabled = !_silentlySigningIn;
    
  4. 마지막으로 두 GPGEventDelegate 메서드에서 refreshInterfaceBasedOnSignIn을 호출하기 직전에 _silentlySigningInNO로 설정합니다.

    - (void)didFinishGamesSignInWithError:(NSError *)error {
      // Other code goes here...
      _silentlySigningIn = NO;
      [self refreshInterfaceBasedOnSignIn];
    
    }
    
    - (void)didFinishGamesSignOutWithError:(NSError *)error {
      // Other code goes here...
      _silentlySigningIn = NO;
      [self refreshInterfaceBasedOnSignIn];
    }
    

이제 테스터가 애플리케이션을 시작하면 로그인 버튼이 표시되지만 자동 로그인 시에는 표시되지 않습니다. 플레이어의 첫 로그인이 완료되면 로그인 버튼이 숨겨지고 로그아웃 버튼이 표시됩니다.

축하드립니다. 이제 업적, 리더보드, 퀘스트 및 기타 Google Play 게임 서비스 기능을 게임에 추가할 준비가 되었습니다.