Проблема с передачей файлов WCSession

У меня возникла проблема с отправкой файлов на Apple Watch с родительского устройства. Иногда файл проходит и анализируется полностью. В других случаях он начинает передачу файла, но завершается ошибкой и даже не использует метод session:(WCSession *)session didReceiveFile:(WCSessionFile *)file на Apple Watch.

Вот код родительского устройства:

- (void)sendLiveAudioRecording
{
    NSError *moveError;
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSURL *groupURL = [fileManager containerURLForSecurityApplicationGroupIdentifier: @"group.myCompany.myApp"];
    NSURL *permanentURL = [groupURL URLByAppendingPathComponent: @"PhoneToWatch.mp4"];
    [FileSystem_Helper removeFile: [permanentURL path]];
    [fileManager moveItemAtURL: [self fileURL] toURL: permanentURL error: &moveError];

    if (!moveError)
    {
        if ([WCSession isSupported])
        {
            [[WCSession defaultSession] setDelegate: self];
            [[WCSession defaultSession] activateSession];
            if ([[WCSession defaultSession] isReachable])
            {
                NSLog(@"File Is Being Transferred: %@", [permanentURL path]);
                [[WCSession defaultSession] transferFile: permanentURL metadata: nil];
            }
            else
            {
                [self createAlertWithTitle: @"Error" andMessage: @"WCSession Not Reachable"];
            }
        }
        else
        {
            [self createAlertWithTitle: @"Error" andMessage: @"WCSession Not Supported"];
        }
    }
    else
    {
        NSLog(@"%@", [moveError localizedDescription]);
    }
}

А вот и код Apple Watch:

-(void) session:(WCSession *)session didReceiveFile:(WCSessionFile *)file
{
    NSData *fileData = [NSData dataWithContentsOfURL: [file fileURL]];
    WKAudioFileAsset *asset = [WKAudioFileAsset assetWithURL: [file fileURL]];
    NSURL *fileLocation = [FileSystem_Helper writeAudioToAppGroupsWithData: fileData withName: @"FromPhone.mp4"];
    NSLog(@"%@", [file fileURL]);
    NSLog(@"%@", [fileLocation path]);

    [FileSystem_Helper removeFile: [[file fileURL] path]];

    NSError *writingError;
    if (!writingError)
    {
        [self playURL: fileLocation withDuration: [asset duration]];
    }
    else
    {
        [WKAlertViewController_Helper showWKAlertControllerWithTitle: @"Audio Receive Failed" andMessage: [writingError localizedDescription] andButtonTitle: @"Ok" onController: self];
    }
}

Я даже не уверен, что это как-то связано с самим кодом. Я думаю, что передача файла иногда терпит неудачу, но я не могу найти нигде, чтобы распечатать ошибку для отладки.

Может ли кто-нибудь дать мне некоторое представление здесь?

iOS 9.2 && WatchOS 2.1

Вот код из [FileSystem_Helper removeFile: (NSString *)filePath]:

+ (void) removeFile: (NSString *)filePath
{
     NSFileManager *fileManager = [NSFileManager defaultManager];
     if ([fileManager fileExistsAtPath: filePath])
     { 
          NSError *error; 
          if (![fileManager removeItemAtPath: filePath error:&error]) 
          {
                NSLog(@"Error removing file: %@", error); 
          } 
     }
}

А вот [FileSystem_Helper writeAudioToAppGroupsWithData]:

+ (void)writeAudioToAppGroupsWithData: (NSData *)audioData withName: (NSString *)name
{
    // Writing the audio data to the App Groups
    NSURL *URL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier: @"group.myCompany.myApp"];
    NSURL *containerURL = [URL URLByAppendingPathComponent: name];
    [audioData writeToURL: containerURL atomically: YES];
}

person S. Stark    schedule 11.01.2016    source источник
comment
Вызывается ли обратный вызов делегата didTransferFile на стороне отправки, когда передача не удалась? Если да, то какая ошибка?   -  person ccjensen    schedule 11.01.2016
comment
@ccjensen Делегат didTransferFile вызывается каждый раз, когда файл получен на стороне наблюдения или нет. Хотя я, возможно, пытаюсь использовать оператор if в didTransferFile следующим образом: if([fileTransfer] file]){ NSLog(@SUCCESS); else { NSLog(@FAILED)} но тут не повезло.   -  person S. Stark    schedule 11.01.2016
comment
Я готовлюсь написать свой ответ, но хотел проверить, что делает [FileSystem_Helper removeFile:]? Не могли бы вы опубликовать его код?   -  person ccjensen    schedule 11.01.2016
comment
@ccjensen код именно то, что сказал Джуд, но я исправил дополнительную точку с запятой после оператора if, и проблема все еще существует. Смотрите обновленный вопрос, чтобы следовать.   -  person S. Stark    schedule 11.01.2016
comment
Как я уже сказал, это работает примерно в 50% случаев. Буквально каждый раз, когда я запускаю эти команды, на часах воспроизводится звук.   -  person S. Stark    schedule 12.01.2016
comment
когда вызывается didFinishFileTransfer, а файл не поступает на часы, есть ли ненулевая NSError? Если да, то в чем ошибка?   -  person ccjensen    schedule 12.01.2016
comment
@ccjensen Нет, в методе делегата didFinishFileTransfer нет ошибки.   -  person S. Stark    schedule 12.01.2016
comment
Похоже на баг ОС. Вы отправили отчет об ошибке в Apple? Отлично, если бы вы могли опубликовать здесь номер радара на случай, если инженеры Apple наткнутся на него.   -  person ccjensen    schedule 12.01.2016
comment
@ccjensen Я отредактировал вопрос, чтобы отобразить содержимое используемых вспомогательных методов.   -  person S. Stark    schedule 12.01.2016
comment
@ccjensen радар #: 24143290   -  person S. Stark    schedule 12.01.2016


Ответы (1)


Передача файлов глючит на watchOS 2.2. Это может быть исправлено в следующем релизе. Дополнительные свидетельства см. на странице https://forums.developer.apple.com/thread/43596. .

person Ben G    schedule 29.04.2016