私はAppleプッシュ通知サービスに完全に慣れていません。アプリケーションに実装しようとしています。グーグルとスタックオーバーフローでよく検索しましたが、満足していません。プロバイダーを実装しようとしています。 c#で。MoonAPNも試しました。
ここの誰かが私に非常に簡単なそれに関するステップバイステップのチュートリアルを提案できますか?私はすでにios開発者とapn証明書、およびp12キーを取得しています。それでは助けが必要です。前もって感謝します。
これが私が使用しているインフラストラクチャとプロセスです:
簡単な概要:APNSサーバーとの通信に PushSharp を使用します。送信されるすべてのサブスクリプションと通知を処理するSQLServerバックエンドDBセットアップがあります。また、すべてに.p12証明書がコピーされた仮想サーバー(実際にはいくつか)があります。これらのサーバーには、送信する必要のあるプッシュ通知がないかテーブルをチェックし、データセットをPushSharpプロセスに渡すプロセスがあります。
詳細な仕様:表1-APNS_Subscriptions
CREATE TABLE [dbo].[APNS_Subscriptions](
[id] [int] IDENTITY(1,1) NOT NULL,
[DeviceToken] [varchar](250) NULL,
[DeviceID] [varchar](250) NULL,
[NetworkID] [varchar](250) NULL,
[Application] [varchar](250) NULL,
[AddedOn] [datetime] NULL,
[Active] [bit] NULL,
[Dev] [bit] NULL,
[BadgeCount] [int] NOT NULL,
CONSTRAINT [PK_APNSSubscriptions] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
表2-APNS_PushNotifications
CREATE TABLE [dbo].[APNS_PushNotifications](
[id] [int] IDENTITY(1,1) NOT NULL,
[DeviceToken] [varchar](250) NULL,
[AlertMessage] [varchar](250) NULL,
[BadgeNumber] [int] NULL,
[SoundFile] [varchar](250) NULL,
[ApplicationName] [varchar](250) NULL,
[AddedOn] [datetime] NULL,
[AddedBy] [varchar](250) NULL,
[ProcessedOn] [datetime] NULL,
[ViewedOnDeviceDateTime] [datetime] NULL,
CONSTRAINT [PK_APNS_PushNotifications] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
これを介してサブスクリプションを追加しますSP(これは、APNSを実装する各iPhoneアプリを介してWebサービスを介して呼び出されます。
[ins_APNS_Sub]
@MyDeviceID VARCHAR(250) ,
@MyDeviceToken VARCHAR(250) ,
@MyApplicationName VARCHAR(250)
AS
DECLARE @Count AS INT
SET @Count = ( SELECT COUNT(id)
FROM dbo.APNS_Subscriptions
WHERE DeviceID = @MyDeviceID
AND DeviceToken = @MyDeviceToken
AND [Application] = @MyApplicationName
)
IF @Count = 0
BEGIN
DECLARE @NetworkID AS VARCHAR(250)
SET @NetworkID = ( SELECT TOP 1
networkid
FROM dbo.AuthenticatedDevices
WHERE deviceid = @MyDeviceID
AND COALESCE(banned, 0) = 0
ORDER BY lastupdatedon DESC
)
IF @NetworkID IS NOT NULL
BEGIN
INSERT INTO dbo.APNS_Subscriptions
( DeviceToken ,
DeviceID ,
NetworkID ,
[Application] ,
AddedOn ,
Active
)
VALUES ( @MyDeviceToken , -- DeviceToken - varchar(250)
@MyDeviceID , -- DeviceID - varchar(250)
@NetworkID , -- NetworkID - varchar(250)
@MyApplicationName , -- Application - varchar(250)
CURRENT_TIMESTAMP , -- AddedOn - datetime
1 -- Active - bit
)
END
END
プッシュ通知は、このSPを介して追加されます。
[ins_APNS_PushNote]
@MyNetworkID VARCHAR(250) , -- NetworkID of recipient or ALL to go to all recipients
@MyApplicationName VARCHAR(250) , -- Application Name for the iOS app
@APNSAlertMessage VARCHAR(225) , -- Alert Message (Required)
@APNSSoundFile VARCHAR(250) = NULL ,
@WhoRequested VARCHAR(250) -- Process Name that called this SP
AS
-- Get the current badge count, make a temp table and increment the appropriate rows in the Sub table
DECLARE @UpdateTable AS TABLE
(
DeviceToken VARCHAR(250) ,
NetworkID VARCHAR(250) ,
ApplicationName VARCHAR(250) ,
BadgeCount INT
)
IF @MyNetworkID = 'ALL'
BEGIN
INSERT INTO @UpdateTable
( DeviceToken ,
NetworkID ,
ApplicationName ,
BadgeCount
)
SELECT DeviceToken ,
NetworkID ,
[Application] ,
BadgeCount
FROM dbo.APNS_Subscriptions
WHERE [Application] = @MyApplicationName
AND COALESCE(Dev, 0) = 0
UPDATE @UpdateTable
SET BadgeCount = BadgeCount + 1
UPDATE sub
SET sub.BadgeCount = temp.BadgeCount
FROM dbo.APNS_Subscriptions sub
INNER JOIN @UpdateTable temp ON temp.DeviceToken = sub.DeviceToken
AND temp.NetworkID = sub.NetworkID
AND temp.ApplicationName = sub.[Application]
INSERT INTO dbo.APNS_PushNotifications
( DeviceToken ,
AlertMessage ,
BadgeNumber ,
SoundFile ,
ApplicationName ,
AddedOn ,
AddedBy
)
SELECT sub.DeviceToken ,
@APNSAlertMessage ,
temp.BadgeCount ,
@APNSSoundFile ,
@MyApplicationName ,
CURRENT_TIMESTAMP ,
@WhoRequested
FROM dbo.APNS_Subscriptions sub
INNER JOIN dbo.AuthenticatedDevices ad ON ad.deviceid = sub.DeviceID
INNER JOIN @UpdateTable temp ON temp.DeviceToken = sub.DeviceToken
AND temp.ApplicationName = sub.[Application]
WHERE COALESCE(ad.banned, 0) = 0
AND sub.[Application] = @MyApplicationName
-- AND ad.networkid = @MyNetworkID
AND COALESCE(sub.Dev, 0) = 0
END
ELSE
BEGIN
DECLARE @Count AS INT = ( SELECT COUNT(id)
FROM dbo.APNS_Subscriptions
WHERE NetworkID = @MyNetworkID
AND Active = 1
AND [Application] = @MyApplicationName
)
IF @Count = 0
BEGIN
RETURN
END
INSERT INTO @UpdateTable
( DeviceToken ,
NetworkID ,
ApplicationName ,
BadgeCount
)
SELECT DeviceToken ,
NetworkID ,
[Application] ,
BadgeCount
FROM dbo.APNS_Subscriptions
WHERE [Application] = @MyApplicationName
AND COALESCE(Dev, 0) = 0
AND NetworkID = @MyNetworkID
UPDATE @UpdateTable
SET BadgeCount = BadgeCount + 1
UPDATE sub
SET sub.BadgeCount = temp.BadgeCount
FROM dbo.APNS_Subscriptions sub
INNER JOIN @UpdateTable temp ON temp.DeviceToken = sub.DeviceToken
AND temp.NetworkID = sub.NetworkID
AND temp.ApplicationName = sub.[Application]
INSERT INTO dbo.APNS_PushNotifications
( DeviceToken ,
AlertMessage ,
BadgeNumber ,
SoundFile ,
ApplicationName ,
AddedOn ,
AddedBy
)
SELECT sub.DeviceToken ,
@APNSAlertMessage ,
temp.BadgeCount ,
@APNSSoundFile ,
@MyApplicationName ,
CURRENT_TIMESTAMP ,
@WhoRequested
FROM dbo.APNS_Subscriptions sub
INNER JOIN dbo.AuthenticatedDevices ad ON ad.deviceid = sub.DeviceID
INNER JOIN @UpdateTable temp ON temp.DeviceToken = sub.DeviceToken
AND temp.ApplicationName = sub.[Application]
WHERE COALESCE(ad.banned, 0) = 0
AND sub.[Application] = @MyApplicationName
AND sub.networkid = @MyNetworkID
AND COALESCE(sub.Dev, 0) = 0
AND COALESCE(sub.Active, 0) = 1
END
これは、次のように、いくつかの異なるDB内のいくつかの異なる場所から呼び出されます。EXECUTE[ins_APNS_PushNote] @ NetworkID、@ iOSApplicationName、@ AlertMessage、@ SoundFile、@ RequestedBy
仮想サーバー(PushSharp)に対するこれらのAPNS要求を取得するSP:
[get_APNSToSend]
AS
BEGIN
DECLARE @CurrentTimestamp AS DATETIME = CURRENT_TIMESTAMP
UPDATE dbo.APNS_PushNotifications
SET ProcessedOn = CURRENT_TIMESTAMP
WHERE ProcessedOn IS NULL
SELECT id ,
DeviceToken ,
AlertMessage ,
BadgeNumber ,
SoundFile ,
ai.APNSDistCertFile AS APNSCertFile
FROM dbo.APNS_PushNotifications apns
INNER JOIN dbo.ApplicationInfo ai ON ai.ApplicationName = apns.ApplicationName
WHERE ProcessedOn = @CurrentTimestamp
AND ai.APNSDistCertFile IS NOT NULL
END
次に、PushSharpアプリに加えた変更について説明します。実際には、2つのメソッドに要約されます。staticvoidMain(string [] args){checkForPushRequest(); }
static void checkForPushRequest()
{
string YourConnString = "YourConnectionStringToTheDBGoesHere";
Stored_Procedure SP = new Stored_Procedure {
Name = "get_APNSToSend",
Parameters = new List<SqlParameter>()
};
try {
System.Data.DataTable dt = DatabaseOperations.Execute_Database_Command(YourConnString, SP, true);
if ((dt != null) && !(dt.Rows.Count < 1)) {
foreach (System.Data.DataRow dRow in dt.Rows) {
string deviceToken = Convert.ToString(dRow[1]);
string alertMessage = Convert.ToString(dRow[2]);
int badgeNumber = Convert.ToInt16(dRow[3]);
string soundFile = Convert.ToString(dRow[4]);
string apnsCertFileToUse = Convert.ToString(dRow[5]);
sendPush(deviceToken, alertMessage, soundFile, badgeNumber, apnsCertFileToUse);
}
}
} catch (Exception ex) {
// Handle your exception
}
}
static void sendPush(string DeviceToken, string AlertMessage, string SoundFile, int BadgeNumber, string apnsCertFileToUse)
{
//Create our service
PushService Push = new PushService();
//Wire up the events
Push.Events.OnDeviceSubscriptionExpired += new PushSharp.Common.ChannelEvents.DeviceSubscriptionExpired(Events_OnDeviceSubscriptionExpired);
//Push.Events.OnDeviceSubscriptionIdChanged += new PushSharp.Common.ChannelEvents.DeviceSubscriptionIdChanged(Events_OnDeviceSubscriptionIdChanged);
Push.Events.OnChannelException += new PushSharp.Common.ChannelEvents.ChannelExceptionDelegate(Events_OnChannelException);
Push.Events.OnNotificationSendFailure += new PushSharp.Common.ChannelEvents.NotificationSendFailureDelegate(Events_OnNotificationSendFailure);
Push.Events.OnNotificationSent += new PushSharp.Common.ChannelEvents.NotificationSentDelegate(Events_OnNotificationSent);
//Configure and start Apple APNS
// IMPORTANT: Make sure you use the right Push certificate. Apple allows you to generate one for connecting to Sandbox,
// and one for connecting to Production. You must use the right one, to match the provisioning profile you build your
// app with!
// This comes from the ApplicationInfo table. Each app that supports APNS has it's own certfile name in the column
string certFileToUse = "C:\\APNS_Certs\\" + apnsCertFileToUse;
var appleCert = File.ReadAllBytes(certFileToUse);
//IMPORTANT: If you are using a Development provisioning Profile, you must use the Sandbox Push notification server
// (so you would leave the first arg in the ctor of ApplePushChannelSettings as 'false')
// If you are using an AdHoc or AppStore provisioning profile, you must use the Production Push notification server
// (so you would change the first arg in the ctor of ApplePushChannelSettings to 'true')
Push.StartApplePushService(new ApplePushChannelSettings(false, appleCert, "P12PasswordHere"));
//Fluent construction of an iOS notification
//IMPORTANT: For iOS you MUST MUST MUST use your own DeviceToken here that gets generated within your iOS app itself when the Application Delegate
// for registered for remote notifications is called, and the device token is passed back to you
Push.QueueNotification(NotificationFactory.Apple()
.ForDeviceToken(DeviceToken)
.WithAlert(AlertMessage)
.WithSound(SoundFile)
.WithBadge(BadgeNumber));
//Console.WriteLine("Waiting for Queue to Finish...");
//Stop and wait for the queues to drains
Push.StopAllServices(true);
// Console.WriteLine("Queue Finished, press return to exit...");
}
コンソールプロジェクトをPushSharpソリューションに追加し、コンソールをAPNSサーバーにデプロイしました。このコンソールアプリは、毎分実行されるスケジュールされたタスクに基づいて起動されます。
他にご不明な点がございましたら、お気軽にお問い合わせください。私は昨年、エンタープライズ環境でこのプロセスを使用してきましたが、問題はありませんでした。完璧に動作します。
MoonAPNSを使用している場合は、ライブラリの作成者による Sending Apple Push Notifications in ASP.NET and C# )の4部構成のガイドを読むことをお勧めします。
C#Webページを使用してAPNSプッシュ通知を作成します。最初にWebアプリケーションを作成し、Webフォームを開始します。
webフォームの設計段階
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="iosp12.aspx.cs" Inherits="p12ios.iosp12" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<table class="auto-style1">
<tr>
<td class="auto-style2">Device token</td>
<td>
<asp:TextBox ID="txtDeviceToken" runat="server"></asp:TextBox>
</td>
</tr>
<tr>
<td class="auto-style3">message</td>
<td class="auto-style4">
<asp:TextBox ID="txtMessage" runat="server" Height="44px"></asp:TextBox>
</td>
</tr>
<tr>
<td class="auto-style2"> </td>
<td>
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" Width="142px" />
</td>
</tr>
<tr>
<td class="auto-style2"> </td>
<td>
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
</td>
</tr>
<tr>
<td class="auto-style2"> </td>
<td> </td>
</tr>
</table>
</div>
</form>
</body>
</html>
コードフェーズ
using System;
using System.Web;
using Newtonsoft.Json.Linq;
using PushSharp.Apple;
using System.Collections.Generic;
namespace p12ios
{
public partial class iosp12 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
SendPushNotification(txtDeviceToken.Text, txtMessage.Text);
}
private void SendPushNotification(string deviceToken, string message)
{
try
{
//Get Certificate
var appleCert = System.IO.File.ReadAllBytes(Server.MapPath("~/IOS/"p12 certificate""));
// Configuration (NOTE: .pfx can also be used here)
var config = new ApnsConfiguration(ApnsConfiguration.ApnsServerEnvironment.Sandbox, appleCert, "p12 Password");
// Create a new broker
var apnsBroker = new ApnsServiceBroker(config);
// Wire up events
apnsBroker.OnNotificationFailed += (notification, aggregateEx) =>
{
aggregateEx.Handle(ex =>
{
// See what kind of exception it was to further diagnose
if (ex is ApnsNotificationException)
{
var notificationException = (ApnsNotificationException)ex;
// Deal with the failed notification
var apnsNotification = notificationException.Notification;
var statusCode = notificationException.ErrorStatusCode;
string desc = $"Apple Notification Failed: ID={apnsNotification.Identifier}, Code={statusCode}";
Console.WriteLine(desc);
Label1.Text = desc;
}
else
{
string desc = $"Apple Notification Failed for some unknown reason : {ex.InnerException}";
// Inner exception might hold more useful information like an ApnsConnectionException
Console.WriteLine(desc);
Label1.Text = desc;
}
// Mark it as handled
return true;
});
};
apnsBroker.OnNotificationSucceeded += (notification) =>
{
Label1.Text = "Apple Notification Sent successfully!";
};
var fbs = new FeedbackService(config);
fbs.FeedbackReceived += (string devicToken, DateTime timestamp) =>
{
// Remove the deviceToken from your database
// timestamp is the time the token was reported as expired
};
// Start Proccess
apnsBroker.Start();
var payload = new Dictionary<string, object>();
var aps = new Dictionary<string, object>();
aps.Add("alert", "This is a sample notification!");
aps.Add("badge", 1);
aps.Add("sound", "chime.aiff");
payload.Add("aps", aps);
payload.Add("confId", "20");
payload.Add("pageFormat", "Webs");
payload.Add("pageTitle", "Evalu");
payload.Add("webviewURL", "https:/UploadedImages/MobileApp/icons/Datalist-Defg");
payload.Add("notificationBlastID", "");
payload.Add("pushtype", "");
payload.Add("content-available", );
var jsonx = Newtonsoft.Json.JsonConvert.SerializeObject(payload);
if (deviceToken != "")
{
apnsBroker.QueueNotification(new ApnsNotification
{
DeviceToken = deviceToken,
Payload = JObject.Parse(Newtonsoft.Json.JsonConvert.SerializeObject(payload))
});
}
apnsBroker.Stop();
}
catch (Exception)
{
throw;
}
}
}
}
ペイロード私たちはあなたのJSONを書きます。プッシュシャープをインストールするには。 nugetパッケージを開き、パッケージマネージャーコンソールを開きます。コンソールに書き込むInstall-Package PushSharp -Version 4.0.10
。秘密鍵p12証明書とパスワードのみを使用します。