【问题标题】:Parse Unity Push Sample not working解析 Unity 推送示例不起作用
【发布时间】:2015-05-30 17:04:57
【问题描述】:

我正在努力在我的 Unity android 应用程序上使用 Parse。已经工作了几天,但还没有成功。无论我多么努力,我都无法为 Android 注册我的设备令牌,这是向 Android 发送推送通知所需的。下面是我的示例代码和清单 sn-p..

  <uses-permission android:name="android.permission.INTERNET" />
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  <uses-permission android:name="android.permission.VIBRATE" />
  <uses-permission android:name="android.permission.WAKE_LOCK" />
  <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
  <permission android:protectionLevel="signature"      android:name="com.JoyDash.Movies.permission.C2D_MESSAGE" />
  <uses-permission android:name="com.JoyDash.Movies.permission.C2D_MESSAGE" />


 <!--Parse Push notification receiver-->
    <service android:name="com.parse.PushService" />
    <receiver android:name="com.parse.ParseBroadcastReceiver">
      <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
        <action android:name="android.intent.action.USER_PRESENT" />
      </intent-filter>
    </receiver>

    <receiver android:name="com.JoyDash.Movies.Receiver" android:exported="false">
      <intent-filter>
        <action android:name="com.parse.push.intent.RECEIVE" />
        <action android:name="com.parse.push.intent.DELETE" />
        <action android:name="com.parse.push.intent.OPEN" />
      </intent-filter>
    </receiver>

    <receiver android:name="com.parse.GcmBroadcastReceiver"
        android:permission="com.google.android.c2dm.permission.SEND">
      <intent-filter>
        <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
        <category android:name="com.JoyDash.Movies" />
      </intent-filter>
    </receiver>

    <!--<receiver android:name="com.parse.ParsePushBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND">
      <intent-filter>
        <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
        <category android:name="com.JoyDash.Movies" />
      </intent-filter>
    </receiver>

    <service android:name="com.parse.ParsePushService" />-->


#if UNITY_IOS
        NotificationServices.RegisterForRemoteNotificationTypes (RemoteNotificationType.Alert |
                                                                 RemoteNotificationType.Badge |
                                                                 RemoteNotificationType.Sound);
#endif

            //ParsePush.SubscribeAsync
            Debug.Log("Registration with Parse Push. : " + Application.platform);
            ParsePush.ParsePushNotificationReceived += (sender, args) =>
            {
                if (Application.platform == RuntimePlatform.Android)
                {
                    AndroidJavaClass parseUnityHelper = new AndroidJavaClass("com.parse.ParseUnityHelper");
                    AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
                    AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");

                    // Call default behavior.
                    Debug.Log("Calling Parse from Unity and Payload is : " + args.Payload);
                    parseUnityHelper.CallStatic("handleParsePushNotificationReceived", currentActivity, args.Payload.ToString());
                    //parseUnityHelper.CallStatic("handleParsePushNotificationReceived", currentActivity, args.Payload.StringPayload);
                }
                else if (Application.platform == RuntimePlatform.IPhonePlayer)
                {
                    //IDictionary<string, object> payload = args.Payload;

                    //foreach (string key in payload) 
                    //{
                    //    Debug.Log("Payload: " + key + ": " + payload[key].ToString());
                    //}
                }

            };

            //Parse Installation
            Debug.Log("Device Token : " + ParseInstallation.CurrentInstallation.DeviceToken);
            if (ParseInstallation.CurrentInstallation != null && !string.IsNullOrEmpty(ParseInstallation.CurrentInstallation.DeviceToken))
            {
                Debug.Log("Device Token : " + ParseInstallation.CurrentInstallation.DeviceToken);
            }
            else
            {
                //Create a new parse installation
                //ParseInstallation.CurrentInstallation.SaveAsync().ContinueWith(t =>
                //    {
                //        if (t.IsFaulted || t.IsCanceled)
                //        {
                //            Debug.Log("Parse installation failed to save.");
                //        }
                //        else
                //        {
                //            Debug.Log("Parse installation saved successfully.");
                //        }
                //    });

                //ParseInstallation.cre
                Debug.Log("There is no installation data received for this device.. Now subscribing to a channel");
                ParsePush.SubscribeAsync("Channel01").ContinueWith(t =>
                {
                    if (t.IsFaulted || t.IsCanceled)
                    {
                        Debug.Log("Subscription of push notification failed.");
                    }
                    else
                    {
                        Debug.Log("Push notification subscribed successfully.");
                    }
                });


                //installation.
            }

【问题讨论】:

  • 你让它工作了吗?
  • @thetnswe 你能解决这个问题吗?
  • 不..我还没解决..

标签: parse-platform


