簡體   English   中英

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

[英]Not receiving push notification on iOS with Azure Notification Hub- didReceiveRemoteNotification is not called

我已經遵循了這些Notification Hub資源,並且未能成功接收iOS設備上的推送通知。

我已經檢查,重新檢查並重新檢查了我的設置:

  1. 創建了一個新的通知中心:myhubname
  2. 遵循所有證書配置步驟。 開發推送SSL證書
  3. 導出私有證書並上傳到Sandbox下的Notification Hub,以確保使用正確的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的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應用程序之后,這里是生成的儀表板,我不知道如何有效閱讀。 在此輸入圖像描述

考慮到我的證書不正確,或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重命名版本。

命令運行正常。 怎么了?

我在Notification Hub功能的Service Bus團隊中工作。 正如您已經發現的那樣,有效負載格式不正確。

CustomFields采用JSON編碼的字符串,因此您可以將整數和對象設置為自定義字段,例如:iosPayload.C​​ustomFields.Add(“inAppNotification”,“{\\”my \\“:{\\”new \\“:”jsonObject“ }}“);

因此,如果要添加字符串,則必須放置一個json編碼的字符串。 iosPayload.C​​ustomFields.Add(“inAppNotification”,“\\”Hello!\\“”);

鑒於混淆,我們可能會考慮更改此行為,或在序列化時添加JSON安全檢查。

關於Notification Hub儀表板。 當APN接受通知時,通知中心報告成功通知。 您還可以將“無效有效負載”圖形可視化,該圖表將顯示APN是否拒絕來自通知中心的通知。

不幸的是,除了在應用程序運行回調時捕獲通知時,我不知道監視設備流量的方法:didReceiveRemoteNotification。

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儀表板沒有多大幫助

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

試試這個:

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}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM