WCSession 将文件从 Watch 传输到后台的 iOS

问题描述

我试图每 15 分钟将文件从手表发送到 iOS。核心运动数据将保存在手表中的文件中,手表每 15 分钟将其发送到 iOS。手表和 iOS 应用程序都在后台。因此,我通过调用 sendMessage 和 replyHandler 来激活 iOS 应用程序,调用 transferFile 将文件发送到 iOS。如果手表在前台它工作正常,当手表在后台发送消息被 iOS 接收但 transferFile 不起作用时。只有当手表应用程序进入前台时,它才会将文件发送到 iOS。

手表端代码

func transferMotionDataFile() {

        self.accessQueue.async {
            sendFileToiOSApp
        }
}

func sendFileToiOSApp () {

    guard isSessionActive() else {
        print("\(#function): Session not activated")
        return
    }
    
    if (session.isReachable) {
        /* Sending log message along with activate message*/
        let message = getActivateMessage()
        self.session.sendMessage(message,replyHandler: { replyMessage in
            let metaData = [WC_KEY.FILENAME: self.fileSentToServer[0].lastPathComponent]
            self.fileTransferSession = self.session.transferFile(self.fileSentToServer[0],metadata: metaData)
            print ("\(#function): iphone activated,transferring file")
            UserDefaults.standard.set(true,forKey: UD_KEY.WATCH_AWAITING_RESP)
       },errorHandler: { error in
            print ("Error reaching iOS,Retrying..")
            let err = error as! WCError
            if (err.code != WCError.Code.notReachable) {  /* wait till reachability status change*/
                DispatchQueue.main.async {
                    self.sendFileToApp()
                }
            }
        })
    }
}

iOS 端代码

func session(_ session: WCSession,didReceiveMessage message: [String : Any],replyHandler: @escaping ([String : Any]) -> Void) {

    let msgKey = message[WC_KEY.MESSAGEKEY] as! String
    print ("\(#function): for \(msgKey)")
    if (msgKey == WC_KEY.ACTIVATE) {
        let replyMessage: [String: Any] = [WC_KEY.STATUS: WC_KEY.ACTIVATED]
        replyHandler (replyMessage)
    }
}

func session(_ session: WCSession,didReceive file: WCSessionFile) {
    print ("\(#function): \(file.fileURL.lastPathComponent)")
   
    let destFile = FileUtility.getUrl(file.fileURL)
    if (FileUtility.moveFile(from: file.fileURL,to: destFile)) {
        print ("\(#function): Move to \(destFile.absoluteString)")
        self.accessQueue.async  {
        //Processing the file
        }
    }
}

accessQueue 是创建为的串行队列 let accessQueue = DispatchQueue (label: "xxxxxAccessQueue",qos: .default)

我也尝试过使用 dispatch queue main。

如何在后台观看时发送文件?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)