【问题标题】:Android Parse Notification cannot receive notification if push form our server如果从我们的服务器推送,Android Parse Notification 无法收到通知
【发布时间】:2014-11-14 05:38:33
【问题描述】:

我在我的项目中使用解析通知。

如果从 Parse 控制台推送,我已成功收到通知。但是当它从我们的服务器推送时,我无法收到通知。顺便说一句,来自服务器的这段代码也提供给 iOS,iOS 设备收到了通知。

通知将从我们的服务器推送到 Parse,Parse 将发送到 Android 设备。 请提供建议并感谢您的任何帮助。

我的清单:

 <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.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
     <permission
            android:name="com.zukami.apps.dev.blynk.permission.C2D_MESSAGE"
            android:protectionLevel="signature" />

        <uses-permission android:name="com.zukami.apps.dev.blynk.permission.C2D_MESSAGE" />

  <!-- Push notification -->
        <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.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.zukami.apps.dev.blynk" />
            </intent-filter>
        </receiver>
        <receiver
            android:name="com.zukami.apps.dev.blynk.util.BlynkParseBroadcastReceiver"
            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>
        <!-- End of push notification -->

我的应用程序类:

 @Override
          public void onCreate() {
            super.onCreate();
            Parse.initialize(this, "YOUR_APP_ID", "YOUR_CLIENT_KEY"); 
            PushService.setDefaultPushCallback(this,PushActivity.class);        
        ParsePush.subscribeInBackground("testChannel", new SaveCallback() {
            @Override
            public void done(com.parse.ParseException e) {
                if (e == null) {
                    Log.e(TAG,
                            "successfully subscribed to the broadcast channel.");
                } else {
                    Log.e(TAG, "failed to subscribe for push", e);
                }
            }
        });
          }

我的活动课:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.display_promo_activity);

        spinner = (ProgressBar) findViewById(R.id.progressBar1);
        fragment = new Fragment();
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        transaction.replace(R.id.frame_container, fragment, PROMO_POPUP);
        transaction.commit();

        // Track app opens.
        ParseAnalytics.trackAppOpened(getIntent());
        Bundle extras = getIntent().getExtras();
        if (extras != null) {
            mData = extras.getString("com.parse.Data");
            Log.e(TAG, "DATA ORIGINAL = " + mData);

            if (mData != null) {
                mData = mData.replace("\\", "").trim();
                mData = mData.replace("\"{", "{").trim();
                mData = mData.replace("}\"", "}").trim();
                Log.e(TAG, "AFTER REPLACE = " + mData);
                try {
                    JSONObject jObject = new JSONObject(mData);
                    JSONObject alertObj = jObject.getJSONObject("alert");
                    JSONObject dataObj = alertObj.getJSONObject("Data");
                    action = dataObj.getString("Action");
                    JSONObject innerDataObj = dataObj.getJSONObject("Data");
                    id = innerDataObj.getString("id");
                } catch (JSONException e) {
                    Log.e(TAG, e.getMessage());
                }

            }
        }

    }

我的广播课:

 @Override
        public void onPushOpen(Context context, Intent intent) {
            Log.e("Push", "Clicked");
            Intent i = new Intent(context, PushActivity.class);
            i.putExtras(intent.getExtras());
            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(i);
        }

这是来自服务器的推送通知代码:

  var jss = new JavaScriptSerializer();
               string endPoint = "https://api.parse.com/1/push";
               string applicationID = "APP_ID";
               string restAPIKey = "REST_API_KEY";
               PushNotificationAction data = new PushNotificationAction();
               data.Action = "ViewAction";
               data.alert = "Alert action for android";
               data.Data = new PushNotificationActionData()
               {
                   id = ActionID
               };

               var client = new RestClient(endpoint: endPoint,
                               method: HttpVerb.POST);

               client.Headers = new List<string>();
               client.Headers.Add(string.Format("X-Parse-Application-Id: {0}", applicationID));
               client.Headers.Add(string.Format("X-Parse-REST-API-Key: {0}", restAPIKey));

               PushActionNotification push = new PushActionNotification();
               push.channels = new List<string>();
               push.channels.Add("");

               push.data = new PushNotificationActionItem()
               {
                   Data = jss.Serialize(data),
                   content_available = 1
               };
               string jsonData = jss.Serialize(push).Replace("content_available", "content-available");
               client.PostData = jsonData;
               client.ContentType = "application/json";
               var json = client.MakeRequest();

               response.Status = 1;
               return response;


public class PushNotificationAction
{
   public string Action { get; set; }
   public PushNotificationActionData Data { get; set; }
   public string alertMsg { get; set; }
   public string alert { get; set; }
}
public class PushNotificationActionData
{
   public string id { get; set; }
}

public class PushNotificationActionItem
{
   public string Data { get; set; }
   public int content_available { get; set; }
}
public class PushActionNotification
{
   public List<string> channels { get; set; }
   //public string type { get; set; }
   public PushNotificationActionItem data { get; set; }
}

【问题讨论】:

  • 正如你所说,当你从解析中推送时没有问题吗?然后问题可能出在从服务器推送通知以进行解析的代码中。发布该代码。
  • 嗨@John,感谢您的回复,请在上面找到我的编辑代码
  • 你在哪里添加要推送的数据例如:\n "alert": "Alert message."
  • 嗨@John,我发布了更多详细代码来推送通知。谢谢。

标签: android parse-platform


【解决方案1】:

我找到了解决办法!!

问题在于 JSON 数据。推送到 iOS 的相同 JSON 数据无法推送到 Android,因此我决定将推送通知分为 Android 和 iOS。对于 Android,模板 JSON 如下所示:

{
    "data": {
        "Action": "ViewAction",
        "Data": {
            "id": "1432f1ea-33c4-4528-a695-7412a7a7499a"
        },
        "alertMsg": null
    },
    "title": "Alert action for android",
    "alert": "Alert action for android",
    "push_hash": "d265b3500c1089dc0c7c9ace251cfebb"
}

这是简短的描述:

  1. data --> 将你的 JSON 负载作为这个 JSOn 键的值
  2. title --> 这个值将作为你的 android 通知描述
  3. alert --> 此值将作为您的 android 通知标题。

我发布这个答案也许对将来的某人有用, 干杯..

【讨论】:

    猜你喜欢
    • 2017-06-26
    • 1970-01-01
    • 1970-01-01
    • 2013-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    相关资源
    最近更新 更多