Pergunta

Eu quero enviar notificação do meu servidor (C#) via API UrbanAirship

Existe algum exemplo em C# Como fazer isso?

obrigado

Foi útil?

Solução

Basicamente...

using System;
using System.IO;
using System.Net;
using System.Text;

namespace Examples.System.Net
{
    public class WebRequestPostExample
    {
        public static void Main ()
        {
            // Create a request using a URL that can receive a post. 
            WebRequest request = WebRequest.Create ("https://go.urbanairship.com/api/push/");
            // Set the Method property of the request to POST.
            request.Method = "POST";

            // Create POST data and convert it to a byte array. 

quebrado em várias linhas para que você possa ler

            string postData = "{
    "device_tokens": [
        "some device token",
        "another device token"
    ],
    "aliases": [
        "user1",
        "user2"
    ],
    "tags": [
        "tag1",
        "tag2"
    ],
    "schedule_for": [
        "2010-07-27 22:48:00",
        "2010-07-28 22:48:00"
    ],
    "exclude_tokens": [
        "device token you want to skip",
        "another device token you want to skip"
    ],
    "aps": {
         "badge": 10,
         "alert": "Hello from Urban Airship!",
         "sound": "cat.caf"
    }
}";

e depois

            byte[] byteArray = Encoding.UTF8.GetBytes (postData);
            // Set the ContentType property of the WebRequest.
            request.ContentType = "application/json";
            // Set the ContentLength property of the WebRequest.
            request.ContentLength = byteArray.Length;

            //Do a http basic authentication somehow
            string username = "<application key from urban airship>";
            string password = "<master secret from urban airship>"; 
            string usernamePassword = username + ":" + password;
            CredentialCache mycache = new CredentialCache();
            mycache.Add( new Uri( "https://go.urbanairship.com/api/push/" ), "Basic", new NetworkCredential( username, password ) );
            request.Credentials = mycache;
            request.Headers.Add( "Authorization", "Basic " + Convert.ToBase64String( new ASCIIEncoding().GetBytes( usernamePassword ) ) );

            // Get the request stream.
            Stream dataStream = request.GetRequestStream ();
            // Write the data to the request stream.
            dataStream.Write (byteArray, 0, byteArray.Length);
            // Close the Stream object.
            dataStream.Close ();
            // Get the response.
            WebResponse response = request.GetResponse ();
            // Display the status.
            Console.WriteLine (((HttpWebResponse)response).StatusDescription);
            // Get the stream containing content returned by the server.
            dataStream = response.GetResponseStream ();
            // Open the stream using a StreamReader for easy access.
            StreamReader reader = new StreamReader (dataStream);
            // Read the content.
            string responseFromServer = reader.ReadToEnd ();
            // Display the content.
            Console.WriteLine (responseFromServer);
            // Clean up the streams.
            reader.Close ();
            dataStream.Close ();
            response.Close ();
        }
    }
}

Ver API Docs, msdn e Aqui para mais informações sobre https

Outras dicas

A resposta aceita não funciona, você precisa alterar a seguinte linha:

request.ContentType = "application/x-www-form-urlencoded";

para

request.ContentType = "application/json";

Código de trabalho completo mostrado abaixo:

using System;
using System.IO;
using System.Net;
using System.Text;

namespace UrbanAirship_Tes_1
{
    class Program
    {
        public static void Main()
        {

            // Create a request using a URL that can receive a post. 
            WebRequest request = WebRequest.Create("https://go.urbanairship.com/api/push/");
            request.Credentials = new NetworkCredential("pvYMExk3QIO7p2YUs6BBkg", "rO3DsucETRadbbfxHkd6qw");
            // Set the Method property of the request to POST.
            request.Method = "POST";
            // Create POST data and convert it to a byte array.
            //WRITE JSON DATA TO VARIABLE D
            string postData = "{\"aps\": {\"badge\": 1, \"alert\": \"Hello from Urban Airship!\"}, \"device_tokens\": [\"6334c016fc643baa340eca25bc661d15055a07b475e9a6108f3f644b15dd05ac\"]}";
            byte[] byteArray = Encoding.UTF8.GetBytes(postData);
            // Set the ContentType property of the WebRequest.
            request.ContentType = "application/json";
            // Set the ContentLength property of the WebRequest.
            request.ContentLength = byteArray.Length;
            // Get the request stream.
            Stream dataStream = request.GetRequestStream();
            // Write the data to the request stream.
            dataStream.Write(byteArray, 0, byteArray.Length);
            // Close the Stream object.
            dataStream.Close();
            // Get the response.
            WebResponse response = request.GetResponse();
            // Display the status.
            //            Console.WriteLine(((HttpWebResponse)response).StatusDescription);
            // Get the stream containing content returned by the server.
            dataStream = response.GetResponseStream();
            // Open the stream using a StreamReader for easy access.
            StreamReader reader = new StreamReader(dataStream);
            // Read the content.
            string responseFromServer = reader.ReadToEnd();
            // Display the content.
            Console.WriteLine(responseFromServer);
            // Clean up the streams.
            reader.Close();
            dataStream.Close();
            response.Close();
        }
    }
}
public class PushNotificationHelper
{
    private readonly ILog log4netEngine;

    private string UrbanAirshipApplicationKey { get; set; }
    private string UrbanAirshipApplicationSecret { get; set; }
    private string UrbanAirshipApplicationMasterSecret { get; set; }

