我正在尝试将数据从我的应用程序传递到Apple Watch应用程序中.基本上,我使用的方法与我用于创建今天小部件的方法相同,因此我通过NSUserDefaults传递数据.
问题是,当我运行我的应用程序时,数据不会像我预期的那样更新Watch应用程序中的标签.
这是我的......
override init(context: AnyObject?) {
// Initialize variables here.
super.init(context: context)
// Configure interface objects here.
NSLog("%@ init", self)
var defaults = NSUserDefaults(suiteName: "group.AffordIt")
var totalBudgetCalculation = ""
if (defaults!.stringForKey("totalBudgetWidget") != nil) {
println("Worked")
totalBudgetCalculation = defaults!.stringForKey("totalBudgetWidget")!
initialBudgetLabel.setText("Initial: \(totalBudgetCalculation)")
}
var currentBudgetCalculation = ""
if (defaults!.stringForKey("currentBudgetWidget") != nil) {
currentBudgetCalculation = defaults!.stringForKey("currentBudgetWidget")!
currentBudgetLabel.setText("Current: \(currentBudgetCalculation)")
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试将此代码放入其中willActivate(),但这似乎没有任何区别.
谁知道我哪里错了?
我想为Apple手表制作一个测试应用程序,您可以在手机上设置一些String,然后它将显示在Apple Watch上.我决定使用NSUserDefaults类来存储这些数据.
在我的iPhone视图控制器中,我有一个方法,它将输入和存储带入本地存储:
- (IBAction)saveInfo:(id)sender {
NSString *userInput = [myTextField text];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:userInput forKey:@"savedUserInput"];
[defaults synchronize];
self.myLabel.text = [defaults stringForKey:@"savedUserInput"];
}
Run Code Online (Sandbox Code Playgroud)
在我的监视接口控制器中,我有一个检索数据并显示它的方法:
- (IBAction)showText2 {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults synchronize];
self.myLabel2.text = [defaults stringForKey:@"savedUserInput"];
}
Run Code Online (Sandbox Code Playgroud)
除了某些原因,我试图检索的数据显示为null,标签没有更新.
这在watchOS 1上不是问题,但现在在watchOS 2上我无法读取手表扩展上的值.
根据Apple文档,这是可能的.根据这个帖子的一些人的说法,这是可能的.根据这个线程上的Apple员工的说法,这是可能的.
据我所知,我正确地设置了所有内容:
ApplicationGroupContainerIdentifier为plist 添加了相同的标识符当我NSUserDefaults使用标识符作为套件名称初始化对象时,我无法读取监视扩展名上的值.我可以在iOS应用程序上阅读它们.这发生在模拟器和真实设备中.
请不要发布有关如何使用Watch Connectivity执行此操作的答案.只有在没有Watch Connectivity的watchOS 2上的共享应用程序组才能实现这一点,人们可以做到这一点,而这里直接来自文档:
在watchOS 2中,您的WatchKit扩展可能会读取首选项的值,但您无法编写新值.watchOS 2中的首选项从iOS转发到Apple Watch,但您所做的任何修改都不会发送回iOS.
我需要在WatchKit Extension上存储大约5个变量 - 仅限Watch.该应用程序将完全原生,不会将任何信息传递给iPhone.如果手表重新启动,我需要数据保持不变.应用程序当前在重新启动时重置为默认变量状态.我不知道该用什么.我在网上找到了关于使用手表钥匙串存储键值数据对(用户名/密码)的信息,但我认为这不是我应该在这里使用的.感谢一些帮助.
我已经阅读了下面的q/a,这很棒.这正是我在测试项目中所做的,它运行正常.
我现在已经创建了我的真实项目,但是在Watch扩展中,session: didReceiveApplicationContext:不会触发.
这是我的发送代码:
-(void)sendPlistToWatch:(NSMutableDictionary *)dictionary {
NSLog(@"%s", __FUNCTION__);
if ([WCSession defaultSession]) {
NSDictionary *applicationDict = @{@"Favorites.plist":dictionary};
[[WCSession defaultSession] updateApplicationContext:applicationDict error:nil];
NSLog(@"sent dictionary");
} else {
NSLog(@"not paired");
}
}
Run Code Online (Sandbox Code Playgroud)
这是手表上的接收代码:
- (void)awakeWithContext:(id)context {
[super awakeWithContext:context];
if ([WCSession isSupported]) {
[self.session activateSession];
self.session = [WCSession defaultSession];
self.session.delegate = self;
}
}
- (void)willActivate {
[super willActivate];
}
- (void)didDeactivate {
[super didDeactivate];
}
- (void)session:(nonnull WCSession *)session didReceiveApplicationContext:(nonnull NSDictionary<NSString *,id> *)applicationContext {
NSString *string = [applicationContext objectForKey:@"dictionary"];
NSMutableDictionary …Run Code Online (Sandbox Code Playgroud) ios ×5
watchkit ×4
apple-watch ×2
objective-c ×1
session ×1
swift ×1
watchos-2 ×1
xcode ×1
xcode6 ×1