7

Zacząłem korzystać z usługi aplikacji Azure w tym miesiącu, przed usługą App korzystałem z usług Azure Mobile, a token urządzenia rejestracyjnego z tagami jest dość prosty, ale w usłudze aplikacji zdałem sobie sprawę, że został usunięty z powodu problemów związanych z bezpieczeństwem, więc muszę to zrobić za pomocą niestandardowego interfejsu API.Rozwiązywanie problemów z usługą Azure App Service Rejestracja powiadomienia push przy użyciu znaczników w iOS

Używam niestandardowego uwierzytelniania (nie jest to usługa uwierzytelniania błękitnego (z powodu mojego klienta tego nie chce)) z moją bazą danych, więc muszę ustawić identyfikator użytkownika jako znacznik do wysyłania powiadomień do określonego użytkownika. w obliczu problemu, że nawet jeśli urządzenie żeton rejestracja jest OK (mogę wysłać impuls do wszystkich bez tagów) znaczniki nie pracuje, ja po tych blogach

https://blogs.msdn.microsoft.com/writingdata_services/2016/04/14/adding-push-notification-tags-from-a-node-js-backend/

https://blogs.msdn.microsoft.com/writingdata_services/2016/01/22/adding-push-notification-tags-from-an-azure-mobile-apps-client/

Moje niestandardowe API (updateNotification.js)

var api = { 

    get: (request,response,next) => { 
      var push = request.azureMobile.push; 
      var installationId = request.query.id; 

      push.getInstallation(installationId, function(error, installation, res){ 
       if (error){     
        console.log('An error occurred when retrieving installation : ' + error); 
        response.status(error.statusCode).send(error.detail);     
       } 
       else{ 
        // Return an array of current tags. 
        response.json(installation.tags); 
       }    
      }); 
    }, 

    post: (request, response, next) => { 
     var push = request.azureMobile.push; 
     var installationId = request.query.id; 
     var tags = request.query.userID; 

     var updateOperation = [{ 
      "op": "add", 
      "path": "/tags", 
      "value": tags.toString() 
     }];  

     push.patchInstallation(installationId, updateOperation, function(error, res){ 
      if(error){ 
       console.log(error) 
       response.status(error.statusCode).send(error.detail); 
      } 
      else{ 
       console.log("Success"); 
       console.log("Tags : " + tags); 
       response.status(200).send(tags); 
      } 
     }); 
    } 
}; 

module.exports = api; 

W mojej klasie AppDelegate.swift robiłem to

func application(application: UIApplication, 
        didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) { 
     let keychain = KeychainSwift() 
     let id : NSString = keychain.get("userID")! as String 
     let client = MSClient(applicationURLString: "https://XXXX.XXXX.XXX") 
     var deviceTokenString = "\(deviceToken)" 
     deviceTokenString = deviceTokenString.stringByReplacingOccurrencesOfString("<", withString: "") 
     deviceTokenString = deviceTokenString.stringByReplacingOccurrencesOfString(">", withString: "") 
     deviceTokenString = deviceTokenString.stringByReplacingOccurrencesOfString(" ", withString: "-")   

     client.push?.registerDeviceToken(deviceToken, completion: { (error) in 
      if let err = error { 
       print("ERROR ", err) 
      }else{ 
       client.invokeAPI("updateNotification", body: nil, HTTPMethod: "Post", parameters: ["id" : deviceTokenString , "userID" : id], headers: nil) { (result, response, error) in 
        if response?.statusCode != 200 { 
         NSLog("ERROR %@", error!) 
        } else { 
         print("Tags Successfully Implemented") 
        } 
       } 
      } 
     }) 

    } 

Wszystko wydaje się w porządku teraz, w moim konsoli widzę mojego identyfikatora, moje urządzenie tokenu i identyfikator użytkownika jest tutaj tak (jestem wkładaniu X w środku: D Niestety do tego)

deviceToken = 22afedf6-a08f1ce9-xxxxxxxxx-XXXXXXXX-XXXXXXXX-XXXXXXX-db431577-2dfbbee1 identyfikator użytkownika = 88d06c97-XXXXXXXX XXXX-042215c46575

Jednak gdy próbowałem tej metody GET widzieć tagi identyfikator urządzenia,

client.invokeAPI("updateNotification", body: nil, HTTPMethod: "GET", parameters: ["id" : deviceTokenString], headers: nil) { (result, response, error) in 
      if response?.statusCode != 200 { 
        NSLog("ERROR %@", error!) 
      } else { 
        print(result) 
      } 
    } 

ja dostaję ten błąd:

