‹ Google Play Games Services Doc Home

Google Play Games Services 集成指南

For the C++ version of cocos2d-x v3.x - (all other versions)

安装

用如下命令来集成 SDKBOX IAP 插件,请确保您可以正常执行的 SDKBOX 安装器.

$ sdkbox import gpg

安装后

Android

修改 AndroidManifest.xml

在你的 AndroidManifest.xml 中添加如下 meta-data.

<meta-data android:name="com.google.android.gms.games.APP_ID"
    android:value="@string/google_app_id" />

修改 string.xml

添加如下文字到 proj.android/res/values/string.xml

<string name="google_app_id">777734739048</string>

请一定要把 google_app_id 对应的值修改为你自己的 App Id.

iOS

修改 proj.ios_mac/ios/AppController.mm

AppController.mm 中添加如下代码:

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary *)options {
    return [[GIDSignIn sharedInstance] handleURL:url
                               sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey]
                                      annotation:options[UIApplicationOpenURLOptionsAnnotationKey]];
}

设置自己的 Google Play Signin Listener (可选)

设置 GPG(Google Play Game Services) SignIn 的回调

这不是必选的,SDKBox GPG 已经在内部设置了对应的 Delegate, 当你在外面自己手动设置 GIDSignInUIDelegate 时,内部的就会被忽略

在外面自己手动设置 GIDSignInUIDelegate , 如下步骤:

修改 proj.ios_mac/ios/RootViewController.hRootviewController 实现 GIDSignInUIDelegate:

#import <GoogleSignIn/GoogleSignIn.h>

// 在 RootViewController 类的定义中加上:
@interface RootViewController : UIViewController<GIDSignInUIDelegate>

设置 Google SignIn Listener

修改 proj.ios_mac/ios/AppController.mm

添加如下代码:

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

在 return 前添加如下代码:

    // _viewController could also be named
    //  viewController, depending of the project type.
    [GIDSignIn sharedInstance].uiDelegate = _viewController;

添加 URL types

添加如下 URL types 到你的工程中, 路径为 your project > Info > URL Types

更多资料

官方文档中查看更多的相关信息

重点注意事项

如果您升级到了 Xcode7, 则需要以下额外步骤来确保插件工作正常:

禁用应用程序安全传输策略

添加以下项到 plist:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

添加后的文件内容看起来就像这样:

禁止 Bitcode 支持

您必须禁止 Bitcode 的支持,否则将会编译失败。

游戏全屏配置

如果您的游戏不同时支持横竖屏,则必须在 Xcode 中选中 Requires full screen,否则将不会通过 Apple 的审核。

canOpenURL 白名单

取决于您使用哪些插件。需要在 info.plistLSApplicationQueriesSchemes 下添加名单。

关于 Creator 工程

Creator 导出工程会修改工程的配置, 这可能会影响 SDKBox 对工程的配置修改. 所以可以有以下做法(任选其一):

  1. 保存导出工程中的修改, 对于 SDKBox 来说可能有这些文件(mk, gradle, gradle.properties, AppDelegate.cpp, ...), 导出后再恢复对应该文件
  2. 在每一次 Creator 导出工程后, 重新 import 插件.

推荐第一种, 但是第一种的麻烦点在于, 对于第一次(或很久没接触的人)可能会有露掉某个文件 第二种, 很方便, 它的麻烦点在于, 如果你对工程有自己的修改, SDKBox 的重新 import 不能帮你恢复.

用法

前期准备

你必须在Google Play Developer console 创建一个自己的 app , 同时请确保所有的服务都是 enable 状态, 对应的配置也是配置正确的.

提示: Google Play Game Services 默认使用 release keystore, 如果你想用 debug 模式来测试, 看下这个方法

初始化 Google Play Games

在你代码合适的位置初始化插件.我们建议在 AppDelegate::applicationDidFinishLaunching()AppController:didFinishLaunchingWithOptions() 中初始化. 请确保你添加了对应的头文件:

AppDelegate::applicationDidFinishLaunching()
{
     sdkbox::PluginGPG::init();
}

Authorization (认证)

所有的 Google Play Game 服务都要求用户登录, 在使用任何服务之前,都要保证用户已经登录成功了. 更多信息请见官方文档

Achevements (成就)

你需要联接游戏服务到你的游戏中,同时你的游戏要是 "已发布" 状态, 成就才有效. 更多信息请见官方文档

Leaderboards (排行榜)

你需要联接游戏服务到你的游戏中,同时你的游戏要是 "已发布" 状态, 排行榜才有效. 更多信息请见官方文档

Saved Games (存储游戏)

存储游戏功能需要在初始化阶段调用 EnableSnapshots() , 同时在 Google Play 开发者中心把它设置为启用状态. 更多信息请见官方文档

