iPhone应用程序是否可以响应通过Apple手表传输的文件?

时间:2018-04-09 11:22:46

标签: ios objective-c apple-watch wcsession

我正在开发一个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处于后台/非活动状态/处于锁定状态时,如何使其工作?

1 个答案:

答案 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,则不会发生文件传输。

价: