2016-04-13 7 views
6

TLDR Quando faccio i numeri di telefono in un URL si apre correttamente nei messaggi di controllo, ma quando uso una stringa variabile con i numeri digitati esattamente allo stesso modo all'interno di non lo è.L'URL dei messaggi AppleWatch funziona in modo rigido ma non con le variabili

Esempio:

NSURL(string: "sms:/open?addresses=8888888888,9999999999,3333333333&body=Test") 

Sopra codice funziona, ma sotto il codice non lo fa:

let hardCode = "8888888888,9999999999,3333333333" 
NSURL(string: "sms:/open?addresses=\(hardCode)&body=Test") 

DETTAGLI completa: Sto facendo un URL da variabili per aprire i messaggi sull'orologio di Apple con contenuti pre-riempiti. Ricevo i numeri di telefono dalla rubrica e li memorizzo in un array. Essi sono forniti in questo formato:

(###) ### - ####, ma devono essere ##########

ho provato il codice da codificare i numeri di telefono nel URL e funziona correttamente con tutti i contatti e il corpo completato:

if let urlSafeBody = urlSafeBody, url = NSURL(string: "sms:/open?addresses=8888888888,9999999999,3333333333&body=\(urlSafeBody)") { 
     print("FINAL URL: \(url)") 
     WKExtension.sharedExtension().openSystemURL(url) 
    } 

Ma quando ho costruire i valori Cellulari a livello di codice non funziona:

//holds phone numbers without special chars 
    var tempArray: [String] = [] 

    //if I can access the unformatted numbers 
    if let recips = saveData["recips"] as? [String] { 
     //for each number provided 
     recips.forEach { (person: String) in 
      //remove all non-numerical digits 
      //person is now (###) ###-#### 
      let newPerson = person.digitsOnly() 
      //newPerson is ########## 
      print(person) 
      print("->\(newPerson)") 
      //add formatted number to tempArray 
      tempArray.append(newPerson) 
     } 

    } 
    //combine all numbers with "," between as a string 
    let recipString = tempArray.joinWithSeparator(",") 
    //recipString contains ##########,##########,##########... 

extension String { 

func digitsOnly() -> String{ 
    let stringArray = self.componentsSeparatedByCharactersInSet(
     NSCharacterSet.decimalDigitCharacterSet().invertedSet) 
    let newString = stringArray.joinWithSeparator("") 

    return newString 
    } 
} 

ho quindi aggiungere il "recipString "variabile per NSURL in th e di seguito il codice:

let messageBody = "test" 
    let urlSafeBody = messageBody.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLHostAllowedCharacterSet()) 

    if let urlSafeBody = urlSafeBody, url = NSURL(string: "sms:/open?addresses=\(recipString)&body=\(urlSafeBody)") { 
     print("FINAL URL: \(url)") 
     WKExtension.sharedExtension().openSystemURL(url) 
    } 

La stampa URL finale mostra la stringa corretta, ma l'applicazione messaggi non si apre correttamente, e mostra menu di risposta rapida, invece di finestra di messaggio composto. Corrisponde esattamente alla versione del numero con codice fisso funzionante, ma si comporta diversamente.

Totalmente perso, spero che qualcuno possa aiutare!

UPDATE 1 Qui ci sono le stampe di debug per entrambe le versioni del URL:

dichiarato manualmente (non creati da recipString ma in realtà dichiarato nella stringa URL esplicitamente):

Questa versione funziona

FINALE URL: sms:/aperti indirizzi = 0000000000,1111111111,2222222222,3333333333,4444444444 & corpo = test

variabile creata (usando recipString):

Questa versione non fa

URL finale: sms:/aperto?indirizzi = 0000000000,1111111111,2222222222,3333333333,4444444444 & body = prova

Ho anche provato applicando codifica URL alla variabile "recipString" utilizzando il sottostante se lasciate:

if let urlSafeRecip = recipString.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet()) { 

     if let urlSafeBody = urlSafeBody, url = NSURL(string: "sms:/open?addresses=\(urlSafeRecip)&body=\(urlSafeBody)") { 
      print("FINAL URL: \(url)") 
      WKExtension.sharedExtension().openSystemURL(url) 
     } 
    } 

UPDATE 2 ho provato a vedere se la versione hardcode dei numeri corrisponde al recipString esattamente tramite questo codice:

let hardCode = "0000000000,1111111111,2222222222,3333333333,4444444444" 

    let isEqual = (hardCode == recipString) 

    if isEqual { 
     print("hardCode matches recipString") 
    } 
    else { 
     print("hardCode does not match recipString") 
    } 

stampe di debug:

hardcode corrisponde recipString

UPDATE 3

mi hanno confermato che:

Quando un URL viene fatta con i numeri codificati duri contro i numeri che ho fare da variabili, il controllo == tra loro restituisce true.

In ogni test che posso fare tra le due versioni dell'URL, corrisponde.

note dopo risposta corretta FOUND:

