Unity(Android)でGCMのPush通知を受信するプラグイン作った


GitHubで公開してます。

* [snaka/UnityGCMPlugin](https://github.com/snaka/UnityGCMPlugin/)


何か間違いとかあれば pull request ください。




# UnityGCMPlugin とは?

Unity Android アプリで GCM(Google Cloud Messaging) サービスを利用した PUSH通知 を受け取るためのプラグインです。

使用例としてデモアプリもGitHubに上げてます。

* [snaka/UnityGCMPluginDemo](https://github.com/snaka/UnityGCMPluginDemo)



# できること

* アプリが起動していない状態でもPUSH通知を受け取ることができる。
* 通知をタップするとアプリを起動することができる。



# インストール

## Step1. jar ファイルをダウンロード

* [unitygcmplugin.jar](https://github.com/snaka/UnityGCMPlugin/blob/master/unitygcmplugin/release/unitygcmplugin.jar)

## Step2. jar ファイルをプロジェクトにコピー

先ほどダウンロードした unitygcmplugin.jar を`{あなたのUnityプロジェクト}/Assets/Plugins/Android` 配下にコピーします。


## Step3. その他の依存する jar ファイルをプロジェクトにコピー

以下の jar ファイルを`{YourUnityProject}/Assets/Plugins/Android`フォルダ配下にコピーします。

* android-support-v4.jar (コピー元: {AndroidSDK}/sdk/extras/android/support/v7/appcompat/libs/android-support-v4.jar)
* google-play-services.jar (コピー元: {AndroidSDK}/sdk/extras/google/google_play_services/libproject/google-play-services_lib/libs/google-play-services.jar)

## Step4. AndroidManifest.xml の編集

AndroidManifest.xml ファイルを`{YourUnityProject}/Assets/Plugins/Android`に用意して以下のように内容を編集します。

```AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    package="info.snaka.unitygcmplugin.demo"
	android:installLocation="preferExternal"
	android:theme="@android:style/Theme.NoTitleBar"
    android:versionCode="1"
    android:versionName="1.0">
    <supports-screens
        android:smallScreens="true"
        android:normalScreens="true"
        android:largeScreens="true"
        android:xlargeScreens="true"
        android:anyDensity="true"/>
        
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    
    <permission android:name="info.snaka.unitygcmplugin.permission.C2D_MESSAGE" android:protectionLevel="signature" />
    <uses-permission android:name="info.snaka.unitygcmplugin.permission.C2D_MESSAGE" />
    
    <application
		android:icon="@drawable/app_icon"
        android:label="@string/app_name"
        android:debuggable="true">
        
        <activity android:name="info.snaka.unitygcmplugin.CustomUnityPlayerActivity"
            android:label="@string/app_name"
            android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
                <category android:name="android.intent.category.LEANBACK_LAUNCHER" />
            </intent-filter>
            <meta-data android:name="unityplayer.UnityActivity" android:value="true" />
            <meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="false" />
        </activity>
	    
        <receiver android:name="info.snaka.unitygcmplugin.GcmBroadcastReceiver" android:exported="true">
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                <category android:name="info.snaka.unitygcmplugin" />
            </intent-filter>
        </receiver>

        <service android:name="info.snaka.unitygcmplugin.GcmIntentService" />

        <meta-data android:name="apiProjectNumber" android:value="!{Your project number}" />
    </application>
</manifest>
```

注意: `{Your project number}` は Google Developer Console に表示されている「プロジェクト番号」に置き換えてください。 (その前の "!" は必要なので削除しないように!)

![ProjectNumber.png](https://qiita-image-store.s3.amazonaws.com/0/8219/aae776e7-4722-52e7-e2b6-cfa1aa4d46de.png "ProjectNumber.png")


以上でインストール完了


# 使い方


## "_GcmEvents"を作成

新規シーンを作成して 空のGameObjectを"_GcmEvents" という名前で作成します。

## "_GcmEvents"にスクリプトをアタッチする

"_GcmEvents" を作成したら、以下のようなスクリプトをアタッチします。

```GcmEvents.cs
using System.Collections;

public class GcmEvents : MonoBehaviour {
	string m_regid = "";

	/// <summary>
	/// Get registration ID from cache.
	/// </summary>
	void Start () {
		Debug.Log ("***** Start UnityGCMPluginSample");
		var unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
		var activity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
		var appContext = activity.Call<AndroidJavaObject>("getApplicationContext");
		
		Debug.Log ("***** get RegistrationId");
		var registrar = new AndroidJavaClass ("info.snaka.unitygcmpluginlib.GcmRegistrar");
		
		registrar.CallStatic ("clearCache", new object[] { appContext });
		
		string registrationId = registrar.CallStatic<string> ("getRegistrationId", new object[] { appContext });
		
		if (!string.IsNullOrEmpty (registrationId))
		{
			Debug.Log ("***** RegistrationId:[" + registrationId + "]");
		}
		else
		{
			// Invoke background thread to get registration ID
			Debug.Log ("***** id empty");
			registrar.CallStatic("registerInBackground", new object[]{ appContext });
		}
	}
	
	
	/// <summary>
	/// Callback from background thread if register completed.
	/// </summary>
	/// <param name="registerId">Registration ID</param>
	public void OnRegister(string registerId) {
		Debug.Log ("##### RegisterId: " + registerId);
		m_regid = registerId;
	}


	/// <summary>
	/// Display registration ID.
	/// </summary>
	void OnGUI() {
		GUILayout.TextArea(m_regid, GUILayout.ExpandWidth(true));
	}
}
```

# 通知用アイコンの用意

以下の場所に通知用のアイコンを配置します。

`Assets/Plugins/Android/res/drawable/notify.png`

アイコンのサイズとかは以下を参照

Androidのアイコンサイズ（2013.12更新）
http://greety.sakura.ne.jp/redo/2012/02/android201202.html


# PUSH 通知のテスト

ターミナルから`curl`を使って以下のようにPUSH通知のテスト配信が行えます。

```
$ curl --header "Authorization: key=(put your API key here)" \
--header Content-Type:"application/json" \
https://android.googleapis.com/gcm/send \
-d "{\"registration_ids\":[\"(put your Registration ID here)\"],\"data":{\"message\":\"Hello\"}}"
```

`(put your API key here)` は Google Developer Console の [APIと認証情報]-[認証情報]に表示されている「APIキー」に置き換えます。

![APIKey.png](https://qiita-image-store.s3.amazonaws.com/0/8219/686d6c23-e5c8-e66a-dd0d-7f832dae55ed.png "APIKey.png")


APIキーの取得方法については以下の公式ページなどを参考にしてください。

* [Getting Started | Android Developer](http://developer.android.com/google/gcm/gs.html)


`(put your Registration ID here)` はデバイスでアプリを起動したときに表示される Registration ID に置き換えてください。

![RegistrationID.png](https://qiita-image-store.s3.amazonaws.com/0/8219/b9e17bc7-7d14-8543-4247-3b9dc25458db.png "RegistrationID.png")


通知が成功するとデバイスのステータスバーに以下のように通知が表示されます。
通知をタップするとアプリが起動します。

![Ticker.png](https://qiita-image-store.s3.amazonaws.com/0/8219/6a0271a0-edef-f016-8be5-ac74e429d619.png "Ticker.png")

![Notification.png](https://qiita-image-store.s3.amazonaws.com/0/8219/976c11a8-5142-41e0-9901-7e8279c4c2b2.png "Notification.png")


# Todo

* アイコンは通知用に最適化してないので見た目が良くない
* デバイスで Google Play Services が有効になっているかどうかチェックしていない。 
* unitypackage 形式でパッケージ化してインストール手順を簡略化したい
* 通知のタイトルに表示する文字列をカスタマイズ可能に


# LICENSE

The MIT License (MIT)