Чтобы добавить функцию моментального снимка WatchOS 3, handleBackgroundTasks и scheduleSnapshotRefreshWithPreferredDate никогда не запускаются

Мне нужно добавить снимок часового приложения, которое будет помещено в Dock, поскольку это новая функция, я не могу найти никаких ресурсов, которые бы мне помогли. Я прочитал документацию Apple https://developer.apple.com/library/prerelease/content/samplecode/WatchBackgroundRefresh/Introduction/Intro.html и реализовал этот код в главном InterfaceController приложения Watch на основе документации Apple: https://developer.apple.com/library/prerelease/content/samplecode/WatchBackgroundRefresh/Introduction/Intro.html но handleBackgroundTasks никогда не вызывается. Я делаю что-то неправильно? я могу иметь скриншот другого InterfaceController вместо основного InterfaceController для размещения в Dock? как?

@interface ExtensionDelegate : NSObject <WKExtensionDelegate>

@property (nonatomic, weak) MainInterfaceController *interfaceController;

@implementation ExtensionDelegate

-(void)applicationDidEnterBackground {

    [self scheduleRefreshBackgroundTask];
    [self scheduleSnapshotRefreshBackgroundTask];
  }

-(void)scheduleRefreshBackgroundTask WK_AVAILABLE_WATCHOS_ONLY(3.0){

// Background Refresh

NSDictionary *backgroundRefreshUserInfo = @{@"reason": @"Bakcground Refresh"};

NSDate *backgroundRefreshDate = [NSDate dateWithTimeIntervalSinceNow:30 * 60];

[[WKExtension sharedExtension] scheduleBackgroundRefreshWithPreferredDate:backgroundRefreshDate
                                                                 userInfo:backgroundRefreshUserInfo
                                                      scheduledCompletion:^(NSError *error){

    if (error == nil) {

        DMLogVerbose(DebugLogTypeWatch, @"successfully scheduled background refresh tesk");

    } else {

        DMLogError(DebugLogTypeWatch, @"unable to schedule background refresh task, error:%@", error);

    }

}];

}

-(void)scheduleSnapshotRefreshBackgroundTask WK_AVAILABLE_WATCHOS_ONLY(3.0){

//fire in 1 hr

NSDate *inputDate = [NSDate date];

NSDate *fireDate = [inputDate initWithTimeIntervalSinceNow:1 * 60 * 60];

//optional.. any sourceCoding compliant data can be passed here

// SnapShot

NSDictionary *userInfo = @{@"reason": @"Snapshot Refresh"};

[[WKExtension sharedExtension] scheduleSnapshotRefreshWithPreferredDate:fireDate
                                                               userInfo:userInfo
                                                    scheduledCompletion:^(NSError *error){

if (error == nil) {
                                                            DMLogVerbose(DebugLogTypeWatch, @"successfully scheduled background tesk, use the crown to send the app to the background and wait for handle:backgroundTasks to fire.");
                   }
 }];

 }

-(void)handleBackgroundTasks:(NSSet<WKRefreshBackgroundTask *> *)backgroundTasks WK_AVAILABLE_WATCHOS_ONLY(3.0) {

for (WKRefreshBackgroundTask *task in backgroundTasks) {

    if ([[WKExtension sharedExtension] applicationState] == WKApplicationStateBackground) {

        // Snapshot
        if ([task isKindOfClass:[WKSnapshotRefreshBackgroundTask class]]) {

            if (self.interfaceController) {

                [self.interfaceController updateData:YES];

                [self.interfaceController initializeDefaultUI];

                [self scheduleSnapshotRefreshBackgroundTask];

            }

        }

        // Connectivity Refresh
        else if ([task isKindOfClass:[WKWatchConnectivityRefreshBackgroundTask class]]) {

            // do something

        }

        // Network (URLSession)
        else if ([task isKindOfClass:[WKURLSessionRefreshBackgroundTask class]]) {

            // Resume download

            NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:[DataManager watchDataURLSessionIdentifier]];

            NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfig
                                                                  delegate:
                                     [TWNDataManager sharedDataManager].currentWatchDataDownloader
                                                             delegateQueue:nil];

            DMLogVerbose(DebugLogTypeWatch, @"Resume watch download session in background:%@", session);

        }
        // Background Refresh
        else if ([task isKindOfClass:[WKApplicationRefreshBackgroundTask class]]){

            NSDictionary *userInfo = [task userInfo];

            NSString *reason = [userInfo objectForKey:@"reason"];

            if ([reason isEqualToString:@"Bakcground Refresh"]) {

                if (self.interfaceController && !self.isBackgroundUpdating) {

                    self.isBackgroundUpdating = YES;

                    [self.interfaceController updateData:YES];

                    self.isBackgroundUpdating = NO;

                    [self scheduleRefreshBackgroundTask];

                }
            }
        }
    }

    [task setTaskCompleted];
}
}

2 ответа

Я переместил код в ExtensionDelegate, теперь он работает правильно для меня. Я обновил код.

У меня та же проблема. Я также протестировал образец кода Apple https://developer.apple.com/library/prerelease/content/samplecode/WatchBackgroundRefresh/Introduction/Intro.html и handle(_:) метод не был вызван. Пока я не перезагружал тренажеры несколько раз, чистил продукт, делал обычные вещи. Затем я заработал, но только один из 30 тестов показал, что метод функционировал должным образом (планирование запроса снимка после завершения загрузки, а затем пробуждение приложения). Я заполнил отчет об ошибке и надеюсь, что это будет исправлено в следующей бета-версии, так как я теряю много времени на тестирование, которое не работает согласно документации.

Другие вопросы по тегам