Questo tipo di formattazione URL funzionerà solo con più indirizzi nell'URL. Se non si dispone di più indirizzi, è necessario eseguire quanto segue, che non è documentato ma funziona in modo indiscriminato. Ho trovato questo colpendo la mia faccia sulla tastiera per ore, quindi se ti aiuta è meritato un upvote :)

segui la risposta indicata sotto, quindi usa questo tipo di controllo logico prima di creare l'URL nel doItButton (funzione) ha ricordato:

func setupAndSendMsg(saveData: NSDictionary) { 
    if let urlSafeBody = createBody(saveData) { 
     let theNumbers = createNumbers(saveData).componentsSeparatedByString(",") 
     print(theNumbers.count-1) 
     if theNumbers.count-1 > 0 { 
      if let url = NSURL(string: "sms:/open?addresses=\(createNumbers(saveData))&body=\(urlSafeBody)") { 
       print(url) 
       WKExtension.sharedExtension().openSystemURL(url) 
      } 
     } else { 
      if let url = NSURL(string: "sms:/open?address=\(createNumbers(saveData)),&body=\(urlSafeBody)") { 
       print(url) 
       WKExtension.sharedExtension().openSystemURL(url) 
      } 
     } 

    } 
} 
+0

Puoi forse condividere esattamente come appaiono gli "URL finali" in entrambi i casi?puoi correggere i numeri – Jack

+0

Sì - Aggiungerò una modifica che mostra i due valori di stampa e un altro formato che ho provato senza successo – Charlie

+0

Inoltre, dove hai trovato questo formato URL di apertura dell'app SMS? Apple ammette ufficialmente 'sms: # - ### - ### - ####' e vedo da qualche parte ppl che dice che puoi fare 'sms: # - ### - ### - #### & body = xxx'. Un'altra cosa strana del tuo URL è se questo fosse davvero uno schema URL valido, perché c'è solo un '/' dopo 'sms: /' e non '//'? – Jack

risposta

2

la mia ipotesi è che non è il acctual openSystemUrl chiamata che è il problema. Credo che ci deve essere qualcosa con il codice che sta costruendo la stringa numerica a livello di codice.

Il codice qui sotto è una versione semplificata di tutto il codice che hai pubblicato. Ho confermato che sta funzionando sul mio Apple Watch. Apre l'app Messaggi con i numeri prepopolati del testo del corpo &.

Dai uno sguardo al codice e vedi se c'è qualcosa che ti manca. Se non riesci a trovare nulla, basta eliminare il codice e riscriverlo, probabilmente sarà più veloce quindi individuando il problema strano.

Ancora una volta il codice sotto è confermato funzionante come previsto, quindi dovresti essere in grado di farlo funzionare. (O semplicemente copiare & incollare il mio codice) :)

class InterfaceController: WKInterfaceController { 

    @IBAction func doItButton() { 
    if let urlSafeBody = createBody() { 
     if let url = NSURL(string: "sms:/open?addresses=\(createNumbers())&body=\(urlSafeBody)") { 
     print(url) 
     WKExtension.sharedExtension().openSystemURL(url) 
     } 
    } 
    } 

    private func createBody() -> String? { 
    let messageBody = "hello test message" 
    return messageBody.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLHostAllowedCharacterSet()) 
    } 

    private func createNumbers() -> String { 
    let numbers = ["(111) 222-3333", "(444) 555-6666"] 
    var tempArray: [String] = [] 
    numbers.forEach { (number: String) in 
     tempArray.append(number.digitsOnly()) 
    } 

    return tempArray.joinWithSeparator(",") 
    }  
} 

extension String { 
    func digitsOnly() -> String{ 
    let stringArray = self.componentsSeparatedByCharactersInSet(
     NSCharacterSet.decimalDigitCharacterSet().invertedSet) 
    let newString = stringArray.joinWithSeparator("") 

    return newString 
    } 
} 

Con sopra detto mi sento di raccomandare di non utilizzare senza documenti di Apple dispone per qualsiasi cosa si ha intenzione di mettere su App Store per i motivi già citati nei commenti.

+0

Dopo aver esaminato il mio codice innumerevoli volte e assicurandomi di "fare effettivamente" le stesse attività mostrate dal codice, non sono riuscito a farlo funzionare. Tuttavia, ho completamente cancellato e rifatto il codice usando le chiamate di funzione per creare le due variabili come hai fatto tu, e ora funziona! Ci deve essere una sorta di differenza di basso livello tra la variabile statica e quella fatta da una funzione ... Indipendentemente GRAZIE! Vorrei sapere perché ha funzionato ora considerando che è quasi identico - o piuttosto perché non ha funzionato per cominciare. – Charlie

+0

Goblin, ne sono sicuro. :) –

+0

E la saga continua - questo non funzionerà se c'è solo un numero di destinatario fornito ** tira fuori i capelli e brucia casa ** – Charlie

Problemi correlati