WatchKit:“sharedApplication”不可用:iOS上不可用(应用程序扩展) – 在适当的地方使用基于视图控制器的解决scheme

我在watch套件扩展的build阶段添加了Manager.m(iOS类)。 但是,我得到以下错误

“sharedApplication”不可用:iOS上不可用(应用程序扩展) – 在适当情况下使用基于视图控制器的解决scheme

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

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

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

在您的手表套件扩展的目标版本设置中定义/添加macros(例如WATCH_KIT_EXTENSION_TARGET),并使用它来select性地构build代码。 例如,由于sharedApplication在iOS扩展中不可用,所以您可以像下面这样编码

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

扩展是一个不同的目标,所以他们需要访问源代码,包括所有需要编译的.m类。

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

我会说分成两三个class,为更清洁的代码。 一个用于扩展,一个用于主应用程序,一个用于共享类,如果需要的话。 您可以使用不同的devise模式来做到这一点,而且不需要任何关于您的应用程序的知识,我不能特别推荐。

为了避免在应用程序扩展中使用[UIApplication sharedApplication]编译时错误,您可以使用我的类别 。

如果您知道某个函数只能从iPhone应用程序中调用,那么另一个选项是将sharedApplication或其delegate作为parameter passing给Manager上的方法。

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

然后调用者(从某个地方没有手表扩展目标成员):

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

[[UIApplication sharedApplication] delegate]; 在WatchKit中不可用,但访问共享委托对象的并行function现在可用 – 请参阅WatchKit中UIApplication.sharedApplication()。委派的等效function。