我已按照这些通知中心资源进行操作,但未能成功接收iOS设备上的推送通知。
我已经检查,重新检查并重新检查了我的设置:
生成推送通知的演示应用程序:
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,所以看起来都很好。
我看到下面的代码正确注册:
-(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应用程序,这里是生成的仪表板,我不知道如何有效阅读。
认为我的证书不正确,或者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版本。
命令运行正常。发生了什么事?
答案 0 :(得分:3)
我在Notification Hub功能的Service Bus团队中工作。 如您所知,有效负载格式不正确。
CustomFields采用JSON编码的字符串,因此您可以将整数和对象设置为自定义字段,例如: iosPayload.CustomFields.Add(“inAppNotification”,“{\”my \“:{\”new \“:”jsonObject“}}”);
因此,如果你想添加一个字符串,你必须放一个json编码的字符串。 iosPayload.CustomFields.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"}
都可以
一种解决方案是使用Json.NET,或在Microsoft内部ping某人。
未解决的问题:
希望这能在下午拯救某人。
答案 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}