我要求UIApplication.Shared.Open()
方法在IOS中打开默认的消息应用程序。我已经实现了UserNotification,其中调用了userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { }
方法,我想用这个URL打开默认的Messaging App。
schemeHere = "sms:/open?addresses=1115555648583&body=lllll"
它适用于具有此静态变量的应用程序的所有状态。 i-e .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)
})
}
答案 0 :(得分:0)
经过一段时间的证明,我可以通过以下方式澄清这一点。
首先,之前调用了函数open(URL),因此需要将我的代码放在依赖块中,即使用IOS GCD(Grand Central Dispatch)。
我创建了两个函数并将它们放在dispatch_Group
。
这是我的代码:
// Function A
func functionA_With_Dispatch(identif: String) -> String
{
dispatch_group.enter()
if identif.contains("sms")
{
var numbersH = ""
var messageH = ""
var schemeHere = ""
var chrArr = Array(identif.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!
//Open sms:/open?addresses=1115555648583&body=lllll: true
schemeHere = "sms:/open?addresses=\(numbersH)&body=\(messageH)"
print(schemeHere)
dispatch_group.leave()
return schemeHere
}
dispatch_group.leave()
return "empty"
}
打开网址的其他功能。
func open_URL_With_Dispatch(schemeHere : String)
{
dispatch_group.enter()
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)")
self.dispatch_group.leave()
})
} else {
let success = UIApplication.shared.openURL(url)
print("Open \(schemeHere): \(success)")
dispatch_group.leave()
}
}
else
{
print("Inside Scheme!")
print(schemeHere)
dispatch_group.leave()
}
}
现在在userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { }
,工作就在这里。
注意:dispatch_group
在viewController的顶部声明。
dispatch_group = DispatchGroup()
let notifIdentifier = response.notification.request.identifier
self.reloadEasy()
let schemeHere = self.functionA_With_Dispatch(identif: notifIdentifier)
dispatch_group.wait()
/*
switch response.actionIdentifier {
case "action1":
if MFMessageComposeViewController.canSendText() {
print("SMS services are available")
self.sendMessage(recipients: ["243243"], message: "ewhrewuew")
}
else
{
self.showMessage(message: "Can't send sms!")
print("Can't send sms!")
}
default:
if MFMessageComposeViewController.canSendText() {
print("SMS services are available")
self.sendMessage(recipients: ["243243"], message: "ewhrewuew")
}
else
{
self.showMessage(message: "Can't send sms!")
print("Can't send sms!")
}
} // Message Switch
*/
let state: UIApplicationState = UIApplication.shared.applicationState
if state == .active {
self.showMessage(message: "Active")
//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)
self.open_URL_With_Dispatch(schemeHere: schemeHere)
}
else if state == .background
{
self.showMessage(message: "Background")
//self.open(notifIdentifier: notifIdentifier)
self.open_URL_With_Dispatch(schemeHere: schemeHere)
}
else if state == .inactive
{
self.showMessage(message: "In-Active")
//let schemeHere = "sms:/open?addresses=14085551212,14085552121,14085551221,923155849537&body=/*message*/"
//self.open(notifIdentifier: notifIdentifier)
self.open_URL_With_Dispatch(schemeHere: schemeHere)
}
else
{
self.showMessage(message: "Un-defined State")
//let schemeHere = "sms:/open?addresses=14085551212,14085552121,14085551221,923155849537&body=/*message*/"
//self.open(notifIdentifier: notifIdentifier)
self.open_URL_With_Dispatch(schemeHere: schemeHere)
}
其次,在我这样做之后我发现了另一个问题,我在URL字符串中传递了空格和 newLines ,但现在我已经#& m按以下方式替换整个URL。
for c in messageHere.characters
{
if c == " "
{
appendedMessage.append("%20")
}
else if c == "\n"
{
appendedMessage.append("%0A")
}
else
{
appendedMessage.append(c)
}
}