    public PushNotificationHelper(string UrbanAirshipApplicationKey, string UrbanAirshipApplicationSecret, string UrbanAirshipApplicationMasterSecret)
    {
        log4netEngine = LogManager.GetLogger(typeof(PushNotificationHelper).Name);

        this.UrbanAirshipApplicationKey = UrbanAirshipApplicationKey;
        this.UrbanAirshipApplicationSecret = UrbanAirshipApplicationSecret;
        this.UrbanAirshipApplicationMasterSecret = UrbanAirshipApplicationMasterSecret;
    }


    public void PushNotification2iPhones(string alertText, string[] apids, string extra)
    {
        if (!string.IsNullOrEmpty(alertText) && apids.Length > 0)
        {
            iPhonePushNotification pushNotification = new iPhonePushNotification
            {
                MessageBody = new iPhonePushNotificationMessageBody
                {
                    Alert = alertText
                },
                Extra = extra,
                APIDs = apids
            };
            string jsonMessageRequest = pushNotification.ToJsonString();
            try
            {
                SendMessageToUrbanAirship(jsonMessageRequest);
                log4netEngine.InfoFormat("Push Notification Success , iPhoneDevice:{0}, message:{1},extra:{2}", string.Join(",", apids), alertText, extra);
            }
            catch (Exception ex)
            {
                log4netEngine.InfoFormat("Push Notification Error:{0}, iPhoneDevice:{1}, message:{2},extra:{3}", ex.Message, string.Join(",", apids), alertText, extra);
            }
        }
    }


    public void PushNotification2Androids(string alertText, string[] apids, string extra)
    {
        if (!string.IsNullOrEmpty(alertText) && apids.Length > 0)
        {
            AndroidPushNotification pushNotification = new AndroidPushNotification
            {
                MessageBody = new AndroidPushNotificationMessageBody
                {
                    Alert = alertText,
                    Extra = extra
                },
                APIDs = apids
            };
            string jsonMessageRequest = pushNotification.ToJsonString();

            try
            {
                SendMessageToUrbanAirship(jsonMessageRequest);
                log4netEngine.InfoFormat("Push Notification Success , androidDevice:{0}, message:{1},extra:{2}", string.Join(",", apids), alertText, extra);
            }
            catch (Exception ex)
            {
                log4netEngine.InfoFormat("Push Notification Error:{0}, androidDevice:{1}, message:{2},extra:{3}", ex.Message, string.Join(",", apids), alertText, extra);
            }
        }
    }

    private void SendMessageToUrbanAirship(string jsonMessageRequest)
    {
        var uri = new Uri("https://go.urbanairship.com/api/push/");
        var encoding = new UTF8Encoding();
        var request = WebRequest.Create(uri);
        request.Method = "POST";
        request.Credentials = new NetworkCredential(this.UrbanAirshipApplicationKey, this.UrbanAirshipApplicationMasterSecret);
        request.ContentType = "application/json";
        request.ContentLength = encoding.GetByteCount(jsonMessageRequest);
        using (var stream = request.GetRequestStream())
        {
            stream.Write(encoding.GetBytes(jsonMessageRequest), 0, encoding.GetByteCount(jsonMessageRequest));
            stream.Close();
            var response = request.GetResponse();
            response.Close();
        }
    }
}

public class NotificationToPush
{
    public int ReceiverUserID { get; set; }
    public string Message { get; set; }
    public Dictionary<string, string> Extra { get; set; }
}

[DataContract(Name = "PushNotificationBody")]
internal class PushNotification
{
    public string ToJsonString()
    {
        var result = JsonConvert.SerializeObject(this);
        return result;
    }
}

[DataContract(Name = "iPhonePushNotification")]
internal class iPhonePushNotification : PushNotification
{
    [DataMember(Name = "aps")]
    public iPhonePushNotificationMessageBody MessageBody { get; set; }

    [DataMember(Name = "extra")]
    public string Extra { get; set; }

    [DataMember(Name = "device_tokens")]
    public string[] APIDs { get; set; }
}

[DataContract(Name = "iPhonePushNotificationMessageBody")]
internal class iPhonePushNotificationMessageBody
{
    [DataMember(Name = "alert")]
    public string Alert { get; set; }
}

[DataContract(Name = "AndroidPushNotification")]
internal class AndroidPushNotification : PushNotification
{
    [DataMember(Name = "android")]
    public AndroidPushNotificationMessageBody MessageBody { get; set; }

    [DataMember(Name = "apids")]
    public string[] APIDs { get; set; }
}

[DataContract(Name = "AndroidPushNotificationMessageBody")]
internal class AndroidPushNotificationMessageBody
{
    [DataMember(Name = "alert")]
    public string Alert { get; set; }

    [DataMember(Name = "extra")]
    public string Extra { get; set; }
}

Aqui está como fazer isso usando os métodos assíncronos system.net.http.httpclient.

var handler = new HttpClientHandler { Credentials =  new NetworkCredential(urbanairshipapiKey, urbanairshipApiAppMasterSecret) };
var client = new HttpClient(handler);
var added = client.DefaultRequestHeaders.TryAddWithoutValidation("Accept", "application/vnd.urbanairship+json; version=3;");

var response = await client.PostAsync(apiUrl + "/push/", new StringContent(json, Encoding.UTF8, "application/json"));

Eu escrevi biblioteca AC# para simplificar o uso da API de urbana

https://github.com/jeffgos/urbanairsharp

Espero que ajude!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top