2

我需要添加要放置在 Dock 中的手表应用程序的快照,因为它是一项新功能,我找不到任何资源来指导我。我已经阅读了 Apple 的文档https://developer.apple.com/library/prerelease/content/samplecode/WatchBackgroundRefresh/Introduction/Intro.html并且我已经根据 Apple 文档在 Watch 应用程序的主 InterfaceController 中实现了此代码: 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];
}
}
4

2 回答 2

1

我将代码移到 ExtensionDelegate 现在它对我来说可以正常工作。我更新了代码。

于 2016-08-02T21:41:00.477 回答
1

我也有同样的问题。我还测试了 Apple 的示例代码https://developer.apple.com/library/prerelease/content/samplecode/WatchBackgroundRefresh/Introduction/Intro.html 并且handle(_:)没有调用该方法。直到我重新启动模拟器几次,清洁产品,做通常的事情。然后我让它工作了,但只有一次 od 30 次测试是该方法正常运行(在完成下载后安排快照请求,然后唤醒应用程序)。我已经填写了一个错误报告,我希望在他们的下一个 beta 版本中看到这个问题,因为我在测试中浪费了很多时间,而这些测试没有按照文档工作。

于 2016-07-25T09:50:47.913 回答