【解决方案1】:

“Parse Unity Push Sample 不工作”,同意!!男孩,在(Y)这样的痛苦

我已经与 Unity Parse Pushes 斗争了几天(一周?),我只是解决了它。我是如此,如此,幸福,我想分享我的幸福(我有生以来第一次在 StackOverflow 上写作,估计是时候了......)

不确定这是否会解决您的问题,但可以肯定您在这一行有问题:

 AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");

我们必须为您当前的活动更改 "currentActivity"。就我而言,我写了这个:

AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject> ("com.unity3d.player.UnityPlayerNativeActivity");

因为这是我在 AndroidManifest.xml 中的活动名称

  <activity android:name="com.unity3d.player.UnityPlayerNativeActivity" android:label="@string/app_name" android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen" android:launchMode="singleTask" android:screenOrientation="landscape">
      <meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="true" />
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>

不过,它可能无法解决您的问题。所以,以防万一,我复制粘贴我的代码!

AndroidManifest.xml:

<?xml version="1.0" encoding="UTF-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="preferExternal" package="com.XXXX.YYYY" android:versionName="1" android:versionCode="7">
  <supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:xlargeScreens="true" android:anyDensity="true" />
  <uses-feature android:glEsVersion="0x00020000" />
  <uses-sdk android:minSdkVersion="9" android:targetSdkVersion="18" />

    <uses-permission android:name="android.permission.INTERNET" />
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
  <uses-permission android:name="android.permission.VIBRATE" />
  <uses-permission android:name="android.permission.GET_ACCOUNTS" />
  <uses-permission android:name="android.permission.GET_TASKS" />  
  <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />  
  <permission android:protectionLevel="signature"  android:name="com.XXXX.YYYY.permission.C2D_MESSAGE" />
  <uses-permission android:name="com.XXXX.YYYY.permission.C2D_MESSAGE" />   
  <uses-permission android:name="com.android.vending.CHECK_LICENSE" /> 
  <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />



  <application android:icon="@drawable/app_icon" android:label="@string/app_name" android:debuggable="false">

    <service android:name="com.parse.ParsePushService" />


    <receiver android:name="com.parse.ParsePushBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND">
      <intent-filter>
        <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        <action android:name="com.google.android.c2dm.intent.REGISTRATION" />              
        <action android:name="com.parse.push.intent.DELETE" />
        <action android:name="com.parse.push.intent.OPEN" />
        <category android:name="com.XXXX.YYYY" />
      </intent-filter>
    </receiver>

    <activity android:name="com.unity3d.player.UnityPlayerNativeActivity" android:label="@string/app_name" android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen" android:launchMode="singleTask" android:screenOrientation="landscape">
      <meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="true" />
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>
    <activity android:name="com.unity3d.player.UnityPlayerActivity" android:label="@string/app_name" android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen" />

    <!-- replace @drawable/push_icon with your push icon identifier -->
    <meta-data android:name="com.parse.push.notification_icon" android:resource="@drawable/app_icon"/>  
  </application>
</manifest>

请将 com.XXXX.YYYY 替换为 -your- 包标识符,如果 thetnswe 将由 com.JoyDash.Movies >

(有趣的是:Parse Push 示例中没有 GCM BroadcastReceiver,它会吐出类似 error setting up push notification using parse.com and android studio 的错误)

然后我在我的一个 GameObjects 中有一个 C# Unity 脚本(实际上与我用来初始化 Parse 的那个相同):

using UnityEngine;
using System.Collections;
using Parse;


public class ParsePushRegistration : MonoBehaviour {
    // Use this for initialization
    void Start () {
        #if UNITY_ANDROID
        ParsePush.ParsePushNotificationReceived += (sender, args) => {                  
            AndroidJavaClass parseUnityHelper = new AndroidJavaClass ("com.parse.ParseUnityHelper");
            AndroidJavaClass unityPlayer = new AndroidJavaClass ("com.unity3d.player.UnityPlayer");
            AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject> ("com.unity3d.player.UnityPlayerNativeActivity");

            // Call default behavior.
            parseUnityHelper.CallStatic ("handleParsePushNotificationReceived", currentActivity, args.StringPayload);
        };              
        #endif
    }
}

希望对您有所帮助!如果没有,请告诉我......我们会看到:)

【讨论】:

  • 发布后,我又推送了一次,但没有成功!我简直不敢相信。我一直在等着看发生了什么来提供反馈。问题是它仅在 Unity 应用程序 not 在后台作为最近的应用程序时才有效。如果它在那里,或者在前台,通知将不会出现(实际上,最后一种情况是正常的)。仍在努力解决这个问题。
猜你喜欢
  • 1970-01-01
  • 2014-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多