2015-09-28 29 views
0

我正在使用WatchConnectivity将图像从iOS传输到Watch OS。当在模拟器调试,我面临的一个问题WatchConnectivity文件传输不起作用

文件传输成功,因为我可以看到(发送方即iOS版)

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

现在在Xcode我停下来的iOS模拟器,改变目标看应用, Ctrl + Run观看应用程序(只运行,不生成)。调用下面的方法。

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发生的 。
  • 传送用户信息字典没有问题。

回答

6

我发现了这个问题。我正在调度一些代码给主线程,文件移动代码也在里面。 WC框架在此方法结束后立即清理文件,以便在此函数返回之前必须移动该文件。我在performInMainThread块之外移动该代码,并且所有内容都像魅力一样工作。

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

你应该将此标记为正确答案 – ccjensen

+0

因此让我明天只标记它正确的答案:) – msk

+1

有同样的问题,因为最初接收文件后xCode抱怨我更新表不在主队列中,然后在我移动代码,得到错误说“无法找到文件”。感谢大家指出这一点! –

-2

由于WCSessionDelegate Protocol参考的苹果文件说,关于

- (空)会话:(WCSession *)会议didReceiveFile:找回了(WCSessionFile时(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,则必须切换到主队列。

+0

这不能保证能正常工作,因为您在读取文件之前从该方法返回(此时系统可以在任何时候删除该文件)。此外,你假设文件很小,并且可以在没有应用程序获取的情况下适应内存,这并不总是如此。最后,你基本上正在创建一个文件副本,这比文件系统移动更有效。 – ccjensen

+0

它保证,因为这个版本在真正的应用程序总是工作,但其他有时是的,有时不。尝试一下。 – BootMaker