2014-11-20 17 views
0

我无法找到一个简单的方法,当我推了苹果手表应用程序的按钮还没有更新我的iPhone应用程序的视图。简单的方法来更新通过Apple关注应用内容

iPhone应用程序的ViewController(内侧viewDidLoad中())::

我与NSUserDefaults的观察像这样试过

// Create and share access to an NSUserDefaults object. 
mySharedDefaults = NSUserDefaults(suiteName: "group.sharedTest") 

//Add Observer  
NSUserDefaults.standardUserDefaults().addObserver(self, forKeyPath: "test", options: NSKeyValueObservingOptions.New, context: nil) 

在Watchkit扩展InterfaceController我加入IBAction为与此代码的按钮:

mySharedDefaults!.setObject("testValue", forKey: "test") 
mySharedDefaults!.synchronize() 

但是当我按下按钮时,没有任何反应! 如果我在我的iPhone ViewController里面设置了一个对象,但是如果它通过应用程序更新的话,它不会有效! 有人可以帮我吗?

回答

2

你不是幸运,因为当你写你的问题有没有在iOS版SDK这个API。三天前,2014年12月10日苹果公司发布了iOS 8.2 beta 2 SDK,其中有两个,对于这项任务很重要。

在WatchKit框架,WKInterfaceController

// Obj-C 
+ (BOOL)openParentApplication:(NSDictionary *)userInfo 
         reply:(void (^)(NSDictionary *replyInfo, 
             NSError *error))reply 

通过调用此方法的iOS将运行你的应用程序在后台应用程序的AppDelegate将收到此消息

- (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void(^)(NSDictionary *replyInfo))reply. 

这是在添加第二个方法iOS SDK Beta 2(根据此问题)在UIKit Framework中,UIApplicationDelegate类。

可以使用的NSDictionary和回复组通信的关注应用和iOS应用。

在你WKInterfaceController

- (IBAction)callPhoneAppButtonTapped 
{ 
    NSDictionary *dictionary = [[NSDictionary alloc] initWithObjectsAndKeys:@"text to display", @"key", nil]; 

    [InterfaceController openParentApplication:dictionary reply:^(NSDictionary *replyInfo, NSError *error) { 
     NSLog(@"Reply received by Watch app: %@", replyInfo); 
    }]; 
} 

,然后在您的iOS AppDelegate类

- (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void (^)(NSDictionary *))reply 
{ 
    NSLog(@"Request received by iOS app"); 
    NSDictionary *dictionary = [[NSDictionary alloc] initWithObjectsAndKeys:@"your value to return to Apple Watch", @"key", nil]; 

    reply(dictionary); 
} 

当您点击苹果表扣模拟器iPhone模拟器您的iOS应用将会启动,你应该能够在适当的地方看到NSLog。

注意

该解决方案适用于运送观看和iOS应用程序之间的对象。 但是,如果你打算传输更多的数据,获得的图像,文件等,你应该使用Shared app group。您在Xcode项目文件中的Capabilities中设置共享应用程序组。 使用containerURLForSecurityApplicationGroupIdentifierNSFileManager类)来获取共享组中文件的URL。

如果你想分享偏好initWithSuiteNameNSUserDefaults是你在找什么。

+0

非常感谢您提供非常有趣的更新信息!我会尽快尝试!不幸的是,我还没有足够的声望来支持你的答案!对不起! – iVentis 2014-12-13 22:51:03

+0

很酷,没问题:)它对你有用吗? – lvp 2014-12-13 23:39:17

+1

我没有时间测试它!我会尽快告诉你;) – iVentis 2014-12-14 07:46:24

0

我猜测的WatchKit扩展的应用程序,你的iPhone应用程序,是独立运行的应用程序实例,并通知对于同一实例中。

作为替代方案,也许你可以在iPhone上的应用程序更改特定按键,定期检查一个单独的线程的新操作,并且当它检测到的变化产生一个通知本身。

+0

我不认为你需要一个操作来做到这一点。为什么不从扩展程序发布本地通知。 iPhone应用程序可以收到通知并让您继续作品。请记住在收到通知后从NotificationCenter中删除通知,否则用户可能会在NotificationCenter中看到它。 – sahara108 2014-11-21 09:21:31

+0

如果iPhone应用程序和扩展程序之间的通知工作,那将更容易。我曾想过,因为共享的默认通知不适用于所有应用程序,通常情况下通知不会。但如果他们这样做,你的建议肯定更容易。 – saward 2014-11-21 12:45:01

+1

@ sahara108这不会工作,因为扩展和主机应用程序是两个不同的进程,因此他们有不同的内存池,因此他们的NSNotificationCenter defaultCenter是不同的。 – lvp 2015-03-21 08:59:20

相关问题