我正在使用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
任何线索?
答案 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,则必须切换到主队列。