微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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 举报,一经查实,本站将立刻删除。