Realtime multiplayer (实时多人)

你需要联接游戏服务到你的游戏中,同时你的游戏要是 "已发布" 状态, Realtime multiplayer才有效. 更多信息请见官方文档

Turn-based multiplayer (回合多人)

你需要联接游戏服务到你的游戏中,同时你的游戏要是 "已发布" 状态, Turn-based multiplayer 才有效. 更多信息请见官方文档

Events and Quests (事件和任务)

你需要联接游戏服务到你的游戏中,同时你的游戏要是 "已发布" 状态, Events and Quests 才有效. 更多信息请见官方文档

Player Statistics (玩家状态信息)

Player Stats 添加了有用的数据分析到你的游戏中. 更多信息请见官方文档

Nearby Connections (附近联接)

Nearby Connections 让你的游戏支持本地多人,屏幕共享功能. 更多信息请见官方文档

API 文档

C++ 的 Google Play Game Services API 文档,请参见官方文件

手动集成

如果用 SDKBox Installer 安装失败了, 可以用手动的形式来集成. 如果用 SDKBox Installer 安装成功了,那么不用再手动来集成了.

这些步骤放在文档的最后,因为基本上你很少时候会有需要到他们. 当你要手动集成时,请在完成后,再看一个手动集成以上的这些步骤.

iOS手动集成步骤

GooglePlay 包中 plugins/ios 目录下的如下 frameworks 拖到你的 Xcode 工程中, 请确保 Copy items if needed 是选中状态:

sdkbox.framework

PluginGPG.framework

GoogleAppUtilities.framework

GoogleAuthUtilities.framework

GoogleNetworkingUtilities.framework

GoogleOpenSource.framework

GooglePlus.bundle

GooglePlus.framework

GoogleSignIn.bundle

GoogleSignIn.framework

GoogleSymbolUtilities.framework

GoogleUtilities.framework

gpg.bundle

gpg.framework

以上 framwork 是依赖于如下 framework 的,如果你的工程中还没有如下 framework , 添加上:

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

在工程中添加如下 linker flag ,工程路径为 Target -> Build Settings -> Linking -> Other Linker Flags:

-ObjC

代码修改

修改 proj.ios_mac/ios/AppController.mm

AppController.mm 中添加如下代码:

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary *)options {
    return [[GIDSignIn sharedInstance] handleURL:url
                               sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey]
                                      annotation:options[UIApplicationOpenURLOptionsAnnotationKey]];
}

设置自己的 Google Play Signin Listener (可选)

设置 GPG(Google Play Game Services) SignIn 的回调 这不是必选的,SDKBox GPG 已经在内部设置了对应的 Delegate, 当你在外面自己手动设置 GIDSignInUIDelegate 时,内部的就会被忽略

在外面自己手动设置 GIDSignInUIDelegate , 如下步骤:

修改 proj.ios_mac/ios/RootViewController.hRootviewController 实现 GIDSignInUIDelegate:

#import <GoogleSignIn/GoogleSignIn.h>

// 在 RootViewController 类的定义中加上:
@interface RootViewController : UIViewController<GIDSignInUIDelegate>

设置 Google SignIn Listener

修改 proj.ios_mac/ios/AppController.mm

添加如下代码:

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

在 return 前添加如下代码:

    // _viewController could also be named
    //  viewController, depending of the project type.
    [GIDSignIn sharedInstance].uiDelegate = _viewController;

添加 URL types

添加如下 URL types 到你的工程中, 路径位置 your project > Info > URL Types

更多信息

官方文档上有更多信息

Android 手动集成

SDKBox 支持三种 Android 工程, command-line, eclipseAndroid Studio.

拷贝文件

把安装包中的 plugin/android/libs 目录下的如下 jar 文件拷贝到你的工程中的 /libs 目录下.

拷贝 jni 库

plugin/android/jni/ 拷贝并覆盖 <your_project_root>/jni/ 目录.

修改 AndroidManifest.xml

添加如下 meta-data :

<meta-data android:name="com.google.android.gms.version"
    android:value="@integer/google_play_services_version" />
<meta-data android:name="com.google.android.gms.games.APP_ID"
    android:value="@string/google_app_id" />

请确保添加如下 <string name="google_app_id">777734739048</string>res/values/string.xml 中. 一定要用你自己的 google app id 来代替.

修改 Android.mk

gpg 拷贝到 proj.andrid/jni 目录下

添加如下内容到你的 android.mk 文件中

添加头文件目录

LOCAL_C_INCLUDES += ./gpg/include/

添加静态库

添加静态库到 LOCAL_WHOLE_STATIC_LIBRARIES:

LOCAL_WHOLE_STATIC_LIBRARIES += gpg-1
LOCAL_WHOLE_STATIC_LIBRARIES += PluginGPG
LOCAL_WHOLE_STATIC_LIBRARIES += sdkbox

