WatchConnectivity 文件传输不起作用

WatchConnectivity file transfer not working

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

正如我在(发件人方,即iOS)中看到的那样,文件已成功传输

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

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

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

我终于做到了

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

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

file.fileURL.路径!是这样的

/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

有什么线索吗?

我发现了问题。我正在将一些代码分派到主线程,文件移动代码也在其中。 WC 框架在此方法结束后立即清理文件,因此必须在此函数之前移动文件 returns。我将该代码移到 performInMainThread 块之外,一切正常。

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

正如 WCSessionDelegate Protocol 参考资料的 Apple 文档所说

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

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

The object containing the URL of the file and any additional information. If you want to keep the file referenced by this parameter, you must move it synchronously to a new location during your implementation of this method. If you do not move the file, the system deletes it after this method returns.

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

- (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.

,则必须切换到主队列