我正在询问UIApplication.Shared.Open()
在 IOS 中打开默认消息应用程序的方法。我已经实现了 UserNotification,在哪里和userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { }
方法被调用,我想用这个 URL 打开默认的消息应用程序。
schemeHere = "sms:/open?addresses=1115555648583&body=lllll"
它适用于具有此静态变量的应用程序的所有状态。即.active .background .inactive
。
当通过某种逻辑我试图schemeHere
为每个通知提供更新的值时,就会出现问题。
该程序不接受更新的值。这是我偏好的完整代码。
// For handling tap and user actions
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
self.reloadEasy()
//let networkInfo = CTTelephonyNetworkInfo()
//let carrier = networkInfo.subscriberCellularProvider
// Get carrier name
var countryCodeH = ""
if let countryCode = (Locale.current as NSLocale).object(forKey: .countryCode) as? String {
print(countryCode)
countryCodeH = self.phoneCodes[countryCode]!
}
//var numbersH = ""
//var messageH = ""
//var schemeHere = ""
let notifIdentifier = response.notification.request.identifier
print(notifIdentifier)
if notifIdentifier.contains("sms")
{
//open(scheme: schemeHere)
/*
var chrArr = Array(notifIdentifier.characters)
chrArr.removeFirst()
chrArr.removeFirst()
chrArr.removeFirst()
notifIdentifier = String(chrArr)
var fullNameArr = notifIdentifier.characters.split{$0 == "_"}.map(String.init)
let numbers = fullNameArr[1]
messageH = fullNameArr[2]
numbersH.removeAll()
for c in numbers.characters
{
if c != " "
{
numbersH.append(c)
}
}
print(messageH)
print(numbersH)
// "sms:/open?addresses=1-408-555-1212,1-408-555-2121,1-408-555-1221&body=/*message*/"
//sms:/open?addresses=(555)564-8583&body=/*No Bofy*/
schemeHere = "sms:/open?addresses=1" + numbersH + "&body=" + messageH
//schemeHere1-408-555-1212,1-408-555-2121,1-408-555-1221, = "sms:/open?addresses=542-342-3423,23232323&body=/*No Bofy*/"
schemeHere = "sms:/open?addresses=5555648583&body=lllll"
*/
let state: UIApplicationState = UIApplication.shared.applicationState
if state == .active {
self.showMessage(message: "Active \(countryCodeH)")
//let schemeHere = "sms:/open?addresses=1-408-555-1212,1-408-555-2121,1-408-555-1221,92-315-5849537&body=/*message*/"
self.open(notifIdentifier: notifIdentifier)
}
else if state == .background
{
self.showMessage(message: "Background \(countryCodeH)")
self.open(notifIdentifier: notifIdentifier)
}
else if state == .inactive
{
self.showMessage(message: "In-Active \(countryCodeH)")
//let schemeHere = "sms:/open?addresses=14085551212,14085552121,14085551221,923155849537&body=/*message*/"
self.open(notifIdentifier: notifIdentifier)
}
else
{
self.showMessage(message: "Un-defined State \(countryCodeH)")
//let schemeHere = "sms:/open?addresses=14085551212,14085552121,14085551221,923155849537&body=/*message*/"
self.open(notifIdentifier: notifIdentifier)
}
}
}
这是被调用的函数。
func open(notifIdentifier: String) {
DispatchQueue.main.async(execute: { () -> Void in
var numbersH = ""
var messageH = ""
var schemeHere = "http://stackoverflow.com/questions/23253175/how-to-tell-if-blocks-in-loop-all-have-completed-executing"
//open(scheme: schemeHere)
var chrArr = Array(notifIdentifier.characters)
chrArr.removeFirst()
chrArr.removeFirst()
chrArr.removeFirst()
let notifIdentifierSecond = String(chrArr)
var fullNameArr = notifIdentifierSecond.characters.split{$0 == "_"}.map(String.init)
let numbers = fullNameArr[1]
messageH = fullNameArr[2]
numbersH.removeAll()
for c in numbers.characters
{
if c != " "
{
numbersH.append(c)
}
}
print(messageH)
print(numbersH)
// "sms:/open?addresses=1-408-555-1212,1-408-555-2121,1-408-555-1221&body=/*message*/"
//sms:/open?addresses=(555)564-8583&body=/*No Bofy*/
schemeHere = "sms:/open?addresses=1" + numbersH + "&body=" + "Wanted to Inform You!"
//schemeHere1-408-555-1212,1-408-555-2121,1-408-555-1221, = "sms:/open?addresses=542-342-3423,23232323&body=/*No Bofy*/"
//sms:/open?addresses=15555648583&body=Wanted to Inform You!
//schemeHere = "sms:/open?addresses=1115555648583&body=lllll"
let deadlineTime = DispatchTime.now() + .seconds(1)
DispatchQueue.main.asyncAfter(deadline: deadlineTime) {
print(schemeHere)
let when = DispatchTime.now() + 2 // change 2 to desired number of seconds
DispatchQueue.main.asyncAfter(deadline: when) {
// Your code with delay
if let url = URL(string: schemeHere) {
print("Inside URL")
if #available(iOS 10, *) {
print("Now Doing in IOS 10.")
UIApplication.shared.open(url, options: [:],
completionHandler: {
(success) in
print("Open \(schemeHere): \(success)")
})
} else {
let success = UIApplication.shared.openURL(url)
print("Open \(schemeHere): \(success)")
}
}
else
{
print("Inside Scheme!")
print(schemeHere)
}
}
print("test")
}
// UIApplication.shared.open(NSURL(string: schemeHere) as! URL, options: [:], completionHandler: nil)
})
}