【问题标题】:Apple Push Notifications Using Moon-APNS or APNS-Sharp使用 Moon-APNS 或 APNS-Sharp 的 Apple 推送通知
【发布时间】:2011-10-26 09:32:29
【问题描述】:

我很难弄清楚如何将消息从我的服务器发送到 APNS。我使用过 Moon-APNS 和 APNS-Sharp,但我遇到了同样的错误,即“参数不正确”。我使用 KeyChain 生成了 p12 文件。我将文件拖到我的 Win 7 虚拟环境中,并将其放在 bin\debug 文件夹中。这是 Moon-APNS 的代码:

 static void Main(string[] args)
        {
            var deviceToken = "21212d6fefebde4d317cab41afff65631b5a4d47e5d85da305ec610b4013e616";

            var payload = new NotificationPayload(deviceToken, "hello world");
            var notificationList = new List<NotificationPayload>() { payload };

            var push = new PushNotification(true, "PushNotificationTest.p12", "pushchat");
            var result = push.SendToApple(notificationList);

            Console.WriteLine("Hello World");  
        }

有人有想法吗?

【问题讨论】:

    标签: ios apple-push-notifications apns-sharp


    【解决方案1】:

    我认为这会对你有所帮助:

    OSX 钥匙串

    在 iPhone Developer Program Portal 中创建适当的推送通知证书后,您应该已经下载了一个名为 apn_developer_identity.cer 的文件。如果你还没有这样做,你应该打开/导入这个文件到钥匙串,进入你的登录部分。

    最后,如果您过滤钥匙串以显示您的登录容器的证书,您应该会看到您的证书已列出。展开证书,下面/附加到它应该有一个密钥。

    右键单击或 Ctrl+单击相应的证书并选择导出。钥匙串会要求您选择要导出的密码。选择一个并记住它。您最终应该得到一个 .p12 文件。您将需要此文件和您选择的密码才能在此处使用通知和反馈库。 开放式SSL

    这里是如何使用 open ssl 创建一个 PKCS12 格式文件,你需要你的开发者私钥(可以从钥匙串中导出)和 CertificateSigningRequest??.certSigningRequest

    1. Convert apn_developer_identity.cer (der format) to pem:
    
    openssl x509 -in apn_developer_identity.cer -inform DER -out apn_developer_identity.pem -outform PEM}
    
    2. Next, Convert p12 private key to pem (requires the input of a minimum 4 char password):
    
    openssl pkcs12 -nocerts -out private_dev_key.pem -in private_dev_key.p12
    
    3. (Optional): If you want to remove password from the private key:
    
    openssl rsa -out private_key_noenc.pem -in private_key.pem
    
    4. Take the certificate and the key (with or without password) and create a PKCS#12 format file:
    
    openssl pkcs12 -export -in apn_developer_identity.pem -inkey private_key_noenc.pem -certfile CertificateSigningRequest??.certSigningRequest -name "apn_developer_identity" -out apn_developer_identity.p12
    

    我发现 Moon-APNS 更易于在我的应用中使用和配置。

    【讨论】:

    • 可能是你自己的?
    【解决方案2】:

    通过以下链接解决了问题:

    http://code.google.com/p/apns-sharp/wiki/HowToCreatePKCS12Certificate

    然后使用 openssl 方法生成 .p12 文件。

    【讨论】:

      【解决方案3】:

      您是否尝试过使用 APNS-Sharp 示例项目来发送通知?我正在使用类似的代码,它工作得很好......这就是我的一种方法的样子

       public void SendToSome(List<string> tokens)
          {
              //Variables you may need to edit:
              //---------------------------------
              bool sandbox = true;
              //Put your device token in here
      
      
              //Put your PKCS12 .p12 or .pfx filename here.
              // Assumes it is in the same directory as your app
              string p12File = "Certificates.p12";
      
              //This is the password that you protected your p12File 
              //  If you did not use a password, set it as null or an empty string
              string p12FilePassword = "";
      
      
      
              //Number of milliseconds to wait in between sending notifications in the loop
              // This is just to demonstrate that the APNS connection stays alive between messages
            //  int sleepBetweenNotifications = 15000;
      
      
              //Actual Code starts below:
              //--------------------------------
      
              string p12Filename = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, p12File);
      
              NotificationService service = new NotificationService(sandbox, p12Filename, p12FilePassword, 1);
      
              service.SendRetries = 5; //5 retries before generating notificationfailed event
              service.ReconnectDelay = 5000; //5 seconds
      
              service.Error += new NotificationService.OnError(service_Error);
              service.NotificationTooLong += new NotificationService.OnNotificationTooLong(service_NotificationTooLong);
      
              service.BadDeviceToken += new NotificationService.OnBadDeviceToken(service_BadDeviceToken);
              service.NotificationFailed += new NotificationService.OnNotificationFailed(service_NotificationFailed);
              service.NotificationSuccess += new NotificationService.OnNotificationSuccess(service_NotificationSuccess);
              service.Connecting += new NotificationService.OnConnecting(service_Connecting);
              service.Connected += new NotificationService.OnConnected(service_Connected);
              service.Disconnected += new NotificationService.OnDisconnected(service_Disconnected);
      
              //The notifications will be sent like this:
              //      Testing: 1...
              //      Testing: 2...
              //      Testing: 3...
              // etc...
              for (int i = 0; i < tokens.Count; i++)
              {
                  //Create a new notification to send
                  Notification alertNotification = new Notification();
      
                  alertNotification.DeviceToken = tokens[i];
                  alertNotification.Payload.Alert.Body = Text;
                  alertNotification.Payload.Sound = "default";
                  alertNotification.Payload.Badge = 1;
      
                  //Queue the notification to be sent
                  if (service.QueueNotification(alertNotification))
                      Console.WriteLine("Notification Queued!");
                  else
                      Console.WriteLine("Notification Failed to be Queued!");
      
                  //Sleep in between each message
                  if (i < tokens.Count)
                  {
                     // Console.WriteLine("Sleeping " + sleepBetweenNotifications + " milliseconds before next Notification...");
                     // System.Threading.Thread.Sleep(sleepBetweenNotifications);
                  }
              }
      
              Console.WriteLine("Cleaning Up...");
      
              //First, close the service.  
              //This ensures any queued notifications get sent befor the connections are closed
              service.Close();
      
              //Clean up
              service.Dispose();
      
      
          }
      

      【讨论】:

      猜你喜欢
      • 2012-10-03
      • 2021-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-03
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      相关资源
      最近更新 更多