如何在没有 OneSignal Dashboard 的情况下发送推送通知?

Posted

技术标签:

【中文标题】如何在没有 OneSignal Dashboard 的情况下发送推送通知?【英文标题】:How to send push notifications without OneSignal Dashboard? 【发布时间】:2019-07-29 07:15:26 【问题描述】:

我想向安装了我的 apk 的所有设备发送推送通知,我按照本教程进行操作:

https://rasupe.com/cara-membuat-push-notifications-di-android-dengan-onesignal-mudah/

并且成功了。

但我想在不通过 OneSignal 仪表板网站的情况下发送推送通知。 我不知道如何在代码中实现它。

你能帮帮我吗..

【问题讨论】:

查看 onesignal API 文档。 已经检查过了,但我真的很难过,先生。我不明白*哭泣TnT 【参考方案1】:

使用 URL https://onesignal.com/api/v1/notifications 发出 https POST 请求

添加标题"Content-Type":"application/json""Authorization":"Enter your REST API Key here"

在正文中添加


    "app_id": "Enter your app id here",
    "headings": 
        "en": "Title Here"
    ,
    "contents": 
        "en": "Description Here"
    ,
    "included_segments":["Active Users"]

您可以将通知发送到特定细分市场并为用户创建过滤器等等,请参阅此文档了解更多信息 https://documentation.onesignal.com/reference

【讨论】:

如何向onesignal.com/api/v1/notifications发出POST请求?? 您没有在您的应用程序中发出任何网络请求吗?如果没有,那么您可以探索如何使用流行的库(如 LoopjRetrofitvolley)发出网络请求。 我使用改造库。我也跟着这个教程.. 那怎么办? 无法理解您所面临的问题,能否具体一点。 我通过邮递员先生的解决方案成功发送通知,谢谢..但是如何将它实施到android..有条件(如果有“输入数据”到数据库,那么每个人都会得到推送通知)。我遵循这个教程:codepolitan.com/… 用于输入数据、更新数据、删除数据、查看 mysql 数据库中的数据。【参考方案2】:

要在不使用 OneSignal 仪表板的情况下发送通知,您可以将标签附加到用户并通过使用 URL https://onesignal.com/api/v1/notifications 进行 POST 向他们发送通知

只能使用 OneSignal 仪表板创建分段,但可以使用 SDK/API 创建标签。

添加标题"Content-Type":"application/json""Authorization":"Basic <REST API Key>"

在正文中添加

        
   "app_id":"<App Id>",
   "headings":
      "en":"Title Here"
   ,
   "contents":
      "en":"Description Here"
   ,
   "filters":[
      
         "field":"tag",
         "key":"level",
         "relation":"=",
         "value":"10"
      ,
      
         "operator":"OR"
      ,
      
         "field":"amount_spent",
         "relation":">",
         "value":"0"
      
   ]

然后发出 JSON 对象请求以完成该过程。

您可以参考以下代码来了解如何将标头附加到 JSON 对象请求以及如何将标签附加到您的用户。 (此请求是使用 android volley 发出的)

  String url = "https://onesignal.com/api/v1/notifications";

                JSONObject jsonBody;
                try 
                    jsonBody = new JSONObject(
                            "'app_id':'app-id'," +
                            "'headings': 'en': 'title', " +
                            "'contents': 'en': 'message'," +
                                    "'filters':['field':'tag','key':'"+id+"','relation':'=','value':'true']"
                    );

                //request a json object response
                JsonObjectRequest jsonRequest = new JsonObjectRequest(Request.Method.POST, url, jsonBody, new Response.Listener<JSONObject>() 
                    @Override
                    public void onResponse(JSONObject response) 
                        //now handle the response
                        Toast.makeText(Activity.this,  "Notification successfully sent", Toast.LENGTH_SHORT).show();
                    
                , new Response.ErrorListener() 
                    @Override
                    public void onErrorResponse(VolleyError error) 
                        //handle the error
                        Toast.makeText(Activity.this, "An error occurred", Toast.LENGTH_SHORT).show();
                        error.printStackTrace();
                    
                )
                    //adding header to the request
                    @Override
                    public Map<String, String> getHeaders() 
                        Map<String, String> params = new HashMap<String, String>();
                        params.put("Authorization", "Basic <REST API KEY>");
                        params.put("Content-type", "application/json");
                        return params;
                    
                ;
                // Add the request to the queue
                Volley.newRequestQueue(Activity.this).add(jsonRequest);
                 catch (JSONException e) 
                    e.printStackTrace();
                

为用户添加标签

 JSONObject tags = new JSONObject();
            try 
                tags.put("key","value");
                //for the above JSON request I have used the following key value pair
                // tags.put(id,true);  
                // where id is a string containing the userId
                //true is a boolean value
             catch (JSONException e) 
                e.printStackTrace();
            
            OneSignal.sendTags(tags);

这应该会成功完成您的查询。

【讨论】:

以上是关于如何在没有 OneSignal Dashboard 的情况下发送推送通知?的主要内容,如果未能解决你的问题,请参考以下文章

OneSignal Web 提示自定义

OneSignal在Web通知上发送js变量

OneSignal 在 Web 通知上发送 js 变量

如何在 android studio 中以编程方式取消订阅 OneSignal

ionic2 - 用户订阅 OneSignal 后如何获取玩家 ID

从 Onesignal (Phonegap) 获取附加数据