2

我們使用我們的生產APNS證書設置了Azure通知集線器,並在生產模式下配置了APNS。 我們將我們的測試設備(使用TestFlight/Production構建和證書)註冊到APNS,然後使用標籤dealer-1註冊到ANH。當我們直接使用APNS時,我們可以使用我們的生產證書和註冊設備ID發送通知,但是當我們使用'測試發送'時,我們會向1臺設備(或我們註冊的許多設備)發送'成功發送'。通知未收到。如果我們再次運行'測試發送',則發送0個設備。通知集線器設備在推送(APNS)後消失

在日誌中,我們看到每個設備的「APNS錯誤」,每次發送測試。我看不出有什麼辦法可以查看錯誤的實際情況,所以這是絕對無用的指標。

我已經完成了所有故障排除步驟,並確認了許多次在「生產」中設置了所有內容。

在審查其他問題,答案一直沿着線:

  • ..註冊一個沙箱證書,然後將其更改爲生產。不幸的是,我們從頭開始創建了這個中心作爲生產,試圖解決這個潛在問題。
  • ..在生產證書上註冊沙箱設備(以及令牌)。不幸的是,我已經嚴密地控制了這一點,並確保我們只針對ANH註冊TestFlight構建(因此生產)。
  • ..上傳錯誤的證書。如上所述,我已通過推送通知測試人員確認證書是正確的(指紋確認,重新上傳等),並可通過生產APNS端點發送到設備。

資源名稱是:八技術/反應推通知業務的集線器

在應用內的註冊過程如下:

  • 推送通知設備寄存器
  • 註冊事件在iOS項目(AppDelegate事件)中處理..

    public override void RegisteredForRemoteNotifications(UIApplication application, NSData deviceToken) 
    { 
        //base.RegisteredForRemoteNotifications(application, deviceToken); 
        App.ConfigurePushNotifications(deviceToken.ToString()); 
    } 
    
  • ConfigurePushNotifications是在XF共享項目..

    public static void ConfigurePushNotifications(string deviceToken) 
    { 
        var azureComm = DependencyService.Get<Interop.IAzureCommunication>(); 
        azureComm.RegisterForPushTags(
         "sb://eight-technology.servicebus.windows.net/", 
         ".. token ..", 
         "react-push-notification-hub", 
         deviceToken, 
         StateManager.SelectedNodes.Select(m => "dealer-" + m).ToArray()); 
    } 
    
  • 的實施是相當多按提供的示例代碼(包含在iOS的項目)

    public class AzureCommunication : DealerwebReact.Interop.IAzureCommunication 
    { 
        public void RegisterForPushTags(string url, string key, string hubName, string deviceToken, string[] tags) 
        { 
         var cs = SBConnectionString.CreateListenAccess(new NSUrl(url), key); 
    
         var hub = new SBNotificationHub(cs, hubName); 
         hub.RegisterNativeAsync(deviceToken, new NSSet(tags), err => 
         { 
          if (err != null) 
           Console.WriteLine("Error: " + err.Description); 
          else 
           Console.WriteLine("Success"); 
         }); 
        } 
    } 
    

回答

2

經過幾天的沮喪,並感謝Nikita G.和hvaughan3的幫助,我終於找到了我的問題的根源。正如預期的那樣,這不是實際上列出的任何問題,而是與我們處理Xamarin Forms註冊跨平臺方面的方式有關。

也就是說,我們將令牌存儲在一個類中,作爲string。在RegisteredForRemoteNotifications中作爲iOS設備註冊的一部分收到的NSData有一個ToString()方法與發送到ANH不兼容。此外,來自Azure庫的RegisterNativeAsync方法需要NSData,我認爲Xamarin可以在沒有警告或錯誤的情況下將字符串變形,因此不知道這兩者有些不兼容。

基本上,爲了保持跨平臺功能,我們現在簡單地將令牌作爲object傳遞,並在我們的push配置方法的特定於平臺的實現中執行轉換回原始類型。

我們的註冊方法現在看起來是這樣,請注意明確使用NSData類型,使之保持不變,同時通過Xamarin形式層:

public void RegisterForPushTags(string url, string key, string hubName, object deviceToken, string[] tags) 
    { 
     var cs = SBConnectionString.CreateListenAccess(new NSUrl(url), key); 

     var hub = new SBNotificationHub(cs, hubName); 
     hub.RegisterNativeAsync((NSData)deviceToken, new NSSet(tags), err => 
     { 
      if (err != null) 
       Console.WriteLine("Error: " + err.Description); 
      else 
       Console.WriteLine("Success"); 
     }); 
    } 
1

this the guide您使用排除故障?

在註冊設備之前,您是否有機會在APN手柄上進行任何字符串(或任何其他類型的)處理?你看到的'APNS錯誤'似乎是'無效的標記大小'。由於我不知道代碼中發生了什麼,因此很難說明它究竟會發生什麼,但可能會對您有所幫助。

+0

感謝尼基塔 - 這是我合作過有關指導是。我會用一些代碼更新我的帖子,但我根本不操縱APN令牌,它直接作爲NSString傳遞給你的類。當我登錄時,它的格式爲'<... ... ...>',我認爲這是正確的,因爲這是我可以在APNS測試儀中使用的。你需要改變嗎? –

+0

提供的代碼 - 在註冊時非常簡單。任何想法將不勝感激。示例設備令牌是:'<97e0614c 3c18b3d7 a8d5274b ca7037dc 3e00e703 635d5172 3c755d9c 8616f375>' –

+0

@RudiVisser到目前爲止您還沒有看到您的問題。我實際上會去除小於和大於字符以及像這樣的任何空格:'deviceToken.ToString()。Replace(「<」,string.Empty).Replace(「>」,string.Empty).Replace(「 「,string.Empty);' – hvaughan3

1

當設備正確註冊時,類似的事情發生在我身上,但一旦發送通知,設備就會從列表中消失。它始終證明是在通知中心內配置的APNS證書未正確連接到應用程序ID和/或應用程序沒有使用正確的配置文件進行簽名時出現的問題。

+0

謝謝 - 我想這也可能是一個類似的問題,但那麼證書不會直接與APNS一起工作? –

+0

@RudiVisser對,您的問題的一部分我不確定。我從來沒有嘗試直接通過APNS發送通知。希望我能在這方面更有幫助。你有沒有嘗試下載和使用[服務總線瀏覽器](https://code.msdn.microsoft.com/windowsapps/Service-Bus-Explorer-f2abca5a)?我知道它顯示了比Azure網站在註冊設備方面的更多信息。最近沒有使用它,所以我不能說它是否會直接幫助你的情況或不。 – hvaughan3

+0

我試過了,應用程序沒有工作,但查看VS中的註冊設備工作,並顯示設備註冊了正確的令牌和我發送的標籤。整件事情只是奇怪而令人沮喪:( –

相關問題