import-module 语句之前添加如下调用:

$(call import-add-path,$(LOCAL_PATH))

import-module 语句之后添加如下语句:

$(call import-module, ./gpg)
$(call import-module, ./sdkbox)
$(call import-module, ./plugingpg)

注意: 如果你使用的是预编译版本, 请一定要确保以上语句是在 $(call import-module,./prebuilt-mk) 之前.

修改 Application.mk (只适用于 Cocos2d-x v3.0 to v3.2)

查看 <project_root>/jni/Application.mk 中的 APP_STL 是否定义正确. 如果 Application.mk 包含了 APP_STL := c++_static 语句, 那么请改为:

APP_STL := gnustl_static

修改 AppActivity.java

插件版本 >= 2.4.0.3

  1. 找到 AppActivity.java 文件
find . -name "AppActivity.java"
  1. extends Cocos2dxActivity 替换为 extends com.sdkbox.plugin.SDKBoxActivity

以下是 AppActivity.java 不同版本的引擎所在的目录:

cpp
  - proj.android/src/org/cocos2dx/cpp/AppActivity.java
  - proj.android-studio/app/src/org/cocos2dx/cpp/AppActivity.java
  - proj.android/app/src/org/cocos2dx/cpp/AppActivity.java ( from cocos2d-x 3.17)

lua
  - frameworks/runtime-src/proj.android/src/org/cocos2dx/lua/AppActivity.java
  - frameworks/runtime-src/proj.android-studio/app/src/org/cocos2dx/lua/AppActivity.java
  - frameworks/runtime-src/proj.android/app/src/org/cocos2dx/lua/AppActivity.java (from cocos2d-x 3.17)

js
  - frameworks/runtime-src/proj.android/src/org/cocos2dx/javascript/AppActivity.java
  - frameworks/runtime-src/proj.android/app/src/org/cocos2dx/javascript/AppActivity.java ( from cocos2d-x 3.17)

插件版本 < 2.4.0.3

Note: 当你使用 cocos2d-x 源代码时,不同的版本中 Cocos2dxActivity.java 文件的位置也不同。一个确定该文件位置的方法是查看 proj.android/project.properties 。比如:

android.library.reference.1=../../cocos2d-x/cocos/platform/android/java

在这个例子中, Cocos2dxActivity.java 文件应该在如下位置:

../../cocos2d-x/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxActivity.java
import android.content.Intent;
import com.sdkbox.plugin.SDKBox;
onLoadNativeLibraries();
SDKBox.init(this);
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
          if(!SDKBox.onActivityResult(requestCode, resultCode, data)) {
            super.onActivityResult(requestCode, resultCode, data);
          }
    }
    @Override
    protected void onStart() {
          super.onStart();
          SDKBox.onStart();
    }
    @Override
    protected void onStop() {
          super.onStop();
          SDKBox.onStop();
    }
    @Override
    protected void onResume() {
          super.onResume();
          SDKBox.onResume();
    }
    @Override
    protected void onPause() {
          super.onPause();
          SDKBox.onPause();
    }
    @Override
    public void onBackPressed() {
          if(!SDKBox.onBackPressed()) {
            super.onBackPressed();
          }
    }

修改 project.properties

添加 Google Play Services Android 库引用, 其路径因你的配置而有所不同. 并且 Google Play Services 不是默认下载的, 您需要打开 sdk installer , 选择 extras->google play services 下载并安装。例子:

android.library.reference.1=
../android/sdk.latest/extras/google/google_play_services/libproject/
google-play-services_lib

注意: 如果已经存在 android.library.reference.1, 您可以递增数字, 例如 android.library.reference.2, 等等.

Proguard (可选)

proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
# cocos2d-x
-keep public class org.cocos2dx.** { *; }
-dontwarn org.cocos2dx.**
-keep public class com.chukong.** { *; }
-dontwarn com.chukong.**

# google play service
-keep class com.google.android.gms.** { *; }
-dontwarn com.google.android.gms.**

-keep class * extends java.util.ListResourceBundle {
    protected Object[][] getContents();
}

-keep public class com.google.android.gms.common.internal.safeparcel.SafeParcelable {
    public static final *** NULL;
}

-keepnames @com.google.android.gms.common.annotation.KeepName class *
-keepclassmembernames class * {
    @com.google.android.gms.common.annotation.KeepName *;
}

-keepnames class * implements android.os.Parcelable {
    public static final ** CREATOR;
}

#sdkbox
-keep class com.sdkbox.** { *; }
-dontwarn com.sdkbox.**

注意: Proguard 只在 Release 编译时有效 (比如 cocos run -m release), debug 不会触发 Proguard.