我正在开发一个Apple Watch应用程序,它记录一个音频文件,保存它,然后通过WCSession(Watch Connectivity框架)将文件URL传输到iPhone应用程序。我的代码看起来像这样
在InterfaceController.m
NSURL *directory = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.name.watchtest"];
__block NSString *recordingName = @"myTestFile.mp4";
__block NSURL * outputURL = [directory URLByAppendingPathComponent:recordingName];
if ([WCSession isSupported]) {
if ([self.watchSession isReachable]) {
[self.watchSession transferFile:outputURL metadata:nil];
}
}
在ViewController.m (WCSession委托)
-(void)session:(WCSession *)session didReceiveFile:(WCSessionFile *)file
{
NSError *error;
NSArray *dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask, YES);
NSString *docsDir = [dirPaths objectAtIndex:0];
NSFileManager *filemgr = [NSFileManager defaultManager];
NSString *filePath = [docsDir stringByAppendingString:@"/myTestFile.mp4"];
[filemgr moveItemAtPath:file.fileURL.path toPath:filePath error:&error];
if ([filemgr fileExistsAtPath:file.fileURL.path]) {
urlOfAudioFile = [[NSURL alloc] initFileURLWithPath:filePath];
[self uploadToServer:urlOfAudioFile];
}
}
如果WatchApp和& iPhone应用程序处于活动状态。
当iPhone处于后台/非活动状态/处于锁定状态时,如何使其工作?
答案 0 :(得分:2)
documentation on transferFile(_:metadata:)
明确指出:
使用此方法发送当前设备本地的文件。 文件在a上异步传输到对应文件 背景线程。系统尝试尽快发送文件 可能但可以限制输送速度以适应性能 和电力问题。使用outstandingFileTransfers方法获取 排队等待交付但尚未交付的文件列表 交付给对方。
...
此方法只能在会话处于活动状态时调用 - 即 activationState属性设置为激活。调用此方法 对于非活动或停用的会话,程序员错误。
根据您的代码:
if ([WCSession isSupported]) {
if ([self.watchSession isReachable]) {
[self.watchSession transferFile:outputURL metadata:nil];
}
}
如果isSupported
& isReachable
检查失败,基本上WCSession
处于非活动状态,您的代码无法到达transferFile(_:metadata:)
部分。
这是正确的行为,您必须手动处理此案例。
但是...... 当你有一个有效的会话并且transferFile(_:metadata:)
被调用时,那么iPhone是否被锁定,或者应用程序是否处于后台,或者即使应用程序不是运行时,它将通过后台线程接收文件。
所以要回答你的问题,如果iPhone应用程序是“无效”;如在isReachable
中为false,则不会发生文件传输。
价: