如果 iPhone App 处于非活动状态,是不是可以响应通过 Apple Watch 传输的文件?

Posted

技术标签:

【中文标题】如果 iPhone App 处于非活动状态,是不是可以响应通过 Apple Watch 传输的文件?【英文标题】:Can the iPhone App respond to file transferred via Apple watch if it is inactive?如果 iPhone App 处于非活动状态,是否可以响应通过 Apple Watch 传输的文件? 【发布时间】:2018-04-09 11:22:45 【问题描述】:

我正在开发一个 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】:

documentation on transferFile(_:metadata:) 明确指出:

使用此方法发送当前设备的本地文件。 文件异步传输到对方 后台线程。系统尝试尽可能快地发送文件 可能,但可能会限制交付速度以适应性能 和权力问题。使用优秀的FileTransfers 方法获取一个 排队等待交付但尚未交付的文件列表 交付给对方。

...

这个方法只能在会话处于活动状态时调用——也就是说, activationState 属性设置为已激活。调用此方法 对于非活动或停用的会话是程序员错误。

所以根据你的代码:

if ([WCSession isSupported]) 
   if ([self.watchSession isReachable]) 
         [self.watchSession transferFile:outputURL metadata:nil];
   

如果isSupportedisReachable 检查失败,则基本上WCSession 处于非活动状态,您的代码将无法到达transferFile(_:metadata:) 部分。 这是正确的行为,您必须手动处理这种情况。

但是...当您有一个有效会话并且确实调用了transferFile(_:metadata:) 时,那么无论 iPhone 是否被锁定,或者应用程序处于后台,或者即使应用程序没有运行,它将通过后台线程接收文件。

所以要回答您的问题,如果 iPhone 应用程序“不活动”;如isReachable 为 false 则不会发生文件传输。


参考:

https://developer.apple.com/documentation/watchconnectivity/wcsession/1615667-transferfile

【讨论】:

以上是关于如果 iPhone App 处于非活动状态,是不是可以响应通过 Apple Watch 传输的文件?的主要内容,如果未能解决你的问题,请参考以下文章

检测应用程序处于后台/非活动状态时是不是触发了本地通知

当应用程序处于非活动状态时可以接收 UIAccelerometer 更新吗?

使用搜索栏时无法使表格视图处于非活动状态。苹果手机

C Windows API 确定用户是不是处于非活动状态,包括播放媒体

了解应用程序在 cocoa mac OSX 中是不是处于非活动状态的最佳方法?

iOS 7+ 应用程序处于非活动状态时是不是可以通过网络发送数据?