WatchConnectivity文件传输无法正常工作

时间:2015-09-28 17:50:07

标签: ios watch-os-2

我正在使用WatchConnectivity将图像从iOS传输到Watch OS。在模拟器中调试时我遇到了问题

我可以在(发件人方面,即iOS)中看到该文件成功传输

public func session(session: WCSession, didFinishFileTransfer fileTransfer: WCSessionFileTransfer, error: NSError?)

现在从XCode我停止iOS模拟器,将目标更改为Watch App,Ctrl + Run Watch App(只运行,不构建)。调用以下方法。

public func session(session: WCSession, didReceiveFile file: WCSessionFile) 

最后我做了

NSFileManager.defaultManager().moveItemAtURL(file.fileURL, toURL: destinationFileURL)

此调用抛出,因为file.fileURL上没有文件(我也在我的MAC中检查过)。

file.fileURL.path!就像这样

/Users/<user name>/Library/Developer/CoreSimulator/Devices/DAD8E150-BAA7-43E0-BBDD-58FB0AA74E80/data/Containers/Data/PluginKitPlugin/2CB3D46B-DDB5-480C-ACF4-E529EFBA2657/Documents/Inbox/com.apple.watchconnectivity/979DC929-E1BA-4C24-8140-462EC0B0655C/Files/EC57EBB8-827E-487E-8F5A-A07BE80B3269/image

任何线索?

  • 实际上我正在循环传输15-20张图像。
  • 有些时候没有调试我注意到很少有图像(不是全部)显示 在手表模拟器(也在实际手表)。我不知道是什么 发生在WC。
  • 转移用户信息词典没问题。

2 个答案:

答案 0 :(得分:6)

我发现了问题。我正在向主线程发送一些代码,文件移动代码也在其中。 WC框架在此方法结束后立即清理文件,因此必须在此函数返回之前移动该文件。我将该代码移到performInMainThread块之外,一切都像魅力一样。

public func session(session: WCSession, didReceiveFile file: WCSessionFile) 
{
   // Move file here
   performInMainThread { () -> Void in
         // Not here   
   }
}

答案 1 :(得分:-2)

正如WCSessionDelegate Protocol参考文献中关于

的Apple文档所述

- (void)session:(WCSession *)session didReceiveFile:(WCSessionFile *)file

获取(WCSessionFile *)文件参数时:

  

包含文件URL和任何其他内容的对象   信息。如果要保留此引用的文件   参数,您必须在此期间将其同步移动到新位置   你实现这个方法。如果你不移动文件,那么   系统在此方法返回后删除它。

所以最好尽快将它移到新的位置。它是安全的,因为系统保留了引用,并且在移动过程中不会删除它。

- (void)session:(WCSession *)session didReceiveFile:(WCSessionFile *)file {

    NSError *error;
    NSFileManager *fileManager = [NSFileManager defaultManager];

    NSString *cacheDir = [[NSHomeDirectory() stringByAppendingPathComponent:@"Library"] stringByAppendingPathComponent:@"Caches"];
    NSURL *cacheDirURL = [NSURL fileURLWithPath:cacheDir];

    if ([fileManager moveItemAtURL: file.fileURL toURL:cacheDirURL error: &error]) {

       //Store reference to the new URL or do whatever you'd like to do with the file
       NSData *data = [NSData dataWithContentsOfURL:cacheDirURL];

    }

    else {

       //Handle the error
    }

}

警告!您必须小心处理线程,因为WCSession的委托在后台队列中运行,因此如果您想使用UI,则必须切换到主队列。