時計アプリのスナップショットを追加して 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];
}
}