您可以开始使用新的 PushSharp 3.0.1 稳定版,它真的很简单,很棒。
首先你应该去移除所有pushsharp 2相关的dll:
- PushSharp.Core
- PushSharp.Apple
- PushSharp.Android
等也确保删除:
- Newtonsoft.Json.dll(会产生冲突,我会解释)
然后转到您的项目并打开 nuget 管理器,然后搜索 PushSharp 3 的最新稳定版本并下载它。
现在您应该使用新的 Pushsharp 3 API,它有点不同但更简单:
首先创建一个包含你想要的所有代理的类:
public class AppPushBrokers
{
public ApnsServiceBroker Apns { get; set; }
public GcmServiceBroker Gcm { get; set; }
public WnsServiceBroker wsb { get; set; }
}
然后在您的业务逻辑/控制器/视图模型等上,您将需要编写您的 PushNotification 业务:
public class NewPushHandler
{
#region Constants
public const string ANDROID_SENDER_AUTH_TOKEN = "xxxx";
public const string WINDOWS_PACKAGE_NAME = "yyyy";
public const string WINDOWS_PACKAGE_SECURITY_IDENTIFIER = "zzzz";
public const string WINDOWS_CLIENT_SECRET = "hhhh";
public const string APPLE_APP_NAME = "yourappname";
public const string APPLE_PUSH_CERT_PASS = "applecertpass";
#endregion
#region Private members
bool useProductionCertificate;
string appleCertificateType;
String appleCertName;
String appleCertPath;
byte[] appCertData;
// logger
ILogger logger;
// Config (1- Define Config for each platform)
ApnsConfiguration apnsConfig;
GcmConfiguration gcmConfig;
WnsConfiguration wnsConfig;
#endregion
#region Constructor
public NewPushHandler()
{
// Initialize
useProductionCertificate = true; // you can set it dynamically from config
appleCertificateType = useProductionCertificate == true ? "production.p12" : "development.p12";
appleCertName = APPLE_APP_NAME + "-" + appleCertificateType;
appleCertPath = Path.Combine(Application.StartupPath, "Crt", appleCertName); // for web you should use HttpContext.Current.Server.MapPath(
appCertData = File.ReadAllBytes(appleCertPath);
var appleServerEnv = ApnsConfiguration.ApnsServerEnvironment.Production;
logger = LoggerHandler.CreateInstance();
// 2- Initialize Config
apnsConfig = new ApnsConfiguration(appleServerEnv, appCertData, APPLE_PUSH_CERT_PASS);
gcmConfig = new GcmConfiguration(ANDROID_SENDER_AUTH_TOKEN);
wnsConfig = new WnsConfiguration(WINDOWS_PACKAGE_NAME, WINDOWS_PACKAGE_SECURITY_IDENTIFIER, WINDOWS_CLIENT_SECRET);
}
#endregion
#region Private Methods
#endregion
#region Public Methods
public void SendNotificationToAll(string msg)
{
// 3- Create a broker dictionary
var apps = new Dictionary<string, AppPushBrokers> { {"com.app.yourapp",
new AppPushBrokers {
Apns = new ApnsServiceBroker (apnsConfig),
Gcm = new GcmServiceBroker (gcmConfig),
wsb = new WnsServiceBroker(wnsConfig)
}}};
#region Wire Up Events
// 4- events to fires onNotification sent or failure for each platform
#region Android
apps["com.app.yourapp"].Gcm.OnNotificationFailed += (notification, aggregateEx) =>
{
aggregateEx.Handle(ex =>
{
// See what kind of exception it was to further diagnose
if (ex is GcmConnectionException)
{
// Something failed while connecting (maybe bad cert?)
Console.WriteLine("Notification Failed (Bad APNS Connection)!");
}
else
{
Console.WriteLine("Notification Failed (Unknown Reason)!");
}
// Mark it as handled
return true;
});
};
apps["com.app.yourapp"].Gcm.OnNotificationSucceeded += (notification) =>
{
//log success here or do what ever you want
};
#endregion
#region Apple
apps["com.app.yourapp"].Apns.OnNotificationFailed += (notification, aggregateEx) =>
{
aggregateEx.Handle(ex =>
{
// See what kind of exception it was to further diagnose
if (ex is ApnsNotificationException)
{
var apnsEx = ex as ApnsNotificationException;
// Deal with the failed notification
var n = apnsEx.Notification;
logger.Error("Notification Failed: ID={n.Identifier}, Code={apnsEx.ErrorStatusCode}");
}
else if (ex is ApnsConnectionException)
{
// Something failed while connecting (maybe bad cert?)
logger.Error("Notification Failed (Bad APNS Connection)!");
}
else
{
logger.Error("Notification Failed (Unknown Reason)!");
}
// Mark it as handled
return true;
});
};
apps["com.app.yourapp"].Apns.OnNotificationSucceeded += (notification) =>
{
Console.WriteLine("Notification Sent!");
};
#endregion
#endregion
#region Prepare Notification
// 5- prepare the json msg for android and ios and any platform you want
string notificationMsg = msg;
string jsonMessage = @"{""message"":""" + notificationMsg +
@""",""msgcnt"":1,""sound"":""custom.mp3""}";
string appleJsonFormat = "{\"aps\": {\"alert\":" + '"' + notificationMsg + '"' + ",\"sound\": \"default\"}}";
#endregion
#region Start Send Notifications
// 6- start sending
apps["com.app.yourapp"].Apns.Start();
apps["com.app.yourapp"].Gcm.Start();
//apps["com.app.yourapp"].wsb.Start();
#endregion
#region Queue a notification to send
// 7- Queue messages
apps["com.app.yourapp"].Gcm.QueueNotification(new GcmNotification
{
// You can get this from database in real life scenarios
RegistrationIds = new List<string> {
"ppppp",
"nnnnn"
},
Data = JObject.Parse(jsonMessage),
Notification = JObject.Parse(jsonMessage)
});
apps["com.app.yourapp"].Apns.QueueNotification(new ApnsNotification
{
DeviceToken = "iiiiiii",
Payload = JObject.Parse(appleJsonFormat)
});
#endregion
#region Stop Sending Notifications
//8- Stop the broker, wait for it to finish
// This isn't done after every message, but after you're
// done with the broker
apps["com.app.yourapp"].Apns.Stop();
apps["com.app.yourapp"].Gcm.Stop();
//apps["com.app.yourapp"].wsb.Stop();
#endregion
}
#endregion
}
重要提示:
在您使用 IIS 时,您会发现一个与 IOS 证书相关的异常和最常见的异常:
“提供给包的凭据未被识别”
这是由于许多原因,例如您的应用程序池用户权限或安装在用户帐户而不是本地计算机上的证书,因此请尝试从 iis 禁用模拟身份验证,并检查它是否真的有用Apple PushNotification and IIS