未通过Azure Notification Hub- didReceiveRemoteNotification在iOS上接收推送通知未被调用

时间:2013-02-06 00:04:55

标签: c# azure push-notification apple-push-notifications azure-notificationhub

我已按照这些通知中心资源进行操作,但未能成功接收iOS设备上的推送通知。

我已经检查,重新检查并重新检查了我的设置:

  1. 创建了一个新的通知中心:myhubname
  2. 遵循所有证书配置步骤。 Development Push SSL Certificate
  3. 导出私有证书并上传到 Sandbox 下的通知中心,以确保使用正确的APS网关
  4. 下载配置文件,该配置文件与我的项目的软件包ID匹配,自动检测代码签名,并成功编译。请勿使用'V2D7FJQXP'。如果您想知道这个字符串显示在您的App ID中:V2D7FJQXP.com.yourcompany.yourproject
  5. 在物理设备上运行 - 不在模拟器
  6. 下运行

    生成推送通知的演示应用程序:

    while (true)
    {
        string connectionString = ServiceBusConnectionStringBuilder.CreateUsingSharedAccessSecretWithFullAccess("myhubname-ns", "…snip");
        var hubClient = NotificationHubClient.CreateClientFromConnectionString(connectionString, "myhubname");
        var iosPayload = AppleNotificationJsonBuilder.Create("Hello!");
        iosPayload.CustomFields.Add("inAppNotification", "Hello!");
        hubClient.SendAppleNativeNotification(iosPayload.ToJsonString());
    
        Console.WriteLine("Sent");
    
        Thread.Sleep(20000);
    }
    

    不会产生任何例外或问题。管理任何命名空间,密钥或集线器名称都会导致异常被抛出,而来自Azure的fiddler响应代码是2xx,所以看起来都很好。

    我看到下面的代码正确注册:

    • 我接受了设备上的推送通知
    • 我看到createDefaultRegistrationWithTags调用一次,然后在后续调用中看到exists为true。
    • 没有调用didFailToRegisterForRemoteNotificationsWithError,这没关系
    • 在这里的代码示例中:http://msdn.microsoft.com/library/jj927168.aspx,我用https://替换了sb://,否则会抛出。没问题我在想

    -(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *) deviceToken {
    NSString* connectionString = [SBConnectionString stringWithEndpoint:@"https://gift-ns.servicebus.windows.net/" listenAccessSecret:@"…snip"];
    self.hub = [[SBNotificationHub alloc] initWithConnectionString:connectionString notificationHubPath:@"gift-usw-dev"];
    [self.hub refreshRegistrationsWithDeviceToken:deviceToken completion:^(NSError* error) {
        if (error == nil) {
            [self.hub defaultRegistrationExistsWithCompletion:^(BOOL exists, NSError* error2) {
                if (error2 == nil) {
                    if (!exists) {
                        [self.hub createDefaultRegistrationWithTags:nil completion:^(NSError* error3) {
                            if (error3 != nil) {
                                NSLog(@"Error creating default registration: %@", error3);
                            }
                        }];
                    }
                } else {
                    NSLog(@"Error retrieving default registration: %@", error2);
                }
            }];
        } else {
            NSLog(@"Error refreshing device token: %@", error);
        }
    }];
    }
    

    启动演示应用程序,然后运行iOS应用程序,这里是生成的仪表板,我不知道如何有效阅读。 enter image description here

    认为我的证书不正确,或者Azure和APS之间丢失了什么,我挖掘了APS服务的故障排除并找到了这个:http://developer.apple.com/library/ios/#technotes/tn2265/_index.html并跳转到连接推送服务的问题

    并运行此命令:

    openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert YourSSLCertAndPrivateKey.pem -debug -showcerts -CAfile server-ca-cert.pem

    但是我没有.pem文件(OSX),所以我找到了这个命令来获取它们:

    openssl pkcs12 -in keyStore.pfx -out keyStore.pem -nodes

    其中keyStore.pfx是从Keychain导出的推送通知证书重命名的.p12版本。

    命令运行正常。发生了什么事?

3 个答案:

答案 0 :(得分:3)

我在Notification Hub功能的Service Bus团队中工作。 如您所知,有效负载格式不正确。

CustomFields采用JSON编码的字符串,因此您可以将整数和对象设置为自定义字段,例如: iosPayload.C​​ustomFields.Add(“inAppNotification”,“{\”my \“:{\”new \“:”jsonObject“}}”);

因此,如果你想添加一个字符串,你必须放一个json编码的字符串。 iosPayload.C​​ustomFields.Add(“inAppNotification”,“\”Hello!\“”);

考虑到这种混淆,我们可能会考虑更改此行为,或在序列化时添加JSON安全检查。

关于通知中心仪表板。 当APN接受通知时,通知中心报告成功通知。您还可以将“无效有效负载”图形可视化,该图表将显示APN是否拒绝来自通知中心的通知。

不幸的是,我不了解监控设备流量的方法,除了在应用程序运行回调时捕获通知:didReceiveRemoteNotification。

答案 1 :(得分:1)

AppleNotificationJsonBuilder未使用最新的服务总线预览功能正确序列化有效负载。

所以,根据msdn说明中的例子:

var iosPayload = AppleNotificationJsonBuilder.Create("Hello!");
iosPayload.CustomFields.Add("inAppNotification", "Hello!");
Console.Log(iosPayload.ToJsonString());

生成:

{"aps":{"alert":"This is a test"},"inAppNotification":Hello! This is a test}

哪个是畸形的。格式良好的是"字符串"

{"aps":{"alert":"This is a test"},"inAppNotification":"Hello! This is a test"}

自定义有效负载每http://developer.apple.com/library/mac/#documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/ApplePushService/ApplePushService.html

都可以

一种解决方案是使用Json.NET,或在Microsoft内部ping某人。

未解决的问题:

  • 我如何监控iOS设备的网络流量?
  • ' JSON'到达设备,但解析不正确?还是在APS被杀了?
  • Azure Notification Hub信息中心没有多大帮助

希望这能在下午拯救某人。

答案 2 :(得分:1)

试试这个:

var iosPayload = AppleNotificationJsonBuilder.Create("This is a test");
iosPayload.CustomFields.Add("inAppNotification", "\"Hello!\"");
  

- > {“aps”:{“alert”:“这是一个测试”},“inAppNotification”:“你好!”}

更复杂的:

iosPayload.CustomFields.Add("inAppNotification", "[ \"bang\",  \"whiz\" ]");
  

- > {“aps”:{“alert”:“这是一个测试”},“inAppNotification”:[“bang”,“whiz”]}

iosPayload.CustomFields.Add("inAppNotification", "42");
  

- > {“aps”:{“alert”:“这是一个测试”},“inAppNotification”:42}