3

これらのNotificationHubリソースをフォローしましたが、iOSデバイスでプッシュ通知を受信できませんでした。

セットアップを確認、再確認、および再確認しました。

  1. 新しい通知ハブを作成しました:myhubname
  2. すべての証明書プロビジョニング手順に従いました。 開発プッシュSSL証明書
  3. プライベート証明書をエクスポートし、サンドボックスの下の通知ハブにアップロードして、正しいAPSゲートウェイが使用されていることを確認します
  4. プロジェクトのバンドルIDと一致し、コード署名用に自動検出され、正常にコンパイルされるプロビジョニングプロファイルをダウンロードしました。「V2D7FJQXP」は使用しないでください。疑問に思っている場合は、アプリIDに表示されるこの文字列の例:V2D7FJQXP.com.yourcompany.yourproject
  5. 物理デバイスで実行中-シミュレーターではありません

プッシュ通知を生成しているデモアプリケーション:

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からのフィドラー応答コードは2xxであるため、すべてが正常に表示されます。

以下のコードごとに登録が正しく行われていることがわかります。

  • デバイスでプッシュ通知を受け入れました
  • createDefaultRegistrationWithTags呼び出しが一度表示され、その後の呼び出しで存在がtrueであることがわかります。
  • didFailToRegisterForRemoteNotificationsWithErrorへの呼び出しはありません。これは問題ありません。
  • ここのコード例:http://msdn.microsoft.com/library/jj927168.aspxでは、sb://をhttps://に置き換えました。そうしないとスローされます。私が考えている問題ではない

-(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は、プッシュ通知証明書用にキーチェーンからエクスポートされた.p12の名前が変更されたバージョンです。

コマンドは正常に実行されました。何が起こっている?

4

3 に答える 3

3

私はServiceBusチームでNotificationHub機能を担当しています。すでにお分かりのように、ペイロードは正しくフォーマットされていません。

CustomFieldsはJSONでエンコードされた文字列を受け取るため、整数とオブジェクトをカスタムフィールドとして設定できます。たとえば、次のようになります。iosPayload.C​​ustomFields.Add( "inAppNotification"、 "{\" my \ ":{\" new \ ":" jsonObject " }} ");

したがって、文字列を追加する場合は、jsonでエンコードされた文字列を配置する必要があります。iosPayload.C​​ustomFields.Add( "inAppNotification"、 "\" Hello!\ "");

混乱を考えると、この動作を変更するか、シリアル化時にJSON安全性チェックを追加することを検討するかもしれません。

NotificationHubダッシュボードについて。通知ハブは、APNが通知を受け入れると、成功した通知を報告します。また、APNが通知ハブからの通知を拒否したかどうかを示す「無効なペイロード」のグラフを視覚化することもできます。

残念ながら、コールバックを使用してアプリが実行されているときに通知をキャプチャする以外に、デバイスのトラフィックを監視する方法を認識していません:didReceiveRemoteNotification。

于 2013-02-06T23:44:05.857 に答える
1

AppleNotificationJsonBuilderは、ServiceBusプレビュー機能の最新のnugetを使用してペイロードを正しくシリアル化しません。

したがって、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に従って問題ありません。

1つの解決策は、Json.NETを使用するか、Microsoftの内部で誰かにpingを実行することです。

未解決の問題:

  • iOSデバイスからのネットワークトラフィックを監視するにはどうすればよいですか?
  • 'JSON'はデバイスに到達しましたが、正しく解析されませんでしたか?それともAPSで殺されたのですか?
  • AzureNotificationHubダッシュボードはあまり役に立ちませんでした

うまくいけば、これは誰かの午後を救うでしょう。

于 2013-02-06T00:04:54.990 に答える
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}

于 2013-02-06T23:41:56.420 に答える