【问题标题】:Detect WatchKit extension presence in app检测应用程序中存在的 WatchKit 扩展程序
【发布时间】:2015-05-15 18:44:18
【问题描述】:

我有一个应用程序,如果在配对的 Apple Watch 上安装了 WatchKit 扩展程序,我希望它在更新和缓存方面的行为与未安装的情况有所不同。如果 watchkit 扩展有任何机会启动(您已配对手表并安装了应用程序),那么我想做更多的缓存。

有什么方法可以从我的 iOS 应用检测 Apple WatchKit 扩展是否安装在 Apple Watch 上?除了在第一次启动时设置一个标志并希望它以后不会被删除?

干杯

尼克

【问题讨论】:

  • 明确一点,Apple Watch 上从未安装 WatchKit 扩展。 WatchKit 扩展在 iPhone 上运行,而我们称之为 WatchKit 应用程序的资产和故事板捆绑包安装在实际硬件上。
  • 正确,那是我不准确:-)

标签: ios cocoa-touch watchkit


【解决方案1】:

我会重申我给here 的答案。无法检测手表是否已通过编程方式与手机配对。

【解决方案2】:

我不知道这是否对您有用,但我所做的是使用 userDefaults(组)在启动手表应用程序时设置标志。然后我可以在主应用程序中检查它。如果设置了标志,我知道该应用程序已安装。当然,这不是万无一失的,但考虑到 WatchKit 的当前限制,这是我能想到的最好的方法。它不会告诉您手机是否已配对,但会告诉您您的应用已安装在手表上,因此手机本身必须(或曾经)配对。

【讨论】:

  • 这就像我在我的问题中提到的,对吧?缺点是在您的手表上首次启动时,它不会及时获得数据,从而导致糟糕的初次体验。而且,当用户基于这种糟糕的体验删除手表扩展时,它会保留手表的数据,即使手表不会再次请求它。还是您的支票是在首次发布之前收到的?
  • 是的,就像你提到的那样,有缺点。至于知道用户是否删除了手表应用程序,您可以使用时间戳作为标志,并在每次打开手表应用程序时更新它。然后,您可以设置一个您认为足够长的时间跨度,以假设手表应用程序已被删除或不再使用。同样,这不是一个很好的解决方案,但考虑到当前状态,这是您可以做的一切。如果其他人有更好的解决方案,请发布。
【解决方案3】:

借助 WatchConnectivity 框架,您可以检查您的配对设备是否可用以及应用是否正在运行。

  • 从“target -> Capabilities”激活应用组
  • 在需要知道配套应用正在运行的设备上尝试此代码。

目标 C:

#import <WatchConnectivity/WatchConnectivity.h>

yourClass : Superclass <WCSessionDelegate>

WCSession* session = [WCSession defaultSession];
session.delegate = self;
[session activateSession];

-(void)session:(WCSession *)session activationDidCompleteWithState:(WCSessionActivationState)activationState error:(NSError *)error
{
  if (activationState == WCSessionActivationStateActivated) {
      [[WCSession defaultSession] sendMessage:@{@"fromThisDevice":@"hello"} replyHandler:^(NSDictionary<NSString *,id> * _Nonnull replyMessage) {
          NSLog(@"reply %@", replyMessage[@"fromOtherDevice"]);
      } errorHandler:^(NSError * _Nonnull error) {
          NSLog(@"error %@", error.userInfo);
      }];
  }
}

- (void) session:(nonnull WCSession *)session didReceiveMessage:(nonnull NSDictionary<NSString *,id> *)message replyHandler:(nonnull void (^)(NSDictionary<NSString *,id> * __nonnull))replyHandler{
   NSLog(@"message %@", message[@"fromOtherDevice"]);
   replyHandler(@{@"fromThisDevice":@"hello"});
}

斯威夫特:

import WatchConnectivity

yourClass : Superclass, WCSessionDelegate

let session = WCSession.default()
session.delegate = self
session.activate()

func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {
    if activationState == WCSessionActivationState.activated{
        WCSession.default().sendMessage(["fromThisDevice" : "hello"], replyHandler: { (reply:[String : Any]) -> Void in
            print(reply["fromOtherDevice"] as Any)
        }, errorHandler: { (error) -> Void in
            print(error)
        })
    }
}

func session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Void) {
    print(message["fromOtherDevice"] as Any)
    replyHandler(["fromThisDevice" : "hello"])
}

【讨论】:

    【解决方案4】:

    从 iOS 9 开始,WCSession 提供 isWatchAppInstalled。您可以通过导入 WatchConnectivity (@import WatchConnectivity;)、启动会话 ([[WCSession defaultSession] activateSession]) 并调用 [[WCSession sharedSession] isWatchAppInstalled] 来使用它。见这里:https://developer.apple.com/documentation/watchconnectivity/wcsession/1615623-iswatchappinstalled

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-27
      • 1970-01-01
      • 2016-03-10
      • 1970-01-01
      • 2015-05-19
      • 1970-01-01
      相关资源
      最近更新 更多