如果 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];
如果isSupported
和isReachable
检查失败,则基本上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 确定用户是不是处于非活动状态,包括播放媒体