アプリの WatchKit 拡張機能に取り組んでいますが、複雑な問題がいくつかあります。
ユーザーがiOSアプリで何をしているかに応じて、特定の合計金額を表示する複雑さがあります。WatchKit 拡張機能が実行されている場合、iOS アプリは-[WCSession updateApplicationContext:]
メソッドを使用してウォッチ アプリのコンテキストを更新します。正常に動作するので、Watch アプリの ExtensionDelegate で、新しいデータを使用して複雑さを手動で更新します。
ただし、これは拡張機能が実行されている場合にのみ問題ありません (実行されていない場合は、次の起動までアプリケーション コンテキストを取得できません)。
そのため、コードを編集して、ユーザーが iOS アプリで何かを変更したときに、-[WCSession transferCurrentComplicationUserInfo:]
メソッドを使用して複雑なデータを Watch に直接送信するようにしました (バックグラウンドでユーザー情報を受け取るには、ExtensionDelegate を起動する必要があることがドキュメントに書かれています)。
ExtensionDelegateのメソッドを実装して-session:didReceiveUserInfo:
、iOS アプリからデータを受信したときに合併症を更新しましたが、拡張機能が実行されていないときは機能しません... (ユーザーを受信したかどうかはわかりません)ログに記録できないので情報)
拡張機能が実行されていない場合でも、合併症を最新の状態に保つにはどうすればよいですか??
ありがとう
PS: Watch Simulator を使用しています。拡張機能を「閉じる」には、Watch を再起動します (ハードウェア メニューから)。
編集: アプリが実行されていないときにステートメントをログアウトすることができました (Watch Simulator システム ログを開くことによって)。iOS が新しい複雑なユーザー データをウォッチ拡張機能に送信すると、次の行が表示されます。
10 月 18 日 18:08:11 pc16 WatchApp 拡張機能 [26615]: 拡張機能は、合併症のサポートのためにウェイクアップする要求を受け取りました。
10 月 18 日 18:08:11 pc16 assertiond[26585]: アサーションが失敗しました: 15A284 13S343: assertiond + 15398 [B48FCADB-A071-3A46-878B-538DC0AFF60B]: 0x1
そのため、時計はユーザー情報辞書をうまく受け取りますが、拡張機能の起動に失敗しているようです...
編集 2 : これは、複雑なユーザー情報を受け取る必要がある ExtensionDelegate のコードの一部です (ただし、アプリが実行されていないときは呼び出されません)。
- (void) session: (WCSession *)session didReceiveUserInfo: (NSDictionary *)userInfo
{
NSLog(@"session:didReceiveUserInfo: %@", userInfo);
NSString *userInfoType = userInfo[KHWASessionTransferUserInfoType];
NSDictionary *userInfoContents = userInfo[KHWASessionTransferUserInfoContents];
// Complication Data
if ([userInfoType isEqualToString:KHWASessionTransferUserInfoTypeComplicationData]) {
// Store the complication data into user defaults
[[NSUserDefaults standardUserDefaults] setValue:userInfoContents[KHWAComplicationTotalBalance] forKey:KHWAComplicationTotalBalance];
[[NSUserDefaults standardUserDefaults] synchronize];
// And refresh the complications
CLKComplicationServer *complicationServer = [CLKComplicationServer sharedInstance];
for (CLKComplication *complication in complicationServer.activeComplications) {
[complicationServer reloadTimelineForComplication:complication];
}
}
}
編集 3 : WCSession は拡張デリゲートapplicationDidFinishLaunching
メソッドで設定されます。
- (void) applicationDidFinishLaunching
{
// Setup the WatchConnectivity session
WCSession *session = [WCSession defaultSession];
session.delegate = self;
[session activateSession];
[...]
}