2017-03-17 6 views
1

私はUIApplication.Shared.Open()メソッドをIOSのデフォルトメッセージアプリケーションを開くように頼んでいます。私は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

いくつかの実証済みの時間を経て、これを次のようにして明確にすることができます。

まず、関数open(URL)が呼び出されたので、IOS GCD(Grand Central Dispatch)を使用して、依存ブロック、つまりi-eに自分のコードを配置する必要がありました。

私は2つの関数を作成し、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) 
        } 
       } 
関連する問題