3

我已经通过了大量的 SO 帖子,这曾经可以工作,但它停止了工作。我不确定发生了什么。我用 watchOS 1.0 开发了这个 iPhone+WatchKit 应用程序,一切正常。

我已将我的应用程序、项目和 Apple Watch 升级到 watchOS 2.0,现在我无法使用我的应用程序组通过 NSUserDefaults 获取任何数据。

  1. App Groups 在 Xcode 上的宿主 App 和 WatchKit Extension 中启用。我什至还尝试为 WatchKit 应用程序打开它。

  2. 我的组名称为“group.com.mycompany.myapp”(带有我的真实公司名称和应用程序名称),并且在所有目标上都被选中。

  3. 我已经确认我的主机应用程序的构建设置和 WatchKit 扩展引用了权利文件,并且我已经检查了这些权利文件是否包含我选择的应用程序组的应用程序组安全选项。

  4. 我已确保主机应用程序、watchkit 扩展程序和 watchkit 应用程序的包标识符不同。我分别使用“com.mycompany.myapp”、“com.mycompany.myapp.watchkitextension”和“com.mycompany.myapp.watchkitapp”。

以下是我的主机应用程序、watchkit 扩展程序和 watchkit 应用程序的 Xcode 配置的一些屏幕截图,以防万一:

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

这是我的主机应用程序中能够正确读取数据的代码:

NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:kAppGroupName];
NSLog(@"app defaults: %@", [defaults dictionaryRepresentation]);

这在我的控制台中产生了这个,kKeyEmployeeId并且kKeyStoreNumber是我试图在主机和手表之间共享的数据。

2015-12-13 13:51:35.618 MyApp[27516:16126253] app defaults: {
    AppleLanguages =     (
        "en-US",
        en
    );
    INNextHearbeatDate = "472211882.83309";
    NSInterfaceStyle = macintosh;
    NSLanguages =     (
        "en-US",
        en
    );
    "com.apple.content-rating.AppRating" = 1000;
    "com.apple.content-rating.ExplicitBooksAllowed" = 1;
    "com.apple.content-rating.ExplicitMusicPodcastsAllowed" = 1;
    "com.apple.content-rating.MovieRating" = 1000;
    "com.apple.content-rating.TVShowRating" = 1000;
    kKeyEmployeeId = Kenny;
    kKeyStoreNumber = 001;
}

在我的 WatchKit 扩展中,我有相同的代码,但它没有提供我需要的两个键:值对:

- (void)awakeWithContext:(id)context {
    [super awakeWithContext:context];

    NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:kAppGroupName];
    NSLog(@"defaults: %@", [defaults dictionaryRepresentation]);

}

它产生了这个,它与上面的非常相似,但没有我真正需要的两个键:

2015-12-13 13:28:29.840 MyApp WatchKit Extension[720:322804] defaults: {
    AppleLanguages =     (
        en
    );
    INNextHearbeatDate = "472434306.599217";
    NSInterfaceStyle = macintosh;
    NSLanguages =     (
        en
    );
    "com.apple.content-rating.AppRating" = 1000;
    "com.apple.content-rating.ExplicitBooksAllowed" = 1;
    "com.apple.content-rating.ExplicitMusicPodcastsAllowed" = 1;
    "com.apple.content-rating.MovieRating" = 1000;
    "com.apple.content-rating.TVShowRating" = 1000;
}

kAppGroupName其他常量定义如下:

NSString * const kAppGroupName = @"group.com.inadaydevelopment.MyApp";
NSString * const kKeyStoreNumber = @"kKeyStoreNumber";
NSString * const kKeyEmployeeId = @"kKeyEmployeeId";
4

3 回答 3

5

在 Watch OS1 中这有效,但在 Watch OS2 中发生了一些变化。您需要使用称为WatchConnectivity的东西将要保存的数据发送到手表。然后当手表收到你发送给它的数据时,将其保存到 Apple Watch 的默认值NSUserDefaults中。

WCSession.defaultSession()将返回WCSession用于在 iOS 和 Watch 应用之间传输数据的单例。

是一个教程和示例。

于 2015-12-13T22:02:04.877 回答
2

由于 watch os 2 应用程序在手表而不是 iPhone 上运行,我认为您无权访问 NSUserDefaults 或应用程序组。您必须使用 WatchConnectivity 框架将数据传入和传出手表。

于 2015-12-13T21:59:24.230 回答
0

你可以按照这个步骤

1)设置会话

if ([WCSession isSupported])
{
    [[WCSession defaultSession] setDelegate:self];
    [[WCSession defaultSession] activateSession];
}

2)准备数据字典并使用以下方法发送

[WCSession defaultSession] sendMessage:dataDict replyHandler:^(NSDictionary<NSString *,id> * _Nonnull replyMessage) {

            //You task on completion

        } errorHandler:^(NSError * _Nonnull error) {

            if (error)
            {
                //Handle the error
            }
        }];

3)在手表应用代码中您可以设置委托方法

 - (void)session:(WCSession *)session didReceiveMessage:(NSDictionary<NSString *, id> *)message replyHandler:(void(^)(NSDictionary<NSString *, id> *replyMessage))replyHandler
    {
          //Handle the response
    }
于 2017-12-04T12:54:45.543 回答