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

iOS 8 extension dependencies issues. Importing one project file to extension view controller

我正在开发 iOS 8 扩展。我读了很多手册,它们都只是展示了如何简单地为您的应用程序添加扩展,似乎就足够了。

但是这里有很多陷阱:

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

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

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

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

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

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

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

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

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

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

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

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

您可能需要为每个 pods.

执行此操作

您可以在 Podfile 中使用它来防止 "Require only App-Extension-Safe 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