【问题标题】:WatchKit : 'sharedApplication' is unavailable: not available on iOS (App Extension) - Use view controller based solutions where appropriate insteadWatchKit:“sharedApplication”不可用:在 iOS 上不可用(应用程序扩展) - 在适当的情况下使用基于视图控制器的解决方案
【发布时间】:2015-05-31 01:05:15
【问题描述】:

我在手表套件扩展的构建阶段添加了 Manager.m(iOS 类)。但是,我收到以下错误

'sharedApplication' 不可用:在 iOS 上不可用(App 扩展) - 在适当的情况下使用基于视图控制器的解决方案 而是

这是我的 Manager.m 中导致问题的行。

 AppDelegate *appDelegate =
  (AppDelegate *)[[UIApplication sharedApplication] delegate];

我想在 Manager.m 中使用代码,但是像这样的代码行会导致问题,并且不会让我运行手表应用程序。有没有解决的办法?我不想为了适应 watchkit 而重写整个类。

【问题讨论】:

    标签: ios watchkit


    【解决方案1】:

    在您的手表套件扩展的目标构建设置中定义/添加一个宏(例如 WATCH_KIT_EXTENSION_TARGET),并使用它来选择性地构建代码。例如。因为 sharedApplication 在 iOS 扩展上不可用,所以你可以像下面这样编写代码

    #ifndef WATCH_KIT_EXTENSION_TARGET
    AppDelegate *appDelegate =
      (AppDelegate *)[[UIApplication sharedApplication] delegate];
    #endif
    

    【讨论】:

    • #ifndef WATCH_KIT_EXTENSION_TARGET [[UIApplication sharedApplication] scheduleLocalNotification:localNotif]; #endif 如果我这样做,你的逻辑不起作用?
    • 我在添加共享扩展时也遇到了同样的问题。需要帮助,请
    【解决方案2】:

    扩展是一个不同的目标,因此它们需要能够访问源代码,其中包括它需要编译的所有 .m 类。

    这意味着如果您的类同时在主应用程序和扩展程序中使用,您应该重构它,以便扩展程序只能访问它需要的行为/逻辑,而不是全部。您可以手动禁用代码块的编译,但这会给您的代码 IMO 增加噪音,并使其他人更难理解。

    我会说将它分成两个或三个类,以获得更简洁的代码。一个用于扩展,一个用于主应用程序,如果需要,一个共享类。您可以使用不同的设计模式来做到这一点,如果不了解您的应用,我不能特别推荐一种。

    【讨论】:

      【解决方案3】:

      为避免在应用扩展中使用[UIApplication sharedApplication] 时出现编译时错误,您可以使用我的category

      【讨论】:

      • 方法调配似乎有点过分绕过这个问题。
      【解决方案4】:

      如果您知道某个特定函数只能从 iPhone 应用程序调用,那么另一种选择是将sharedApplication 或其delegate 作为参数传递给您的管理器上的方法。

      - (void)doSomething:(UIApplication *)sharedApplication {
          [sharedApplication delegate];
      }
      

      然后是调用者(来自没有 Watch Extension 目标成员资格的地方):

      [[Manager sharedInstance] doSomething:[UIApplication sharedApplication]];
      

      【讨论】:

        【解决方案5】:

        [[UIApplication sharedApplication] delegate]; 在 WatchKit 中不可用,但访问共享委托对象的并行现在可用 - 请参阅 What is the equivalent of UIApplication.sharedApplication().delegate in WatchKit?

        【讨论】:

          猜你喜欢
          • 2018-08-09
          • 1970-01-01
          • 1970-01-01
          • 2019-11-12
          • 1970-01-01
          • 1970-01-01
          • 2018-06-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多