質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.02%
Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

AppleWatch

AppleWatchは、iPhoneと連動して動作する時計型のデバイスです。時間の確認だけでなく、通話や受信メールの確認などを行うことができます。

Q&A

解決済

【WatchOS 3.0】Backgroundタスクについて

twinsruka
twinsruka

総合スコア7

Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

AppleWatch

AppleWatchは、iPhoneと連動して動作する時計型のデバイスです。時間の確認だけでなく、通話や受信メールの確認などを行うことができます。

1回答

0グッド

0クリップ

3280閲覧

投稿2016/08/18 12:16

###前提・実現したいこと
AppleWatchの実機でバックグラウンドタスクを動作させたい。
自分では正しく実装できてると思っているのですが、実機だとどうしても上手く行きません。シミュレータでは正常に動作するので、原因が特定できない状況です。

検索しても情報自体が少ないため、ご助力頂けますでしょうか。
よろしくお願いいたします。

###問題
ExtensionDelegateクラスにて、バックグラウンドタスクのスケジュールを設定し、アプリをバックグラウンド状態に移行させても、handleBackgroundTasks:メソッドが呼ばれない。

###該当のソースコード

Objective

1#import "ExtensionDelegate.h" 2 3@implementation ExtensionDelegate{ 4 int labelUpdateCount; 5} 6 7- (void)applicationDidFinishLaunching { 8 // Perform any final initialization of your application. 9 } 10} 11 12- (void)applicationDidBecomeActive { 13 // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 14} 15 16- (void)applicationWillResignActive { 17 // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 18 // Use this method to pause ongoing tasks, disable timers, etc. 19} 20 21-(void)applicationDidEnterBackground{ 22 NSLog(@"バックグラウンドへ移行"); 23 [self scheduleTest]; 24} 25 26-(void)testLabelUpdate{ 27 28} 29 30-(void)scheduleTest { 31 NSLog(@"バックグラウンドタスクスケジュール設定"); 32 NSDate *fireDate = [NSDate dateWithTimeIntervalSinceNow:(NSTimeInterval)60]; 33 34 NSDictionary *userInfo = @{@"reason": @"Background Refresh"}; 35 [[WKExtension sharedExtension] scheduleBackgroundRefreshWithPreferredDate: fireDate 36 userInfo: userInfo 37 scheduledCompletion: ^(NSError *error){ 38 if (error == nil) { 39 NSLog(@"スケジュール設定成功"); 40 }else{ 41 NSLog(@"スケジュール設定失敗"); 42 } 43 }]; 44} 45 46-(void)updateData{ 47 NSLog(@"バックグラウンドタスク実行成功"); 48} 49 50- (void)handleBackgroundTasks:(NSSet<WKRefreshBackgroundTask *> *)backgroundTasks { 51 // Sent when the system needs to launch the application in the background to process tasks. Tasks arrive in a set, so loop through and process each one. 52 for (WKRefreshBackgroundTask * task in backgroundTasks) { 53 // Check the Class of each task to decide how to process it 54 if ([task isKindOfClass:[WKApplicationRefreshBackgroundTask class]]) { 55 // Be sure to complete the background task once you’re done. 56 WKApplicationRefreshBackgroundTask *backgroundTask = (WKApplicationRefreshBackgroundTask*)task; 57 //バックグラウンドタスク実行 58 [self updateData]; 59 [backgroundTask setTaskCompleted]; 60 } else if ([task isKindOfClass:[WKSnapshotRefreshBackgroundTask class]]) { 61 // Snapshot tasks have a unique completion call, make sure to set your expiration date 62 WKSnapshotRefreshBackgroundTask *snapshotTask = (WKSnapshotRefreshBackgroundTask*)task; 63 [snapshotTask setTaskCompletedWithDefaultStateRestored:YES estimatedSnapshotExpiration:[NSDate distantFuture] userInfo:nil]; 64 } else if ([task isKindOfClass:[WKWatchConnectivityRefreshBackgroundTask class]]) { 65 // Be sure to complete the background task once you’re done. 66 WKWatchConnectivityRefreshBackgroundTask *backgroundTask = (WKWatchConnectivityRefreshBackgroundTask*)task; 67 [backgroundTask setTaskCompleted]; 68 } else if ([task isKindOfClass:[WKURLSessionRefreshBackgroundTask class]]) { 69 // Be sure to complete the background task once you’re done. 70 WKURLSessionRefreshBackgroundTask *backgroundTask = (WKURLSessionRefreshBackgroundTask*)task; 71 [backgroundTask setTaskCompleted]; 72 } else { 73 // make sure to complete unhandled task types 74 [task setTaskCompleted]; 75 } 76 } 77} 78@end 79

###試したこと
・InterfaceControllerクラスにて、同様の実装を行ったがhandleBackGroundTasks:メソッドは実行されなかった。この際、InterfaceControllerクラスのawakeWithContext:メソッド内に下記の処理を実装していた。
//WKExtensionのデリゲートを自分自身にセット
[[WKExtension sharedExtension]setDelegate:self];

・Xcodeのシミュレータで実行したところ、正常に動作した。

###補足情報(言語/FW/ツール等のバージョンなど)
【テストに使用した端末】
AppleWatch 38mm WatchOS 3.0 beta3
AppleWatch 42mm WatchOS 3.0 beta6

【開発環境】
macOS 10.12 Beta3
Xcode8 beta6(beta3,4,5でも上手く行かなかった)

【その他】
実機デバッグを行うと、なぜかデバッグコンソールにNSLogが出力されない。

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答1

0

ベストアンサー

検索しても情報自体が少ない

ようやくそれらしいドキュメントがでました 2016/12/12
https://developer.apple.com/library/content/documentation/General/Conceptual/WatchKitProgrammingGuide/DesigningaWatchKitApp.html

今後仕様が変わらないことを祈ります
apple watchほとんど実験状態でバージョン変更で使えなくなったAPIがどれほどあるのか
毎回作り直し...

投稿2016/12/29 04:59

aja

総合スコア3713

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.02%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

AppleWatch

AppleWatchは、iPhoneと連動して動作する時計型のデバイスです。時間の確認だけでなく、通話や受信メールの確認などを行うことができます。