【问题标题】:watchOS 2.0 - Can't cancel WCSessionFileTransferwatchOS 2.0 - 无法取消 WCSessionFileTransfer
【发布时间】:2015-12-26 09:11:27
【问题描述】:

我们的应用程序允许用户在 iPhone 上选择他们希望在手表应用程序中显示的记录。

它是这样工作的:

  1. 用户在 iPhone 上点击记录上的“添加到观看”
  2. 新版本的手表数据库生成并发送给手表
  3. 手表应用接收并保存文件并更新其界面

一个新的数据库文件被发送到手表并针对每次更改进行处理。如果手表是醒着的,这很好,因为它会给用户实时更新,但如果手表在用户进行 7 次更改时处于睡眠状态,这意味着手表一醒来就接受并处理 7 个新文件。

我们真的只关心手表数据库的最新版本,所以我正在尝试取消所有旧的未完成文件传输。


代码:

在 iPhone 上,每次从手表数据库中添加/删除记录时,我们都会尝试(不成功)取消挂起的文件传输,然后将最新的数据库文件排队:

// create watch database and store it at self.urlToDatabase
[self generateNewWatchDatabase];

if ([WCSession isSupported])
{
    WCSession *session = [WCSession defaultSession];
    session.delegate = self;
    [session activateSession];

    // this is the problem - cancel doesn't seem to do anything
    for (WCSessionFileTransfer *fileTransfer in session.outstandingFileTransfers)
        [fileTransfer cancel];

    [session transferFile:self.urlToDatabase metadata:nil]; 
}

在上面的代码中,调用[fileTransfer cancel]成功地从session.outstandingFileTransfers中移除了WCSessionFileTransfer对象,但是下面仍然多次调用didReceiveFile

在手表上接受文件:

- (void)session:(WCSession *)session didReceiveFile:(WCSessionFile *)file
{
    // this method gets called once for every time -transferFile:metadata: is called above,
    // even after cancelling outstanding file transfers
    [self replaceDatabaseWithFile:file];
    [self refreshItemsTable];
}

我们如何取消未完成的文件传输?

编辑

根据@ccjensen 的建议,我在用户向手表添加/删除记录时触发的方法中尝试了以下操作:

// store a reference to the file transfer and immediately cancel it
WCSessionFileTransfer *transfer = [session transferFile:self.urlToDatabase metadata:nil];
[transfer cancel];

这仍然会导致文件被发送到手表,而不是像预期的那样取消它。

我还尝试了以下方法:

  1. 杀死手表应用(按住侧边按钮直到出现“关机”,然后再次按住)
  2. 从 iPhone 添加/删除记录
  3. 重新启动手表应用

即使在这种情况下,手表也会收到所有“取消”的文件传输。

【问题讨论】:

    标签: ios iphone watchkit apple-watch watchos-2


    【解决方案1】:

    取消方法的documentation 表示:

    使用此方法在文件传输完成之前取消它。如果文件已经传输完毕,调用该方法无效。

    所以听起来取消是“尽力而为”,并且最终可能无法在所有情况下取消它们,尤其是在文件已经传输的情况下。

    您是否发现它永远不起作用,即使您立即调用取消(尝试在不运行手表应用程序的情况下进行测试,因为这似乎加快了传输速度)?

    【讨论】:

    • 感谢您的帮助@ccjensen。我尝试立即取消文件传输并终止手表应用程序,但均未成功。我刚刚更新了问题的详细信息。
    【解决方案2】:

    原来这行得通的原因是文件 url 与我正在检查的传输 url 不匹配?

    我最近发现,在我自己的数组中保留 WCSessionFileTransfer 并取消它们证明比使用 [WCSession defaultSession].outstandingFileTransfers 更可靠。

    NSMutableArray<WCSessionFileTransfer*>* inProgressTransfers = [NSMutableArray array];
    

    所以每次调用TransfeFile:metaData:

    WCSessionFileTransfer* transfer = [[WCSession defaultSession] transferFile:url metadata:metadata];
    if (transfer)
    { 
        [self.inProgressTransfers addObject:transfer];
    }
    

    然后在适当的时候

    for (WCSessionFileTransfer* ourTransfer in  self.inProgressTransfers)
    {
        [ourTransfer cancel];
        [self.inProgressTransfers removeObject:ourTransfer];
    }
    

    出于某种原因,我们自己保持传输使调用取消工作更加可靠..希望对某人有所帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-30
      • 1970-01-01
      • 1970-01-01
      • 2018-02-25
      • 2019-12-27
      • 2020-07-26
      • 1970-01-01
      • 2023-03-30
      相关资源
      最近更新 更多