例:
NSURL(string: "sms:/open?addresses=8888888888,9999999999,3333333333&body=Test")
let hardCode = "8888888888,3333333333" NSURL(string: "sms:/open?addresses=\(hardCode)&body=Test")
详细信息:
我正在使用变量创建一个URL,以便在预装内容的Apple Watch上打开消息.我从联系簿中获取电话号码并将其存储在阵列中.它们以这种格式提供:
(###)### – ####但需要##########
我通过将电话号码硬编码到URL中来测试代码,并且它适用于所有联系人和已完成的正文:
if let urlSafeBody = urlSafeBody,url = NSURL(string: "sms:/open?addresses=8888888888,3333333333&body=\(urlSafeBody)") { print("FINAL URL: \(url)") WKExtension.sharedExtension().openSystemURL(url) }
但是,当我以编程方式构建电话号码值时,它不起作用:
//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 } }
然后我在下面的代码中将“recipString”变量添加到NSURL:
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) }
FINAL URL打印显示正确的字符串,但消息应用程序无法正常打开,并显示快速回复菜单而不是组合消息窗口.它完全匹配功能硬编码数字版本,但行为不同.
完全迷失了,希望有人可以帮忙!
更新1
以下是两个版本的URL的调试打印:
手动声明(不是从recipString创建,而是在URL字符串中明确声明):
这个版本有效
FINAL URL: sms:/open?addresses=0000000000,1111111111,2222222222,3333333333,4444444444&body=test
变量创建(使用recipString):
这个版本没有
FINAL URL: sms:/open?addresses=0000000000,4444444444&body=test
我还尝试通过使用下面的if来将url编码应用于“recipString”变量:
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) } }
更新2
我通过以下代码测试了硬编码版本的数字是否与recipString完全匹配:
let hardCode = "0000000000,4444444444" let isEqual = (hardCode == recipString) if isEqual { print("hardCode matches recipString") } else { print("hardCode does not match recipString") }
调试打印:
hardCode matches recipString
更新3
我已经确认:
当使用硬编码数字和我从变量生成的数字创建URL时,检查它们之间的==返回true.
在每个测试中,我可以在两个版本的url之间进行匹配.
发现正确答案后的说明:
这种类型的URL格式仅适用于URL中的多个地址.如果您没有多个地址,则需要执行以下操作,这些操作未记录,但不会少.我发现这是通过在键盘上砸我的脸几个小时,所以如果它帮助你upVote是值得的:)
按照下面标记的答案,然后使用这种类型的逻辑检查,然后在他提到的doItButton()函数中创建URL:
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) } } } }
解决方法
下面的代码是您发布的所有代码的简化版本.我已经确认它正在我的Apple Watch上运行.它打开消息应用程序,其中包含预先填充的数字和&主体.
再看一下你的代码,看看你是否遗漏了什么.如果你找不到任何东西,只需删除代码并重新编写它,可能会更快,然后发现奇怪的问题.
下面的代码再次确认按预期工作,所以你应该能够让它工作. (或者只是复制并粘贴我的代码):)
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 } }
如上所述,我建议不要将未记录的Apple功能用于您计划放在App Store上的任何内容,原因在于评论中已经提到的原因.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。