3

アプリの 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];

    [...]
}
4

1 に答える 1

4

うわー、私はついに問題を解決しました!

ログ ファイルに表示されていなくても (最後のコメントを参照)、initアプリの起動時に WCExtensionDelegate のメソッドが適切に呼び出されているようです。

そのため、WCSession 設定ブロックをinitメソッドに移動する必要がありました。

- (id) init
{
    if (self = [super init]) {

        // Setup the WatchConnectivity session
        WCSession *session = [WCSession defaultSession];
        session.delegate = self;
        [session activateSession];
    }

    return self;
}

そしてしばらくの間、それは正常に機能します...

于 2015-10-24T12:16:00.703 に答える