iOS 8 扩展依赖问题。将一个项目文件导入扩展视图控制器

Posted

技术标签:

【中文标题】iOS 8 扩展依赖问题。将一个项目文件导入扩展视图控制器【英文标题】:iOS 8 extension dependencies issues. Importing one project file to extension view controller 【发布时间】:2015-04-10 01:04:03 【问题描述】:

我正在开发 ios 8 扩展。我阅读了许多手册,所有这些都只是展示了如何简单地为您的应用添加扩展,并且似乎已经足够了。

但这里有很多陷阱:

    添加扩展后,您需要将一些类导入到添加新扩展目标时创建的视图控制器。您需要将所有这些都添加到这里的大用途,如果您有大型项目,这不是一项简单的任务。解决方案可以选择扩展目标,然后在 Build Phases -> Compile Sources 按加号按钮并使用热键 CMD+A 将所有 .m 文件添加到目标。

    添加所有文件后,您可以看到某些方法不起作用,并且您会看到此错误:'sharedApplication' is unavailable: not available on iOS (App Extension) 所以解决方案可以是检查ifndef Extension 的宏,然后我们可以调用sharedApplication 代码.

    #import <Foundation/Foundation.h>#import <UIKit/UIKit.h>。所以我还没有弄清楚这个问题,但是当我用 UIKit 替换 Foundation 时,它对我有用,所有相关问题都消失了。

    CocoaPods。我们所有人都在使用 CocoaPods,所以如果您的扩展需要使用项目代码的某些部分并且该代码使用 CocoaPods 库,那么您需要将 link_with 'ProjectTarged', 'ExtensionTarget' 添加到 Pod 文件并再次创建 pod install 以将您的库与新的扩展目标绑定.

所以这是我面临的一个要点。也许有人可以建议如何解决这个问题,正如我所说,我只是将一个需要的文件导入到扩展视图控制器。导入的文件包含一些库,如 AFNetworkingRestKit 和主项目中的其他嵌套类。我需要这个类来调用一些方法,将数据从扩展传递到我的后端服务器。所以一个文件,但有很多问题。

【问题讨论】:

您要解决的问题是什么?你列出了一堆陷阱,但听起来你已经知道如何处理它们了。 @TomHarrington 我预计应用程序和扩展程序之间可能存在一些提供程序,并且您根本不需要导入标头,所以就像您的应用程序目标中有一个可以跟踪某些事件的类扩展名,例如执行一些操作,而不是导入和添加所有文件,您只需在两个目标之间使用类似适配器的 smth 【参考方案1】:

您可以在 Podfile 中使用它来防止“仅需要应用程序扩展安全 API”。只需将其放在 Podfile 的末尾即可。

post_install do |installer_representation|
installer_representation.project.targets.each do |target|
    target.build_configurations.each do |config|
        config.build_settings['APPLICATION_EXTENSION_API_ONLY'] = 'NO'
        end
    end
end

【讨论】:

注意:对于较新的 Cocoapods 版本,您需要将“project”更改为“pods_project”。【参考方案2】:

1) 您只需将文件添加到您实际打算使用的扩展目标。我建议仅通过查找文件并在文件检查器中提取您需要的内容,将它们添加到两个目标中。

2) 是的,没错。您需要更新为您检查的库或 fork 并自行修复它们。

3) 我认为您在创建其中一个应用程序扩展时指的是默认模板。是的,你需要使用 UIKit 而不是 Foundation。 Foundation 适用于 iOS 或 OS X,但如果您正在制作 UIKit 应用程序,显然是不够的。

4) link_with 命令将使 Podfile 中的所有 pod 链接到列出的所有目标。如果这就是你所需要的,那么,好吧,那就去做吧。如果您的扩展只需要一小部分 pod,请使用以下内容:

target 'whateverTarget', :exclusive => true do
    pod 'SomePod'
end

【讨论】:

【参考方案3】:

要从 CocoaPods 库中删除 sharedApplication 问题,您只需在 Build Settings 中为您的 pod 更改 Build Options

只需键入搜索Require Only App-Extension-Safe API,然后将值更改为NO,如下图所示:

您可能需要为每个 pod 执行此操作。

【讨论】:

以上是关于iOS 8 扩展依赖问题。将一个项目文件导入扩展视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

无法在 IOS 13 上导入具有自定义 UTI 扩展名的文件

iOS 8是否支持动态链接?

从另一个项目扩展 DbContext

iOS8:扩展存储提供程序(导入、导出、移动)不起作用

文档提供程序扩展未显示在操作列表中

如何从共享扩展中的主容器项目导入文件?