2016-11-03 3 views
0
나는 마지막으로 다음과 같이 배경 URL 세션 작업을 시작하기 위해 내 WatchOS3 코드를 얻을 수 있었다 (나는 과거의 일을 본 적이 샘플 코드 "응용 프로그램 작업이받은 URL 세션을 시작을"무시) 한

:WatchOS 3 WKApplicationRefreshBackgroundTask didReceiveChallenge

func handle(_ backgroundTasks: Set<WKRefreshBackgroundTask>) { 

    for task in backgroundTasks { 
     if let refreshTask = task as? WKApplicationRefreshBackgroundTask { 
      // this task is completed below, our app will then suspend while the download session runs 
      print("application task received, start URL session") 

      let request = self.getRequestForRefresh() 
      let backgroundConfig = URLSessionConfiguration.background(withIdentifier: NSUUID().uuidString) 
      backgroundConfig.sessionSendsLaunchEvents = true 
      backgroundConfig.httpAdditionalHeaders = ["Accept":"application/json"] 
      let urlSession = URLSession(configuration: backgroundConfig, delegate: self, delegateQueue: nil) 
      let downloadTask = urlSession.downloadTask(with: request) 

      print("Dispatching data task at \(self.getTimestamp())") 
      downloadTask.resume() 

      self.scheduleNextBackgroundRefresh(refreshDate: self.getNextPreferredRefreshDate()) 
      refreshTask.setTaskCompleted() 
     } 
     else if let urlTask = task as? WKURLSessionRefreshBackgroundTask { 
      //awakened because background url task has completed 
      let backgroundConfigObject = URLSessionConfiguration.background(withIdentifier: urlTask.sessionIdentifier) 
      self.backgroundUrlSession = URLSession(configuration: backgroundConfigObject, delegate: self, delegateQueue: nil) //set to nil in task:didCompleteWithError: delegate method 

      print("Rejoining session ", self.backgroundUrlSession as Any) 
      self.pendingBackgroundURLTask = urlTask //Saved for .setTaskComplete() in downloadTask:didFinishDownloadingTo location: (or if error non nil in task:didCompleteWithError:) 

     } else { 
      //else different task, not handling but must Complete all tasks (snapshot tasks hit this logic) 
      task.setTaskCompleted() 
     } 
    } 
} 

그러나, 지금보고하고있는 문제는 내 대리자 메서드가 urlSession:task:didReceiveChallenge: 충돌되고 있지 않습니다, 그래서 내 다운로드가 완료 될 때까지 얻을 수 있다는 것입니다. (또한 세션 수준 urlSession : didReceiveChallenge : delegate 메서드를 추가했으며 또한 적중되지 않았습니다.)

대신 나는 즉시 오류가 내 task:didCompleteWithError: 대리자 메서드 명중 :.

"이 서버에 대한 인증서가 유효을 당신은 당신의 기밀을 넣을 수있는 ... 척하는 서버에 연결할 수 있습니다 정보 위험에. "

백그라운드 URL 세션 중에 didReceiveChallenge 메서드를 사용하는 추가 요구 사항을 사용하기 위해 백그라운드 감시 업데이트를받은 사람이 있습니까?

제공 할 수있는 도움이나 조언을 보내 주시면 감사하겠습니다.

+0

BTW이 코드는 유효하지 않은 인증서 오류가 발생하지 않는 프로덕션 상자에서 백그라운드 새로 고침을 위해 잘 작동합니다. (Xcode 8.1 with WatchOS3) – CodenameDuchess

+0

이것은 실제로 작동합니까? 다운로드가 완료되면 WKURLSessionRefreshBackgroundTask가 수신됩니까? – ian

+0

네,이게 우리에게 효과적입니다. 세션을 만들 때 자신을 위임자로 지정해야합니다. 또한 WKURLSessionRefreshBackgroundTask 블록이 필요하다는 점에 유의하십시오 (중단 점으로 충돌하지 않을 수도 있음). 해당 블록에서 작업을 완료하지 말고 해당 블록을 잡고 완료 한 후 didFinishDownloadingTo 또는 didCompleteWithError 대리자 메서드 논리를 완료 한 후에 작업을 완료하십시오. – CodenameDuchess

답변

0

실제로 서버 인증서 오류는 우리 테스트 환경에서 드문 시나리오 때문이었습니다. 백엔드 사람들이 그 문제에 대한 해결책을 제시 한 후에이 코드는 우리의 프로덕션 환경과 테스트 환경 모두에서 잘 작동했습니다.

나는 결코 urlSession:task:didReceiveChallenge:에 닿지 않았지만, 나는 그것을 필요로하지 않았다.

사소한 해제와 관련된 변화를 만들어 : 나는 downloadTask:didFinishDownloadingTo location:에 충돌하기 전에 인쇄/중단없이
나는 때때로 MS처럼 task:didCompleteWithError Error:을 타격했다.

그래서 대신 downloadTask:didFinishDownloadingTo location:에 self.pendingBackgroundURLTask를 설정했습니다. 오류가 발생하면 task:didCompleteWithError Error:으로 완료했습니다! = nil.

func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) { 

    //Complete task only if error, if no error it will be completed when download completes (avoiding race condition) 
    if error != nil { 
     self.completePendingBackgroundTask() 
    } 

} 

func completePendingBackgroundTask() 
{ 
    //Release the session 
    self.backgroundUrlSession = nil 

    //Complete the task 
    self.pendingBackgroundURLTask?.setTaskCompleted() 
    self.pendingBackgroundURLTask = nil 
} 

다른 사람이 도움이되기를 바랍니다.

+1

그래서'invalidateAndCancel()'을 사용하지 않습니까? – francisaugusto

+1

아니요, 그렇다고해서 backgroundUrlSession을 nil로 설정하기 전에 추가하는 것이 좋습니다. – CodenameDuchess