1

이것은 상당히 긴 코드입니다. 알림 허브를 처음 사용하기는하지만이 데 이터가 보이지 않고 아무런 문제도 볼 수 없습니다. Azure에서 알림 허브를 사용하여 대상 알림 (로그온 한 사용자)에 등록하려고합니다. 등록 후 테스트 알림이 전송됩니다.Azure 알림 허브 및 WP8 중계 알림

문제는 내가 장치에 알림을 보내고 때로는 그렇지 않다는 것입니다. 그것은 주로하지만 때로는 서버에서 코드를 단계별로, 나는 에뮬레이터에 대한 통지를 얻을 것이다 가끔있다. 일단 내 휴대 전화에 응용 프로그램을 배포 할 때 알림은 에뮬레이터에 온거야! 나는 패턴을 발견 할 수 없다.

내 컨트롤러 클래스는 다음과 같습니다.

private NotificationHelper hub; 

    public RegisterController() 
    { 
     hub = NotificationHelper.Instance; 
    } 
    public async Task<RegistrationDescription> Post([FromBody]JObject registrationCall) 
    {   
     var obj = await hub.Post(registrationCall); 
     return obj; 
    } 

도우미 클래스 (다른 곳에서 사용되므로 컨트롤러에 직접 사용되지 않음)는 다음과 같습니다.

