Ich benutze Push Sharp Version PushSharp 4.0.4.Wie Batch-Warteschlange Datensätze und führen Sie sie in einem anderen Thread und warten bis es; s vorbei?
Ich benutze es in einer Windows-Anwendung.
Ich habe drei Hauptmethoden
1- BroadCastToAll
2- BrodcatsToIOS
3- BrodcatsToAndriod
Ich habe eine Schaltfläche calld Senden. Auf das Klickereignis der Schaltfläche. Ich rufe die
BroadCastToAll Funktion an.
private void btnSend_Click(object sender, EventArgs e)
{
var url = "www.mohammad-jouhari.com"
var promotion = new Promotion();
BroadCastToAll(promotion, url);
}
ist die BrodcastToAll Funktion
public void BroadCastToAll(Promotion promotion, string url)
{
var deviceCatalogs = GetDeviceCatalog();
BroadCastToIOS(promotion, url, deviceCatalogs.Where(d => d.OS == "IOS").ToList());
BroadCastToAndriod(promotion, url, deviceCatalogs.Where(d => d.OS == "Android").ToList());
}
Hier ist die BrodcastToIOS Funktion
public void BroadCastToIOS(Promotion promotion, string url, List<DeviceCatalog> deviceCatalogs)
{
if (deviceCatalogs.Count == 0)
return;
lock (_lock)// Added this lock because there is a potential chance that PushSharp callback execute during registering devices
{
QueueAllAppleDevicesForNotification(promotion, url, deviceCatalogs, logsMessage);
}
}
public void BroadCastToAndriod(Promotion promotion, string url, List<DeviceCatalog> deviceCatalogs)
{
if (deviceCatalogs.Count == 0)
return;
lock (_lock)// Added this lock because there is a potential chance that PushSharp callback execute during registering devices
{
QueueAllGcmDevicesForNotification(promotion, url, deviceCatalogs, logsMessage);
}
}
Hier ist die BrodcastToAndriod Funktion Hier ist die QueueAllAppleDevic esForNotification Funktion
private void QueueAllAppleDevicesForNotification(Promotion promotion, string url, List<DeviceCatalog> deviceCatalogs)
{
var apnsServerEnviroment = UseProductionCertificate ? ApnsConfiguration.ApnsServerEnvironment.Production : ApnsConfiguration.ApnsServerEnvironment.Sandbox;
var fileService = new FileService();
var filePath = Application.StartupPath+ "/Certifcates/" + (UseProductionCertificate ? "prod.p12" : "dev.p12");
var buffer = fileService.GetFileBytes(filePath);
var config = new ApnsConfiguration(apnsServerEnviroment, buffer, APPLE_CERTIFICATE_PWD);
apnsServiceBroker = new ApnsServiceBroker(config);
apnsServiceBroker.OnNotificationFailed += (notification, aggregateEx) => {
aggregateEx.Handle (ex => {
// Log the Resposne
});
};
apnsServiceBroker.OnNotificationSucceeded += (notification) => {
// Log The Response
};
apnsServiceBroker.Start();
foreach (var deviceToken in deviceCatalogs) {
var title = GetTitle(promotion, deviceToken);
//title += DateTime.UtcNow.TimeOfDay.ToString();
var NotificationPayLoadObject = new NotificationPayLoadObjectApple();
NotificationPayLoadObject.aps.alert = title;
NotificationPayLoadObject.aps.badge = 0;
NotificationPayLoadObject.aps.sound = "default";
NotificationPayLoadObject.url = url;
var payLoad = JObject.Parse(JsonConvert.SerializeObject(NotificationPayLoadObject));
apnsServiceBroker.QueueNotification(new ApnsNotification
{
Tag = this,
DeviceToken = deviceToken.UniqueID,
Payload = payLoad
});
}
var fbs = new FeedbackService(config);
fbs.FeedbackReceived += (string deviceToken, DateTime timestamp) =>
{
// This Token is no longer avaialble in APNS
new DeviceCatalogService().DeleteExpiredIosDevice(deviceToken);
};
fbs.Check();
apnsServiceBroker.Stop();
}
Und hier ist der QueueAllGcmDevicesForNotification
private void QueueAllGcmDevicesForNotification(Promotion promotion, string url, List<DeviceCatalog> deviceCatalogs,)
{
var config = new GcmConfiguration(ANDROID_SENDER_ID, ANDROID_SENDER_AUTH_TOKEN, ANDROID_APPLICATION_ID_PACKAGE_NAME);
gcmServiceBroker = new GcmServiceBroker(config);
gcmServiceBroker.OnNotificationFailed += (notification, aggregateEx) => {
aggregateEx.Handle (ex => {
// Log Response
return true;
});
};
gcmServiceBroker.OnNotificationSucceeded += (notification) => {
// Log Response
};
var title = GetTitle(shopexPromotion);
gcmServiceBroker.Start();
foreach (var regId in deviceCatalogs) {
var NotificationPayLoadObject = new NotificationPayLoadObjectAndriod(url, title, "7", promotion.ImageUrl);
var payLoad = JObject.Parse(JsonConvert.SerializeObject(NotificationPayLoadObject));
gcmServiceBroker.QueueNotification(new GcmNotification
{
RegistrationIds = new List<string> {
regId.UniqueID
},
Data = payLoad
});
}
gcmServiceBroker.Stop();
}
Wenn ich jetzt auf die Schaltfläche Senden klicken. Das Ereignis wird ausgeführt.
Die BrodcastToAll-Funktion wird aufgerufen. Ich rufe zunächst BrodcastToIOS-Geräte und dann BrodcatsToAndriod an.
Gibt es eine Möglichkeit, BrodcastToIOS aufzurufen und zu warten, bis alle Geräte in die Warteschlange eingereiht wurden und die Benachrichtigung von der Bibliothek gepusht wurde und die Rückrufereignisse vollständig ausgelöst wurden, dann die BrodcastToAndriod-Funktion ausführen?
Welche Codezeilen muss ich hinzufügen?
Gibt es auch eine Möglichkeit, die Anzahl der einzureihenden Geräte im Stapel zu verarbeiten?
Zum Beispiel.
Lassen Sie uns sagen, ich habe 1000 Geräte
500 IOS
500 Andriod
Kann ich 100, 100100100100 für IOS Warteschlange und wenn es
ich für Andriod Warteschlange 100.100.100.100.100 getan hat.
Jede Hilfe wird geschätzt.
Danke.
ich es verwenden und es blockiert nicht – user123456
https://github.com/Redth/PushSharp/blob/master/PushSharp.Core/ServiceBroker.cs#L70-L95 Es blockiert ... – Redth
ok er verwendet Task.WaitAll (alle); Muss ich es in meinem Code verwenden? – user123456