Xamarin.iOS Azure Notification Hub可以在生产环境中使用,但第二个设置为Sandbox的Hub无法使用

时间:2018-11-16 01:48:50

标签: azure xamarin.forms push-notification xamarin.ios apple-push-notifications

目标:发布该应用程序时,我希望拥有一个用于测试的Notification Hub和一个用于生产的Notification Hub。理想情况下,我想使用沙盒通知中心来定位设备的安装ID以测试推送通知。

注意:使用Android进行测试时,我仅使用Production Hub进行测试,并且仅将设备的Android安装ID作为目标即可。但是iOS Push通知可用于证书和沙盒/生产模式。

在Azure中,我有一个通知中心命名空间。命名空间包含两个集线器,一个在生产模式下设置,另一个在沙箱中设置(通过切换开关)

这些是我介绍的步骤:

  1. 生产中心已上传了生产p12证书,该证书先前是通过右键单击“ Apple Push Services:com.company.myappname”从钥匙串导出的

2。沙箱中心具有上载的沙箱p12证书,该证书先前是通过右键单击“ Apple Development iOS Push Services:com.company.myappname”从钥匙串导出的

  1. Azure托管的Web API中有两种Post方法,分别用于生产和沙箱模式。两种方法之间的区别是将集线器和默认共享终结点切换到Azure Portal中的相应值。

        [AllowAnonymous]
        [HttpPost, Route("sendForIOSDevelopment")]
        public async Task<IHttpActionResult> SendTestToIOSInstallationId([FromBody]string message, string installationId)
        {        
    
            if (string.IsNullOrWhiteSpace(installationId))
            {
                var model = new
                {
                    error = new
                    {
                        code = 400,
                        message = "installation id is null or empty"
                    }
                };
                return Content(HttpStatusCode.BadRequest, model); //400 Bad Request with error message
            }
    
            //string hubName = "sandboxModeHub";
            string hubName = "productionModeHub";
    
            //string hubNameDefaultShared = "sandboxModeHubFullSharedEndPoint";
            string hubNameDefaultShared = "productionModeHubFullSharedEndPoint";
    
            NotificationHubClient hub = NotificationHubClient
                            .CreateClientFromConnectionString(hubNameDefaultShared, hubName, enableTestSend: true);
    
            var templateParams = new Dictionary<string, string>
            {
                ["messageParam"] = message
            };
    
            NotificationOutcome result = await hub.SendTemplateNotificationAsync(templateParams, "$InstallationId:{" + installationId + "}").ConfigureAwait(false);
    
            return Ok(result); //200 Ok with model result
        }
    

4。这是我在移动应用中注册推送通知的方式:

private async Task SendRegistrationToServerAsync(NSData deviceToken)
        {
            //this is the template/payload used by iOS. It contains the "messageParam"
            // that will be replaced by our service

            const string templateBodyAPNS = @"{
                                                ""aps"" : {
                                                    ""alert"" : ""$(messageParam)"",
                                                    ""mutable-content"": 1
                                                },
                                            }";


            var templates = new JObject();
            templates["genericMessage"] = new JObject
            {
                {"body", templateBodyAPNS }
            };

            // send registration to web api
            var client = new MobileServiceClient(MyAppName.App.MobileServiceUrl);
            await client.GetPush().RegisterAsync(deviceToken, templates);

            //get the installation id
            Console.WriteLine("Installation id: " + client.InstallationId.ToString());      
        }
  1. 要在沙盒模式下运行Xamarin应用,我将Entitlements.plist的“ aps-environment”键更改为“ development”,并使用Postman定位Azure后端托管的开发Post方法。

    发生的事情是,一切在Production中心上都可以正常运行,而在Sandbox中心上却没有。

当我使用开发路线发布到沙箱中心时,以Web API中的开发Post方法为目标时,我得到了这个信息:

{     “成功”:0,     “失败”:0,     “结果”:null }

我不知道为什么到现在为止。我已经在生产模式和沙箱中都使用过我的设备来测试该应用程序,想知道这是否与它有关。

0 个答案:

没有答案