【问题标题】:iphone push notification urbanairshipiphone推送通知urbanairship
【发布时间】:2011-01-24 12:33:25
【问题描述】:

我想通过 urbanairship api 从我的服务器端 (c#) 发送通知

c#中有没有例子怎么做?

谢谢

【问题讨论】:

    标签: c# iphone push-notification urbanairship.com


    【解决方案1】:

    基本上...

    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. 
    

    分成多行,以便您阅读

                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"
        }
    }";
    

    然后

                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 ();
            }
        }
    }
    

    api docsmsdnhere for more on https

    【讨论】:

      【解决方案2】:

      接受的答案不起作用,您需要更改以下行:

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

      request.ContentType = "application/json";
      

      完整的工作代码如下所示:

      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();
              }
          }
      }
      

      【讨论】:

      • 哇,答案很有效。看起来我是新手,想要同样的,想将数据发送到 iphone、android 和黑莓的应用程序。我是一名从事 sebservice 的网络开发人员,它将向客户端应用程序生成推送消息。
      • 从你的代码我刚刚更改了网络线路的用户名和密码。 {System.Net.WebException:远程服务器返回错误:(401)未经授权。在 System.Net.HttpWebRequest.GetResponse() 在 ConsoleApplication1.Program.Main(String[] args) 在 c:\Users\Window8\Downloads\urban-airship-windows-latest\urban-airship-windows-1_0_1_0\ConsoleApplication1\ Program.cs:第 38 行}
      【解决方案3】:
      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; }
      }
      

      【讨论】:

        【解决方案4】:

        这是使用 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"));
        

        【讨论】:

          【解决方案5】:

          我编写了一个 c# 库来简化 UrbanAirship API 的使用

          https://github.com/JeffGos/urbanairsharp

          希望对你有帮助!

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-09-18
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多