【问题标题】:Connect Objective-C framework to Swift iOS 8 app (Parse framework)将 Objective-C 框架连接到 Swift iOS 8 应用程序(解析框架)
【发布时间】:2014-08-07 23:02:26
【问题描述】:

我正在尝试将 Objective-C 框架与 Swift 编程语言一起用于 iOS 8 开发。这是导入的特定情况,但一般问题是:

如何将 Objective-C 框架导入 swift 并让导入被识别?

我正在尝试将 Parse 框架集成到使用 iOS 8 和 Xcode 6 测试版的 swift 应用程序中。

以下是Objective-C中Parse框架集成的技术:

https://www.parse.com/apps/quickstart#social/mobile/ios/native/existing

我已将 Parse 框架下载为压缩存档,将其解压缩并导入 Xcode 6,没有任何问题。在我的应用程序中,它显示为名为 Parse.framework 的格式正确的框架。

我目前的思路是修改我项目根目录下的AppDelegate.swift文件。这是当前未修改的文件(由 Xcode 在 swift 项目创建时自动生成):

https://gist.github.com/fconcklin/e8ef7d8b056105a04161

我尝试通过在import UIKit 行下方添加import Parse 行来导入解析。但是,Xcode 会发出警告,提示找不到此类模块并且构建失败。

我还尝试创建一个文件${PROJ_NAME_HERE}-Bridging-Header.h,其中包含使用import <Parse/Parse.h> 对Parse 的Objective-C 导入。这条线不会引发错误,但似乎最终没有任何区别。

【问题讨论】:

  • 项目属性中是否设置了桥接头的路径?调出项目属性并在“Swift Compiler - Code Generation”部分下查找“Objective-C Bridging Header”。仅仅有一个桥接头文件是不够的——你必须在项目中设置它的路径。

标签: ios objective-c xcode parse-platform swift


【解决方案1】:

经过进一步研究,我找到了解决方案,并意识到我只是感到困惑。

