2017-03-17 3 views
1

IOS에서 기본 메시지 앱을 열려면 UIApplication.Shared.Open() 메서드를 요청하고 있습니다. UserNotification을 구현했으며 userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping() -> Void) { } 메서드가 호출되었으며이 URL과 함께 기본 메시징 응용 프로그램을 열고 싶습니다.사용자 알림이 응답 메소드를 수신 했으므로 업데이트 된 변수를 UIApplication.shared.open()에 전달할 수 없습니까?

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

일부 시연 시간이 지나면 다음과 같은 방법으로이를 명확히 할 수 있습니다.

먼저 함수 열기 (URL)가 호출되었으므로 IOS GCD (Grand Central Dispatch)를 사용하여 종속 블록에 코드를 넣을 필요가있었습니다.

저는 두 가지 기능을 생성하여 dispatch_Group에 넣었습니다. URL을 여는

// 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 문자열에서을 통과 한 경우, 이렇게 후 다른 하나의 문제를 발견했지만, 지금은을 위해 다음과 같은 방법으로 대체하고있어 전체 URL

   for c in messageHere.characters 
       { 
        if c == " " 
        { 
         appendedMessage.append("%20") 
        } 
        else if c == "\n" 
        { 
         appendedMessage.append("%0A") 
        } 
        else 
        { 
         appendedMessage.append(c) 
        } 
       }