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
有什么线索吗?
- 实际上我正在循环传输 15-20 张图像。
- 有时在不调试的时候我注意到很少有图像(不是全部)显示
在手表模拟器中(也在实际手表中)。我不知道是什么
发生在 WC 上。
- 传输用户信息字典没有问题。
我发现了问题。我正在将一些代码分派到主线程,文件移动代码也在其中。 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.
,则必须切换到主队列
我正在使用 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
有什么线索吗?
- 实际上我正在循环传输 15-20 张图像。
- 有时在不调试的时候我注意到很少有图像(不是全部)显示 在手表模拟器中(也在实际手表中)。我不知道是什么 发生在 WC 上。
- 传输用户信息字典没有问题。
我发现了问题。我正在将一些代码分派到主线程,文件移动代码也在其中。 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.
,则必须切换到主队列