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

私も同じ問題を抱えてる。Apple のサンプル コードもテストしまし たhttps://developer.apple.com/library/prerelease/content/samplecode/WatchBackgroundRefresh/Introduction/Intro.htmlhandle(_:)メソッドは呼び出されませんでした。シミュレーターを数回再起動し、製品をクリーンアップし、通常のことを行うまで。その後、私はそれを機能させましたが、30回のテストのうち1回だけが、メソッドが適切に機能していました(ダウンロードが完了してからアプリを起動した後にスナップショット要求をスケジュールします)。私はバグレポートに記入しました。次のベータ版でこれが修正されることを期待しています.ドキュメントに従って動作しないテストで多くの時間を失っているからです.

于 2016-07-25T09:50:47.913 に答える