iphone推送通知urbanairship
Posted
技术标签:
【中文标题】iphone推送通知urbanairship【英文标题】:iphone push notification urbanairship 【发布时间】:2011-01-24 12:33:25 【问题描述】:我想通过 urbanairship api 从我的服务器端 (c#) 发送通知
c#中有没有例子怎么做?
谢谢
【问题讨论】:
【参考方案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 docs、msdn和here 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
希望对你有帮助!
【讨论】:
以上是关于iphone推送通知urbanairship的主要内容,如果未能解决你的问题,请参考以下文章
如何在 iPhone 中实现 Urban Airship 的推送通知?
使用 Urban AirShip 和 Rails 3 for iphone 推送通知