public static NotificationHelper Instance = new NotificationHelper(); 

    public NotificationHubClient Hub { get; set; } 

    // Create the client in the constructor. 
    public NotificationHelper() 
    { 
     var cn = "<my-cn>"; 
     Hub = NotificationHubClient.CreateClientFromConnectionString(cn, "<my-hub>"); 
    } 

    public async Task<RegistrationDescription> Post([FromBody] JObject registrationCall) 
    {    
     // Get the registration info that we need from the request. 
     var platform = registrationCall["platform"].ToString(); 
     var installationId = registrationCall["instId"].ToString(); 
     var channelUri = registrationCall["channelUri"] != null 
      ? registrationCall["channelUri"].ToString() 
      : null; 
     var deviceToken = registrationCall["deviceToken"] != null 
      ? registrationCall["deviceToken"].ToString() 
      : null; 
     var userName = HttpContext.Current.User.Identity.Name; 

     // Get registrations for the current installation ID. 
     var regsForInstId = await Hub.GetRegistrationsByTagAsync(installationId, 100); 

     var updated = false; 
     var firstRegistration = true; 
     RegistrationDescription registration = null; 

     // Check for existing registrations. 
     foreach (var registrationDescription in regsForInstId) 
     { 
      if (firstRegistration) 
      { 
       // Update the tags. 
       registrationDescription.Tags = new HashSet<string>() {installationId, userName}; 

       // We need to handle each platform separately. 
       switch (platform) 
       { 
        case "windows": 
         var winReg = registrationDescription as MpnsRegistrationDescription; 
         winReg.ChannelUri = new Uri(channelUri); 
         registration = await Hub.UpdateRegistrationAsync(winReg); 
         break; 
        case "ios": 
         var iosReg = registrationDescription as AppleRegistrationDescription; 
         iosReg.DeviceToken = deviceToken; 
         registration = await Hub.UpdateRegistrationAsync(iosReg); 
         break; 
       } 
       updated = true; 
       firstRegistration = false; 
      } 
      else 
      { 
       // We shouldn't have any extra registrations; delete if we do. 
       await Hub.DeleteRegistrationAsync(registrationDescription); 
      } 
     } 

     // Create a new registration. 
     if (!updated) 
     { 
      switch (platform) 
      { 
       case "windows": 
        registration = await Hub.CreateMpnsNativeRegistrationAsync(channelUri, 
         new string[] {installationId, userName}); 
        break; 
       case "ios": 
        registration = await Hub.CreateAppleNativeRegistrationAsync(deviceToken, 
         new string[] {installationId, userName}); 
        break; 
      } 
     } 

     // Send out a test notification. 
     await SendNotification(string.Format("Test notification for {0}", userName), userName); 

     return registration; 

그리고 마지막으로 내 SendNotification 메소드가 있습니다.

internal async Task SendNotification(string notificationText, string tag) 
    { 
     try 
     { 
      var toast = PrepareToastPayload("<my-hub>", notificationText); 
      // Send a notification to the logged-in user on both platforms. 
      await NotificationHelper.Instance.Hub.SendMpnsNativeNotificationAsync(toast, tag);  
      //await hubClient.SendAppleNativeNotificationAsync(alert, tag); 
     } 
     catch (ArgumentException ex) 
     { 
      // This is expected when an APNS registration doesn't exist. 
      Console.WriteLine(ex.Message); 
     } 
    } 

내 전화 클라이언트 코드에 여기에있는 것으로 의심되며 WebAPI 로그인 직후에 SubscribeToService가 호출됩니다.

public void SubscribeToService() 
    { 
     _channel = HttpNotificationChannel.Find("mychannel"); 
     if (_channel == null) 
     { 
      _channel = new HttpNotificationChannel("mychannel"); 
      _channel.Open(); 
      _channel.BindToShellToast(); 
     } 

     _channel.ChannelUriUpdated += async (o, args) => 
              {    
               var hub = new NotificationHub("<my-hub>", "<my-cn>"); 
               await hub.RegisterNativeAsync(args.ChannelUri.ToString()); 
               await RegisterForMessageNotificationsAsync(); 

              }; 

    } 

    public async Task RegisterForMessageNotificationsAsync() 
    { 
     using (var client = GetNewHttpClient(true)) 
     { 
      // Get the info that we need to request registration. 
      var installationId = LocalStorageManager.GetInstallationId(); // a new Guid 

      var registration = new Dictionary<string, string>() 
           { 
            {"platform", "windows"}, 
            {"instId", installationId}, 
            {"channelUri", _channel.ChannelUri.ToString()} 
           }; 

      var request = new HttpRequestMessage(HttpMethod.Post, new Uri(ApiUrl + "api/Register/RegisterForNotifications")); 

      request.Content = new StringContent(JsonConvert.SerializeObject(registration), Encoding.UTF8, "application/json"); 

      string message; 

      try 
      { 
       HttpResponseMessage response = await client.SendAsync(request); 
       message = await response.Content.ReadAsStringAsync(); 
      } 
      catch (Exception ex) 
      { 
       message = ex.Message; 
      } 
      _registrationId = message; 
     } 
} 

내가 지금 며칠 동안 붙어있어 도움이 될 것입니다. 이 코드는 여기에 붙여 넣을 코드가 많지만 모두 관련이 있습니다. 감사합니다 :

EDIT : 사용자가 로그인하여 WebAPI로 인증하면 SubscribeToService() 메서드가 호출됩니다. 방법은 여기에 있습니다.

public async Task<User> SendSubmitLogonAsync(LogonObject lo) 
    { 
     _logonObject = lo; 
     using (var client = GetNewHttpClient(false)) 
     { 
     var logonString = String.Format("grant_type=password&username={0}&password={1}", lo.username, lo.password); 
      var sc = new StringContent(logonString, Encoding.UTF8); 

      var response = await client.PostAsync("Token", sc); 
      if (response.IsSuccessStatusCode) 
      { 
       _logonResponse = await response.Content.ReadAsAsync<TokenResponseModel>(); 
       var userInfo = await GetUserInfoAsync();     

       if (_channel == null) 
        SubscribeToService(); 
       else 
        await RegisterForMessageNotificationsAsync();     

       return userInfo; 
      } 
    // ... 
     } 
    } 
+0

RegisterForMessageNotificationsAsync() 메서드는 언제 호출합니까? – sabbour

+0

ChannelUriUpdated 이벤트에서 호출됩니다. 나는 이것이 실제로 올바른 장소라는 것을 확신하지 못했다. 그러나 이것은 채널 uri를 필요로하므로 이것이 설정 될 때까지 호출 할 수 없다. – creatiive

+0

그리고 언제 SubscribeToService()가 호출됩니까? – sabbour

답변

2

나는이 문제를 해결했다. 엄청나게 조직 된 하우투가 하늘색 알림 허브를위한 것입니다. 그 중 하나만 하단에이 메모가 있습니다.

참고 : 응용 프로그램에서 아직 때

당신은 알림을받을 수 없습니다. 앱이 활성화되어있는 동안 축배 알림을 받으려면 ShellToastNotificationReceived 이벤트를 처리해야합니다.

내가 간헐적 인 결과를 겪고있는 이유입니다. 앱에있는 경우 알림을 받게된다고 생각했기 때문입니다. 그리고이 작은 쪽지는 꽤 잘 숨겨져 있습니다.

0

메시지를 등록/전송하는 동안 올바른 태그/태그 표현식을 사용 했습니까? 또한 알림 허브에서 ID를 다시 저장하고 있습니다. 채널 uri를 업데이트 할 때 사용되어야합니다 (만료됩니다).

처음부터 시작하는 것이 좋습니다.

참조가 : http://msdn.microsoft.com/en-us/library/dn530749.aspx