正确做法如下:

  • 通过将框架拖放到 Xcode 6 Swift 项目中来导入您的 Objective C 框架。

  • 在您的项目中创建一个新的 Objective C 文件(File->New->File [Objective C for iOS])。

  • 接受提示(同意)在 Objective C 和 Swift 之间创建一个桥接头文件。

  • 删除新创建的 Objective C 文件,但保留桥接头文件 ${YOURPROJ}-Bridging-Header.h

  • 在 Bridging 头文件中,使用标准 Objective C 导入语法(例如 #import <Parse/Parse.h>)导入您的框架。

  • 这放弃了在您的 AppDelegate.swift 文件中执行 import Parse 语句的需要。您现在可以编写使用任何框架的代码,只要它是使用桥接头导入的。它在整个项目的 Swift 文件中都可用。

现在,如果您想在您的项目中测试 Parse 集成,您可以输入 Parse. 并使用代码完成功能来浏览框架并看到代码完成表示导入成功。

但是,在使用桥接头文件时,这里还有一个需要注意的警告。框架的所有依赖项也需要在桥接头文件中指定。在将 Parse 框架集成到 Swift 应用程序的情况下,您的 Bridging Header 文件将如下所示:

 #import <Foundation/Foundation.h>

 // Parse Dependencies
 #import <AudioToolbox/AudioToolbox.h>
 #import <CFNetwork/CFNetwork.h>
 #import <CoreGraphics/CoreGraphics.h>
 #import <CoreLocation/CoreLocation.h>
 #import <MobileCoreServices/MobileCoreServices.h>
 #import <QuartzCore/QuartzCore.h>
 #import <Security/Security.h>
 #import <StoreKit/StoreKit.h>
 #import <SystemConfiguration/SystemConfiguration.h>

 // Import parse framework
 #import <Parse/Parse.h>

希望这会有所帮助。

【讨论】:

  • 感谢您的周到!我很快就会试试这个。
  • 感谢您的回复,它确实有效,但要意识到您不必在您的 swift 文件中导入 Parse 是非常棘手的!
  • 当我这样做并转到另一个 Swift 文件时,我会无休止地收到“SourceKitService 崩溃。编辑器功能暂时受限”,直到我删除标题。
  • 它还能用吗?我得到failed to import bridging header '/PATH/TO/File-Bridging-Header.h' ,然后是error: 'Parse/Parse.h' file not found
  • 感谢@user284244,它就像一个魅力,你拯救了我的一天
【解决方案2】:

添加桥接头的“傻瓜证明”方式如下:

如果您有一个 Swift 项目,请在您的项目中添加一个新的 Objective-C 文件,Xcode 会提示您是否要使用桥接头配置您的项目。按是。

如果你有一个 Objective-C 项目,添加一个新的 Swift File 到它,你会得到同样的提示。按是。

得到桥接头后,你可以随意删除刚才添加的文件。

【讨论】:

  • 我有一个 swift 项目,但是当我添加 ObjC 头文件 (xcode 6 b4) 时,我无法显示添加桥接头消息。有什么想法吗?
  • @ZuluDeltaNiner 我遇到了同样的问题,直到我意识到我已经导入了另一个已经创建桥接类的框架。难道是你已经创建了一个桥接头类?
  • 我尝试了这种技术,但我得到的只是一个空白的桥接头文件。
  • 我的桥接头没问题,但框架显示错误,因为目标 c 和 Xcode 8 在 swift 项目中不能容忍它,我能做什么?
【解决方案3】:

要将 Parse 框架添加到 Swift 项目: 将此库添加到 Swift 项目中。

将此框架从 ParseSDK 粘贴到您的项目中:

添加包含此类内容的 ProjectName-Bridging-Header.h (https://developer.apple.com/library/ios/documentation/swift/conceptual/buildingcocoaapps/MixandMatch.html) (https://stackoverflow.com/a/24272431/1847511) 文件。

添加连接桥接头的路径:

添加测试代码:

运行应用程序。

【讨论】:

    【解决方案4】:

    我的问题的答案是不同的。我将项目构建设置中的框架搜索路径设置为递归,而它们本应非递归

    在我的例子中,我的目标将其框架搜索路径设置为 $(inherited),这意味着从我的项目继承设置。

    我的项目的框架搜索路径只有一个路径,$PROJECT_DIR/../External/**(两个星号表示“递归搜索此文件夹”。我的 Parse.framework 文件位于 External 文件夹的基本级别。

    将路径从 recursive 更改为 non-recursive 为我解决了问题。很奇怪……

    【讨论】:

      【解决方案5】:

      新的 Parse 框架版本需要一些更新。

      例如你应该在Library Binary With Libraries 中插入libsqlite3.0.dylib 并用#import 和#import 更新头文件

      【讨论】:

        【解决方案6】:

        在 Swift 中使用 Objective-C 类

        如果您要在 App Target 中导入代码(在一个项目中混合 Swift 和 Objective-C),您应该使用 bridging header 文件将 Objective-C 代码公开给 Swift 代码。 [Mixing Swift and Objective-C code in a project]

        在这篇文章中,我将介绍如何将 Objective-C 框架导入 Swift 代码

        Swift 消费者 -> Objective-C 动态框架

        Xcode 版本 10.2.1

        创建 Objective-C 框架

        创建框架项目或创建框架目标

        File -> New -> Project... -> Cocoa Touch Framework
        //or
        Project editor -> Add a Target -> Cocoa Touch Framework
        

        将生成两个文件:

        1. Info.plist - Build Settings -&gt; Info.plist File
        2. &lt;product_name&gt;.h - Build Phases -&gt; Headers。这是一个伞头文件,将为消费者[About]打开

        将所有.h 文件添加到此伞形文件(.h)

        #import "header_1.h"
        #import "header_2.h"
        

        添加实现文件.m

        Select `.m` file -> Select File Inspectors Tab -> Target Membership -> Select the target
        //or
        Project editor -> select a target -> Build Phases -> Compile Sources -> add files
        

        在公共区域添加&lt;product_name&gt;.h 中列出的头文件.h (header_1.h, header_2.h)[can not do it] [public target membership]

        Select `.h` file -> Select File Inspectors Tab -> Target Membership -> Select the target and make it **public**
        //or
        Project editor -> select a target -> Build Phases -> Headers -> add files to the **public** zone
        

        构建框架 - ⌘ 命令 + BProduct -&gt; Build

        注意:确保为与客户端代码相同的流程架构构建框架。

        查找生成的输出[Build location]

        Products group -> <product_name>.framework -> Show in Finder
        

        框架包括

        • Info.plist
        • Modules 文件夹:
        • module.modulemap[About] [Custom modulemap] 这个文件是自动生成的,因为Build Settings -&gt; Defines Module -&gt; YES
        • Headers 文件夹:
        • 来自Headers 部分的文件。有公共接口/定义

        使用 Objective-C 框架的 Swift 消费者

        Drag and drop二进制进入Xcode项目[About]

        Embed binaries[Library not loaded][Link vs Embed]

        Project editor -> select a target -> General -> Embedded Binaries -> path to `<product_name>.framework` file
        

        我会自动将框架添加到:

        1. Project editor -&gt; select a target -&gt; General -&gt; Linked Frameworks and Libraries
        2. Project editor -&gt; select a target -&gt; Build Phases -&gt; Embed Frameworks
        3. Project editor -&gt; select a target -&gt; Build Phases -&gt; Link Binary With Libraries

        添加Framework Search paths(FRAMEWORK_SEARCH_PATHS)[Module not found][Recursive path]

        Project editor -> select a target -> Build Settings -> Search Paths -> Framework Search paths -> add path to the parent of `<product_name>.framework` file
        

        将模块导入Swift客户端代码[module_name]

        import module_name
        

        More examples here

        【讨论】:

        • 我们如何在 Swift 框架中使用 Objective-C xcframework?使用模块图。我有这个:'module ObjCHyperPayModule { header "../Frameworks/OPPWAMobile.xcframework/ios-arm64_armv7/OPPWAMobile.framework/Headers/OPPWAMobile.h" // header "../Frameworks/OPPWAMobile.xcframework/ios-arm64_i386_x86_64-模拟器/OPPWAMobile.framework/Headers/OPPWAMobile.h" //${SRCROOT} 导出 * }'
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-27
        • 1970-01-01
        相关资源
        最近更新 更多