Błąd Domain = kod com.Microsoft.MicrosoftAzureMobile.ErrorDomain = -1302 " Instalacja nie found.TrackingId: 57239dd3-XXXX-XXXX-XXXX-0bd9579c660e_G1, timestamp: 18.07.2016 20:22:05”

Jak mogę rozwiązać ten komunikat o błędzie?

+1

Could postępujesz zgodnie z [wytycznymi diagnostyki] (https://azure.microsoft.com/en-us/documentation/articles/notification-hubs-push-notification-fixer/), a jeśli to nie pomoże, czy mógłbyś wydać repro wkleić tutaj pełny identyfikator śledzenia? (Nie ma w tym nic wrażliwego, to tylko losowy ciąg.) –

+0

@NikitaG. tutaj jest mój identyfikator śledzenia c5c802bd-c94f-46f7-b87d-bddbe0e277d4_G6 – KBB

Odpowiedz

4

Ok, po długich godzin pracy jest rozwiązaniem

1.Step

enter image description here

Jeśli możesz debug the Notification Hub (I sugeruję debugowania z programu Visual Studio 2015 Express, itp ..) , możesz zobaczyć, że identyfikator PNS (, który jest naszym tokenem urządzenia) jest kapitałem bez kresek, więc najpierw musimy zmienić kod tokenu urządzenia, który był w naszym AppDelegate.swift, który będzie podobny to

deviceTokenString = deviceTokenString.stringByReplacingOccurrencesOfString("<", withString: "") 
deviceTokenString = deviceTokenString.stringByReplacingOccurrencesOfString(">", withString: "")  
deviceTokenString = deviceTokenString.stringByReplacingOccurrencesOfString(" ",withString: "-") 
deviceTokenString = deviceTokenString.uppercaseString 

//In case of any spaces just guarantee with trim 
let trimmedDeviceToken = deviceTokenString.stringByTrimmingCharactersInSet(
    NSCharacterSet.whitespaceAndNewLineCharacterSet() 
) 

2.Step

InstallationId i urządzeń tokeny są zupełnie różne rzeczy.Pchasz znaczniki do installationId nie token urządzenia, więc musisz uzyskać installationId w swoim kodzie klienta.

Problem jest w Azure Telefony SDK dla iOS nie można nazwać ID instalacji z client.installationId (przynajmniej ja nie mogłem znaleźć sposób na uzyskanie od MSClient Object)

Co mogę zrobić, to pójść w ramy i znaleźć MSClient.m .A ja sobie sprawę, że id instalacja jest właściwie przechowywany w NSUserDefaults z kluczem „WindowsAzureMobileServicesInstallationId” .so mogę dotrzeć z domyślnych NSUser z tym

let defaults = NSUserDefaults.standartUserDefaults() 
let installationID = defaults.stringForKey("WindowsAzureMobileServicesInstallationId") 

po tych krokach można rzeczywiście zarejestruj znaczniki instalacja n ids. Oto wynik oraz pełny kod aplikacji didRegisterForRemoteNotificationsWithDeviceToken metody

func application(application: UIApplication, 
        didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) { 
     let keychain = KeychainSwift() 
     let id : NSString = keychain.get("userID")! as String 
     let client = MSClient(applicationURLString: "https://XXXX.XXXX.XXX") 
     var deviceTokenString = "\(deviceToken)" 
     deviceTokenString = deviceTokenString.stringByReplacingOccurrencesOfString("<", withString: "") 
     deviceTokenString = deviceTokenString.stringByReplacingOccurrencesOfString(">", withString: "") 
     deviceTokenString = deviceTokenString.stringByReplacingOccurrencesOfString(" ", withString: "") 
     deviceTokenString = deviceTokenString.uppercaseString 

     //In case of any spaces just guarantee with trim 
     let trimmedDeviceToken = deviceTokenString.stringByTrimmingCharactersInSet(
      NSCharacterSet.whitespaceAndNewLineCharacterSet() 
     ) 

     let defaults = NSUserDefaults.standartUserDefaults() 
     let installationID = defaults.stringForKey("WindowsAzureMobileServicesInstallationId") 

     client.push?.registerDeviceToken(deviceToken, completion: { (error) in 
      if let err = error { 
       print("ERROR ", err) 
      }else{ 
       client.invokeAPI("updateNotification", body: nil, HTTPMethod: "Post", parameters: ["id" : installationID! , "userID" : id], headers: nil) { (result, response, error) in 
        if response?.statusCode != 200 { 
         NSLog("ERROR %@", error!) 
        } else { 
         print("Tags Successfully Implemented") 
        } 
       } 
      } 
     }) 

    } 

enter image description here

Po tym można również sprawdzić tagów poprzez wywołanie metody GET updateNotification z wysyłaniem installationId że dostajemy od NSUserDefaults