2

새로운 기능이므로 Dock에 배치 할 시계 응용 프로그램의 스냅 샷을 추가해야합니다. 가이드 리소스가 없습니다. Apple의 설명서 https://developer.apple.com/library/prerelease/content/samplecode/WatchBackgroundRefresh/Introduction/Intro.html을 읽었으며 Apple 설명서에 기반한 Watch 응용 프로그램의 기본 InterfaceController에서이 코드를 구현했지만 handleBackgroundTasks는 호출되지 않습니다. https://developer.apple.com/library/prerelease/content/samplecode/WatchBackgroundRefresh/Introduction/Intro.html . 내가 뭔가 잘못하고 있는거야? 기본 InterfaceController가 아닌 Dock에있는 다른 InterfaceController의 스크린 샷을 사용할 수 있습니까? 방법?WatchOS 3 스냅 샷 기능을 추가하려면 handleBackgroundTasks 및 scheduleSnapshotRefreshWithPreferredDate가 실행되지 않습니다.

@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]; 
} 
} 
+0

동일한 문제가 있습니다. Apple의 샘플 코드도 테스트했습니다 https://developer.apple.com/library/prerelease/content/samplecode/WatchBackgroundRefresh/Introduction/Intro.html – Chiara

+0

많은 도움이되었습니다. 공유 해줘서 고마워! – Mona

답변

1

동일한 문제가 있습니다. Apple및 handle(_:) 메서드도 테스트하지 않았습니다. 몇 번이나 시뮬레이터를 다시 시작하기 전까지는 제품을 청소하고 일반적인 것들을했습니다. 그런 다음 제대로 작동했지만 30 번 테스트 한 번만 제대로 작동하는 방법이었습니다 (다운로드가 완료된 후 스냅 샷 요청을 예약 한 다음 앱을 깨우는 방식). 나는 버그 보고서를 채웠고, 다음 베타 버전에서이 문제가 해결되기를 희망한다. 왜냐하면 나는 문서화에 따라 작동하지 않는 많은 시간을 잃어 버리기 때문이다.

+0

나는 29 번이나 다른 테스트를 반복적으로 호출하는 것을 잊어 버렸습니다. – Chiara

+0

예 키아라 같은 문제가 있습니다. handleBackgroundTasks는 환경을 여러 번 다시 설정하더라도 호출되지 않습니다! 내 질문을 업데이트했습니다. 나는 그것이 다음 버전에서도 수정 되길 바랍니다. WKApplicationRefreshBackgroundTask를 사용하여 합병증을 업데이트하고 WKSnapshotRefreshBackgroundTask를 사용하여 스냅 샷을 생성해야하므로 handleBackgroundTasks 대리인의 메소드 호출이 필요합니다. – Samira

+0

나는 WKApplicationRefreshBackgroundTask를 트리거하는 scheduleBackgroundRefreshWithPreferredDate를 호출하는 문제를 발견했다. 따라서 코드를 업데이트하고 메소드를 호출했지만 때로는 디버거의 타이밍 문제로 인해 호출되지 않았다. 주요 InterfaceController가 아닌 다른 InterfaceController의 스크린 샷을 찍을 방법이 있습니까? – Samira

1

코드를 ExtensionDelegate로 옮겼습니다. 지금은 나를 위해 제대로 작동합니다. 코드를 업데이트했습니다.

+0

Samira, 앱이 적절하게'WKURLSessionRefreshBackgroundTask's를 처리하고 있습니까? 나는 아직이 일을해야만한다. 또한,'WKApplicationRefreshBackgroundTask'를 스케쥴 할 수 없었습니다. 나 (와 다른 사람들)가 백그라운드 URLSession 작업을 성공적으로 복구하지 못했습니다. 있다면, 당신이하는 일을 다르게보고 싶을 것입니다. – DeepFriedTwinkie

+0

구현을 변경했고 코드를 업데이트했습니다. 코드를 디버깅 할 때마다 (예를 들어) 20 초 핸들 함수가 호출되지만 UI가 업데이트되지 않은 문제가 발생했습니다. 내가 고칠 수 있으면 게시물을 업데이트하십시오. – Samira