最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

[已解决]swift中如何调用Object-C的.a的库函数

Object-C crifan 5404浏览 0评论

添加了一个.a的库

以及对应的Obj-C的.h头文件

然后对于OC的示例代码:

      [JPUSHService registerForRemoteNotificationTypes🙁UIUserNotificationTypeBadge |
                                                        UIUserNotificationTypeSound |
                                                        UIUserNotificationTypeAlert)
                                            categories:nil];

如何如何,都转化不成swift

想要去引用此库,不论是:

#import "JPUSHService.h"

还是:

import JPUSHService

都不行。

swift how use obj-c .a lib

Using Swift with Cocoa and Objective-C (Swift 2.1): Swift and Objective-C in the Same Project

How to call Objective C code from Swift – Stack Overflow

Using Swift with Cocoa and Objective-C (Swift 2.2): Basic Setup

ios – How to import existing Objective C classes in Swift – Stack Overflow

结果都照做了,还是不行,找不到对应的变量:

swift how call obj-c .a lib

swift use object-c .a lib

Merge Objective-C static library into Swift (using mosquitto) — Swift Programming — Medium

发现:

此处的Compile Resource中没有包含:

JPUSHService.h

去把头文件所在项目路径加到头文件搜索路径中试试:

还是找不到:

把:

JianDao-Bridging-Header.h

从:

#ifndef JianDao_Bridging_Header_h
#define JianDao_Bridging_Header_h
#import "JPUSHService.h"
#endif /* JianDao_Bridging_Header_h */

改为:

//#ifndef JianDao_Bridging_Header_h
//#define JianDao_Bridging_Header_h
#import "JPUSHService.h"
//#endif /* JianDao_Bridging_Header_h */

编译期间加载的头文件中,还是没有JPUSH。

swift object-c static .a library

去把:

$(SRCROOT)/JianDao-Bridging-Header.h

改为:

$(SRCROOT)/JianDao/JianDao-Bridging-Header.h

问题依旧。

ios – Static Library and Swift – Stack Overflow

xcode – Using Objective-C code in iOS Cocoa Static Library project with Swift code in iOS Application project – Stack Overflow

胡乱的把.h拖动到库里试试:

不管,至少编译包含了:

但是还是无法使用:

osx – How to import Objective C static library to Swift Framework? – Stack Overflow

试试:

问题依旧。。。

Write Swift Module Cont. Static Library (使用 Swift 创建 Swift 模块 – 静态链接库) – 猫·仁波切

在Swift中调用Objective-C的静态库 – 小木之林

通过拖动桥接头文件过去,得到的是绝对路径:

但是问题依旧。

还是改回:

$(SRCROOT)/JianDao-Bridging-Header.h

搜:

swift JPUSH

swift 中调用jpush的问题 – 极光推送问答

如果后面JPUSHService可用的话,代码应该这么写:

JPUSHService.registerForRemoteNotificationTypes(UIUserNotificationType.Badge.rawValue | UIUserNotificationType.Badge.rawValue | UIUserNotificationType.Alert.rawValue , categories: nil)

 请问这个库可以使用swift语言吗 – 极光推送问答

swift 集成极光推送 – 极光推送问答

使用swift语言开发的ios应用能集成极光推送吗 – 极光推送问答

swift版本sdk什么时候可以支持? – 极光推送问答

有在 swift 项目中用 Jpush SDK 的吗 – V2EX

swift  object-c static lib not work

swift  .a lib not work

ios – Static Linking with Swift, XCode6-Beta – Stack Overflow

想办法去下载:

object-c static library

object-c static library download

别人帮忙找到:

https://github.com/jpush/jpush-swift-demo

下载看看

然后去对比,最终发现:

是app的Target中的Objective-C Bridging Header中的:

第二列中的值,只要设置好了对应的桥接头文件:

就可以编译通过了:

然后此处把自己的改为:

就可以正常编译了:

对应内部值是:

//:configuration = Debug
SWIFT_OBJC_BRIDGING_HEADER = JianDao-Bridging-Header.h
//:configuration = Release
SWIFT_OBJC_BRIDGING_HEADER = JianDao-Bridging-Header.h
//:completeSettings = some
SWIFT_OBJC_BRIDGING_HEADER

然后再去改为更好的:

$(SRCROOT)/JianDao-Bridging-Header.h

包括Project和Target:

然后再去试试

同样可以正常编译了。

然后再去看看对应的Compile Resource中,却还是没有对应的头文件:

但是是可以正常工作的。

对应的demo中,也是没有头文件的:

[总结]

swift项目中,想要试用Object-C的静态(static)库:xxx.a文件(以及对应的xxx.h)头文件的话,则需要:

1.导入已有的Object-C的.h头文件和.a静态库文件

一般做法是:

.h头文件放到项目源码对应位置

.a放到Frameworks厦门

如图:

2.swift项目中,创建对应的桥接头文件:

File-》New-》Header File-》

名为:YourProjectName-Bridging-Header.h

内容为:

你所想要导入的Object-C的头文件

比如:

我此处是:

JianDao-Bridging-Header.h

其中是:

#import "JPUSHService.h"

(注:

当然,如果你未来防止重复导入,可以保留默认的ifndef,完整内容为:

//
//  JianDao-Bridging-Header.h
//  JianDao
//
//  Created by licrifan on 16/3/10.
//  Copyright © 2016 licrifan. All rights reserved.
//
#ifndef JianDao_Bridging_Header_h
#define JianDao_Bridging_Header_h
#import "JPUSHService.h"
#endif /* JianDao_Bridging_Header_h */

3.给swift项目的编译选项添加对应的Object-C头文件

你的项目命-Target-》Build Settings-》Swift Compiler – Code Generation->Object-C Bridging Header-》切记,是第二列的那个你的app的图标的那个属性,把值改为:

xxx/YourProjectName-Bridging-Header.h

其中xxx为你的YourProjectName-Bridging-Header.h文件所在位置

比如我此处的:

$(SRCROOT)/JianDao-Bridging-Header.h

其中:

$(SRCROOT)表示项目根目录,即YourProjectName.xcodeproj所在的目录

如图:

当然,同时也要去把

第三列,iOS的项目的图标的那列的值,改为同样的值:

同理,再去Project中的确认该配置为同样的值(好像不需要设置,设置了Target就已经设置了Project了?,至少是第二列是这个逻辑:

设置了Targets中的第二列,Project的第一列的值,就无须设置,也无法修改了:

不过第二列是可以修改的,此处无须修改,只需要确认是对应的值即可:

[感慨]

此处,从始至终,就只是缺少了Target中的Object-C Bridging Header的第二列的值,而导致了-》无法正确找到桥接头文件,无法编译找到第三方加入的静态库。。。

抽空需要去研究研究:

到底在Targets中的第二列和第三列是什么含义。。。

以及:

Targets和Project中的设置,有何关系?

[已解决]Xcode中Project和Target之间的关系

转载请注明:在路上 » [已解决]swift中如何调用Object-C的.a的库函数

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
89 queries in 0.182 seconds, using 22.17MB memory