- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我发现了很多问题和答案,但没有请求的最终示例:
谁能给出一个在 Objective C 中的最后一个例子,什么是将 WCSession 与 IOS 应用程序和带有多个 ViewController 的 Watch 应用程序 (WatchOS2) 一起使用的最佳实践。
到目前为止,我注意到以下事实:
1.) 在 AppDelegate 的父 (IOS) 应用程序中激活 WCSession:
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//Any other code you might have
if ([WCSession isSupported]) {
self.session = [WCSession defaultSession];
self.session.delegate = self;
[self.session activateSession];
}
}
2.) 在 WatchOS2 端使用 <WCSessionDelegate>
.但其余的对我来说完全不清楚!一些答案是通过在传递的字典中指定键来说话的,例如:
[session updateApplicationContext:@{@"viewController1": @"item1"} error:&error];
[session updateApplicationContext:@{@"viewController2": @"item2"} error:&error];
其他人在谈论检索默认 session
WCSession* session = [WCSession defaultSession];
[session updateApplicationContext:applicationDict error:nil];
别人说的是不同的队列? “如有必要,客户有责任分派(dispatch)到另一个队列。分派(dispatch)回主队列。”
我完全糊涂了。因此,请举例说明如何将 WCSession 与 IOS 应用程序和带有多个 ViewController 的 WatchOS2 应用程序一起使用。
我需要它来处理以下情况(已简化):在我的 parent 应用程序中,我正在测量心率、锻炼时间和卡路里。在 Watch 应用程序 1.ViewController 中,我将显示心率和锻炼时间,在 2.ViewController 中,我也会显示心率和燃烧的卡路里。
最佳答案
据我了解,您只需要在 Phone -> Watch
方向上进行同步即可,因此简而言之,您的最低配置是:
电话:
我相信 application:didFinishLaunchingWithOptions:
处理程序是 WCSession
初始化的最佳位置,因此将以下代码放在那里:
if ([WCSession isSupported]) {
// You even don't need to set a delegate because you don't need to receive messages from Watch.
// Everything that you need is just activate a session.
[[WCSession defaultSession] activateSession];
}
然后在您的代码中某处测量心率,例如:
NSError *updateContextError;
BOOL isContextUpdated = [[WCSession defaultSession] updateApplicationContext:@{@"heartRate": @"90"} error:&updateContextError]
if (!isContextUpdated) {
NSLog(@"Update failed with error: %@", updateContextError);
}
更新:
观看:
ExtensionDelegate.h:
@import WatchConnectivity;
#import <WatchKit/WatchKit.h>
@interface ExtensionDelegate : NSObject <WKExtensionDelegate, WCSessionDelegate>
@end
ExtensionDelegate.m:
#import "ExtensionDelegate.h"
@implementation ExtensionDelegate
- (void)applicationDidFinishLaunching {
// Session objects are always available on Apple Watch thus there is no use in calling +WCSession.isSupported method.
[WCSession defaultSession].delegate = self;
[[WCSession defaultSession] activateSession];
}
- (void)session:(nonnull WCSession *)session didReceiveApplicationContext:(nonnull NSDictionary<NSString *,id> *)applicationContext {
NSString *heartRate = [applicationContext objectForKey:@"heartRate"];
// Compose a userInfo to pass it using postNotificationName method.
NSDictionary *userInfo = [NSDictionary dictionaryWithObject:heartRate forKey:@"heartRate"];
// Broadcast data outside.
[[NSNotificationCenter defaultCenter] postNotificationName: @"heartRateDidUpdate" object:nil userInfo:userInfo];
}
@end
在您的 Controller 中的某处,我们将其命名为 XYZController1。
XYZ Controller 1:
#import "XYZController1.h"
@implementation XYZController1
- (void)awakeWithContext:(id)context {
[super awakeWithContext:context];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleUpdatedHeartRate:) name:@"heartRateDidUpdate" object:nil];
}
-(void)handleUpdatedHeartRate:(NSNotification *)notification {
NSDictionary* userInfo = notification.userInfo;
NSString* heartRate = userInfo[@"heartRate"];
NSLog (@"Successfully received heartRate notification!");
}
@end
代码没有经过测试,我只是按原样编写,所以可能会有一些拼写错误。
我认为现在的主要思路已经很清楚了,剩余类型数据的传输并不是那么困难的任务。
我当前的 WatchConnectivity 架构要复杂得多,但它仍然基于此逻辑。
如果您仍有任何疑问,我们可能会在聊天中进行进一步讨论。
关于ios - 将 WCSession 与多个 ViewController 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32574961/
我的 iOS 应用程序通过 WatchConnectivity 框架发送及时的信息。接收方实现 WCSession 的委托(delegate)。 我有 2 个 interfaceControllers
当我调用 session.activateSession() 方法时,我遇到了 WatchKit 连接 session 无法激活的问题。这是我用来设置 session 的代码。 if (WCSessi
我有一个带有“今日”扩展程序的应用程序和一个 watch 应用程序。从主应用程序 WCSession 工作正常,数据传输到 watch 并正确接收,但是当我尝试通过今日小部件中的 WCSession
Apple 文档显示: PayloadTooLarge - An error indicating that the item being sent exceeds the maximum size
有没有办法取消WCSession的sendMessage(_:replyHandler:errorHandler:)方法发送的消息? 来自documentation : Messages are qu
在我的应用程序中,我必须将信息从 watch InterfaceController 发送到手机 HomeViewController。但是,当我运行我的代码时,这些信息只有效一次。为了让它再次运行,
我在从父设备向 Apple Watch 发送文件时遇到问题。有时文件会通过并被完全解析。其他时候,它开始文件传输,但它失败了,甚至从未在 Apple Watch 上调用 session:(WCSess
当我尝试发送内容时收到 WCSession 尚未激活错误。而且我不知道我做错了什么。我已经测试了一些“必须”工作的预制解决方案。但它在我的模拟器和物理设备上不起作用。 部分代码: 我的应用委托(del
在 iOS 和 iWatch 设备之间建立连接,xCode 写入 [WC] WCSession 对应应用程序未安装。 经过大量研究,我找到了一个解决方案,也许它会对某人有所帮助。 - Check yo
委托(delegate)函数返回之前是否需要调用replyHandler?我需要进行几次 Web 服务 API 调用才能回复,以下实现正确吗? func session(_ session: WCSe
根据我的经验,我注意到为 WatchKit 应用程序创建两个或多个界面 Controller (IC) 时,AppleWatch 在用户滑动到它之前开始加载下一个界面。这可能对系统性能很有用,但后来有
我正在尝试向我的应用程序添加简单的WatchOS 2.0功能,以允许在手表上触发简单的操作并在iPhone上的主应用程序中产生效果。所有这些取决于使用WCSession的sendMessage方法从手
我正在从 iPhone 向 Watch (WatchOS2) 发送一条消息,其中 iPhone 上运行着一个内部计时器。每隔 30 秒,我就会从 iPhone 发送消息以供观看。不幸的是,发送消息仅在
我正在开发一个带有 watch 扩展 (watchOS 2) 的 iPhone 应用程序 (iOS 9 beta),并使用 WCSession 将数据从 watch 传递到手机。 我有 2 个使用 W
我正在使用 WCSession 的 tranferUserInfo 在 watch 和 iOS 应用程序之间发送数据,以获取当任一产品处于后台时需要处理的信息。这在模拟器上 100% 的时间都有效,但
Apple 是否表明对于 sendMessage(_ message: [String : AnyObject]...) 从 watch 到 iPhone 的传输时间的实际预期是多少?对于单个字符串的
我在使用 WCSession activateSession 时遇到了问题。我在我的 viewDidLoad 方法中添加了这段代码,它在调用 activateSession 时崩溃了。 sendMes
我正在使用 WatchKit 2.0,我注意到一个非常奇怪的行为。如果我使用我的 watch 应用程序超过 5 分钟,我开始从 WCSession sendMessage 调用中收到超时错误,该调用之
我正在使用 Xamarin 开发 Apple Watch 应用。我正在尝试使用 SendMessage 函数从我的 watch 向 iPhone 发送消息。当我这样做时,我收到了 out 错误消息 p
我想知道什么时候会在 watch 和 iOS 设备上的 WCSession 对象上调用 activateSession()。 在文档中它说: 在调用任何与 session 相关的方法之前,始终分配一个
我是一名优秀的程序员,十分优秀!