我已经通过了大量的SO帖子,这个USED工作,但它停止了工作。我不确定发生了什么。我使用watchOS 1.0开发了这款iPhone + WatchKit应用程序,一切正常。
我已将我的应用,项目和Apple Watch升级到观看OS 2.0,现在我无法通过NSUserDefaults使用我的应用程序组获取任何数据。
在主机App和WatchKit Extension上的Xcode中启用了App Groups。我甚至尝试过为WatchKit App打开它。
我的群组名称为" group.com.mycompany.myapp" (使用我的真实公司名称和应用程序名称)并在所有目标上选择它。
我已确认主机应用的Build设置和WatchKit扩展程序引用了权利文件,并且我已检查这些权利文件是否包含我所选应用组的应用组安全选项。< / p>
我确保主机应用,watchkit扩展和watchkit应用的捆绑标识符不同。我分别使用&#34; com.mycompany.myapp&#34;,&#34; com.mycompany.myapp.watchkitextension&#34;和&#34; com.mycompany.myapp.watchkitapp&#34;。
以下是我的主机应用,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";
答案 0 :(得分:4)
在Watch OS1中,这有效,但在Watch OS2中有一些变化。您需要使用名为WatchConnectivity的内容将要保存的数据发送到手表。然后,当手表收到您发送给它的数据时,请将其保存到Apple手表的默认NSUserDefaults
。
WCSession.defaultSession()
将返回WCSession
单身人士,用于在iOS和Watch应用之间传输数据。
Here是一个教程和示例。
答案 1 :(得分:2)
由于手表os 2应用程序在手表而不是iPhone上运行,我认为您无法访问NSUserDefaults或应用程序组。您必须使用WatchConnectivity框架与手表之间传输数据。
答案 2 :(得分: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
}