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)
}
}
}
}
Puoi forse condividere esattamente come appaiono gli "URL finali" in entrambi i casi?puoi correggere i numeri – Jack
Sì - Aggiungerò una modifica che mostra i due valori di stampa e un altro formato che ho provato senza successo – Charlie
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