iphone推送通知urbanairship

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

在c#中有什么例子怎么做?

谢谢

基本上…

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 = ""; string password = ""; 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 (); } } } 

有关https的更多信息 ,请参阅api docs , msdn和此处

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

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

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

我写了一个ac#library来简化UrbanAirship API的使用

https://github.com/JeffGos/urbanairsharp

希望能帮助到你!