【问题标题】:Production certificate error in push notification - PushSharp推送通知中的生产证书错误 - PushSharp
【发布时间】:2016-05-26 07:46:38
【问题描述】:

当我在生产环境中使用具有以下推送通知证书的企业帐户时,我的应用收到推送通知:

Apple 生产 iOS 推送服务

然后为了在应用商店发布我的应用程序,我开始使用应用商店帐户,无论我尝试什么,苹果都会以以下名称创建生产证书:

Apple 推送服务

然后从这个SO,我才知道苹果在证书上改名了。我的问题是,我在服务器端使用 Push Sharp 并出现以下错误:

您已选择生产服务器,但您的证书没有 似乎是生产证书!请检查以确保您 有正确的证书!

给出的解决方案都不起作用。

我将 Push Sharp 从 2.2 更新到 3.0 beta,出现许多编译错误,甚至 PushSharp 类本身都不存在,然后尝试了该线程的另一个解决方案。

this 下载PushSharp 并通过删除生产线重新编译它,仍然得到同样的错误。那个解决方案也不是很清楚,我不确定是否要评论证书检查行或什么,我尝试了所有但没有运气

如何解决这个问题?

【问题讨论】:

  • 在您的钥匙串访问中检查所有证书是否有效。
  • @UmaMadhavi,我最近创建了所有证书(仅 2 天前),所有证书都处于活动状态。
  • 好的。在下面的链接中下载 .cer 并告诉stackoverflow.com/a/35403096/5362916

标签: ios certificate apple-push-notifications pushsharp


【解决方案1】:

您可以开始使用新的 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

【讨论】:

    【解决方案2】:

    我的快速解决方法是下载 PushSharp v2.2 的源代码,然后在文件 ApplePushChannelSettings.cs 中我注释掉了有关生产和测试证书的检查:

            void CheckProductionCertificateMatching(bool production)
        {
            if (this.Certificate != null)
            {
                var issuerName = this.Certificate.IssuerName.Name;
                var subjectName = this.Certificate.SubjectName.Name;
    
                if (!issuerName.Contains("Apple"))
                    throw new ArgumentException("Your Certificate does not appear to be issued by Apple!  Please check to ensure you have the correct certificate!");
    
                /*
                if (production && !subjectName.Contains("Apple Production IOS Push Services"))
                    throw new ArgumentException("You have selected the Production server, yet your Certificate does not appear to be the Production certificate!  Please check to ensure you have the correct certificate!");
    
    
                if (!production && !subjectName.Contains("Apple Development IOS Push Services") && !subjectName.Contains("Pass Type ID"))
                        throw new ArgumentException("You have selected the Development/Sandbox (Not production) server, yet your Certificate does not appear to be the Development/Sandbox certificate!  Please check to ensure you have the correct certificate!");                
                 */
            }
            else
                throw new ArgumentNullException("You must provide a Certificate to connect to APNS with!");
        }
    

    并替换了我项目中的 PushSharp.Apple.dll 文件。

    希望我的客户能够升级到 dotnet 4.5,这样我们就可以使用 PushSharp 4 并以正确的方式进行操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多