• OC项目中,有可能会遇到需要引入Swift写的第三方库,下面整理下OC项目如何使用Swift库 1.在已有的OC工程中新建一个Swift文件,命名为Test.swift,会弹出提示,选择Create Bridging Header建立桥接文件,系统会建立...

    OC项目引入Swift方法

    在OC项目中,有可能会遇到需要引入Swift写的第三方库,下面整理下OC项目如何使用Swift库

    1.在已有的OC工程中新建一个Swift文件,命名为Test.swift,会弹出提示,选择Create Bridging Header建立桥接文件,系统会建立“工程名-Bridging-Header.h”




















    2. 配置工程

    设置Defines Module 为Yes


    设置Product Module Name 为当前工程名 (有时系统会自动为我们设置好)


    此时系统会为工程创建一个“工程名-Swift.h”的文件(不会显示出来,可以引用),此文件不可手动创建,必须使用系统创建的

    3.测试是否成功

    新建一个Swift文件,写一个Swift的函数

    import UIKit
    
    class Test1: NSObject {
    
        func show()
        {
            print("hello baby!")
        }
    }

    在OC工程里调用该函数


    成功!

    以后在使用的地方直接引用"工程名-Swift.h",不需要引用Swift文件














    展开全文
  • Swift SDK 开发详解

    2018-02-02 13:56:16
    前言 日常的开发中,我们经常会遇到这样的开发需求。比如 不能提供源码,暴露部分接口出去、 项目功能组件模块化等。...之前,使用OC尝试过SDk的开发,感觉还是比较繁琐,接下来我们就使用Swift进行SDK开发。 开发

    前言

    日常的开发中,我们经常会遇到这样的开发需求。比如 不能提供源码,暴露部分接口出去、 项目功能组件模块化等。这个时候,我们一般就想到了sdk开发。在OC的开发中,我们涉及到的一般是静态库(.a)或者动态库(.framework)。(注:不是所有的.framework就一定是动态库)。之前,使用OC尝试过SDk的开发,感觉还是比较繁琐,接下来我们就使用Swift进行SDK开发。


    开发准备

    静态库和动态库的对比,我们在这里就不论述了。想要了解,可以查看 What are Frameworks,下面进行SDK开发。

    新建一个framework工程

    1、打开Xcode, command+shift+N
    这里写图片描述

    2、工程配置
    这里写图片描述
    3、工程目录
    这里写图片描述
    4、开发SDK示例
    我们在项目工程中,开始我们的开发工作。
    假如我们要实现一个类文件,暴露出去一个方法 对输入的名字 添加一个简单的描述。
    这里写图片描述

    在上面的代码中,我们可以看到 open class 和 open func.
    这是在swift 的sdk开发中,我们不用再像OC那样选择头文件暴露出去。我们可以通过open 和 public 来处理我们需要暴露出来给外界访问的类或者方法等。

    关于在开发中,我们是使用public还是open.

    public:可以在任何地方访问。但其他 module 中不可以被 override 和继承,而在 module 内可以被 override 和继承。
    open: 可以在任何地方访问到,同时可以被继承和 override 。

    简单的配置sdk

    这里写图片描述


    调试framework

    1、拖拽引入项目(不推荐)

    将Products 下的.framework 拖拽添到我们需要的项目工程中。这个虽然可以,但是调试起来比较麻烦,稍有改动,我们就要删除之前的,重新引入新版本的.framework.

    2、创建workspace
    1、我们新建一个项目工程用来测试我们开发的SDK

    这里写图片描述

    2、将我们的SDK工程文件拖进到我们新建的测试工程文件中

    这里写图片描述

    3、打开新建的测试工程引入sdk工程

    这里写图片描述

    此时我们可以发现在导航栏里面 我们有了两个build target
    这里写图片描述
    此时我们可以随时切换编译的目标,方便我们在开发中测试。

    4、在测试工程中,引入sdk,并使用。

    这里写图片描述

    扩展

    在上面文章中,我们简单的了解到了如何开发sdk,怎么简单有效的测试。但是这样就足够了吗? 显示是不够的。
    我们通常还会有以下的使用场景需要处理。

    1. 开发的sdk怎么同时支持模拟器和真机?
    2. 开发的sdk,有时候不仅仅是功能的封装,有时候会有UI的封装。例如:我们常见的IMSDK等。这个时候,牵扯到的资源文件怎么处理?
    3. 我们开发的sdk,功能比较复杂,引用了一些开源库,我们在sdk中怎么处理?

    首先我们来处理第一个问题。

    常见的处理方式呢 就是使用lipo 命令。
    找到products下文件夹 打开然后将debug 和release 的 frame合并

    查看sdk的架构

    lipo -info xxx

    合并sdk

    lipo -create  a路径 b路径 -output c路径

    添加脚本处理

    添加target

    这里写图片描述
    这里写图片描述

    #添加运行脚本

    这里写图片描述

    编写脚本

    这里写图片描述

    脚本的全部代码,粘贴进去即可。

    #!/bin/sh
    
    UNIVERSAL_OUTPUTFOLDER=${BUILD_DIR}/${CONFIGURATION}-universal
    
    # make sure the output directory exists
    mkdir -p "${UNIVERSAL_OUTPUTFOLDER}"
    
    # Step 1. Build Device and Simulator versions
    xcodebuild -target ${PROJECT_NAME} ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos  BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build
    xcodebuild -target ${PROJECT_NAME} -configuration ${CONFIGURATION} -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build
    
    # Step 2. Copy the framework structure (from iphoneos build) to the universal folder
    cp -R "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework" "${UNIVERSAL_OUTPUTFOLDER}/"
    
    # Step 3. Copy Swift modules from iphonesimulator build (if it exists) to the copied framework directory
    SIMULATOR_SWIFT_MODULES_DIR="${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/Modules/${PROJECT_NAME}.swiftmodule/."
    if [ -d "${SIMULATOR_SWIFT_MODULES_DIR}" ]; then
    cp -R "${SIMULATOR_SWIFT_MODULES_DIR}" "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/Modules/${PROJECT_NAME}.swiftmodule"
    fi
    
    # Step 4. Create universal binary file using lipo and place the combined executable in the copied framework directory
    lipo -create -output "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework/${PROJECT_NAME}"
    
    # Step 5. Convenience step to copy the framework to the project's directory
    cp -R "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework" "${PROJECT_DIR}"
    
    # Step 6. Convenience step to open the project's directory in Finder
    open "${PROJECT_DIR}"
    

    到此,合并sdk就到此结束。

    处理第二个问题:资源文件

    在提供sdk开发的时候,我的建议是把我们所使用的资源文件,使用bundle的形式提供。具体的可参照我们经常使用的sdk,如:友盟分享sdk等。
    建议bundle的命名跟sdk的名字保持一致,减少图片重名冲突的可能性。
    1、bundle的创建
    bundle的创建是很简单的,我们直接新建一个文件夹,将资源文件放进去,文件件名称后缀改成.bundle即可。
    2、sdk中访问bundle的资源
    在sdk中,我们就不能再直接的访问图片资源了,需要加上图片的资源路径。
    代码示例:

    import UIKit
    
    open class SwiftSDKClass: NSObject {
        open func test(name:String)-> String{
            return self.addName(name: name)
        }
        open func getImage(name:String)->UIImage{
            let path = Bundle.main.resourcePath ?? ""
            let bundle = Bundle(path:path + "/SwiftSDK.bundle");
             if let currentbundle =  bundle {
                let imagePath = "\(currentbundle.resourcePath!)/\(name)"
                return UIImage.init(contentsOfFile: imagePath)!;
             }else{
                print("bundle 资源路径不存在");
                return UIImage();
            }
        }
        func addName(name:String)->String{
            return "我的名字是\(name)";
        }
    }
    

    访问资源的路径

    这里写图片描述
    获取到bundle的资源文件
    这里写图片描述

    到此,第二个问题,算是解决。将代码和资源文件做了分离。当然,并不是所有的资源文件一定要这么做。如果资源很少也比较小,也可以直接打包在sdk中。

    处理最后一个问题:第三库的引入问题

    在我们进行sdk开发时,有时难免设计到一些功能或者业务逻辑使用到第三方开源库。
    我的建议是不要在sdk工程中直接引用,建议使用cocoapods或者其他第三库管理工具。在我们的sdk的引入指南中,告诉引入的工程目录集成 sdk中所使用的第三方开源库及其版本。

    展开全文
  • OCswift相互调用

    2017-04-26 11:39:33
    一、OC调用swift文件 二、swift调用OC文件 三、注意和总结 添加: 四、自定义桥接文件  一、OC调用swift文件  在OC项目中创建一个swift文件的时候,Xcode 会提示 需要创建一个桥接文件,点确定...

    一、OC调用swift文件

    二、swift调用OC文件

    三、注意和总结

    添加:

    四、自定义桥接文件 

    一、OC调用swift文件

      在OC项目中创建一个swift文件的时候,Xcode 会提示 需要创建一个桥接文件,点确定创建桥接文件,Xcode会自动创建一个桥接文件

    名字:工程名-Bridging-Header.h

    这个桥接文件是 swift 调用OC文件的时候用的

    1、

      进入TARGETS ->Build Settings -> Packaging 中

    设置Defines Module为YES

    设置 Product Module Name ,也可以不设置,默认为工程的名字。这个在后面会用到

    2、

      在swift写一个类

    注意这个类一定要继承NSObject,不然在OC中没法用

    class hello: NSObject {

        var address : String
        var gender: String
       
        init(address:String,gender:String){
            self.address = address
            self.gender = gender
        }
       
        func method() {
            print("message \(self.address + self.gender)")
        }
    }

    3、

      在OC需要用到的swift文件中 导入文件 "Product Module Name -Swift.h"  因为 Product Module Name 默认是工程的名字

    所以直接导入 #import "工程名-Swift.h"

    4、

      记着写完先command +B编译一下,如果没有报错就可以在OC文件调用swift中的类了

    hello *helloss = [[helloalloc]initWithAddress:@"上海"gender:@"男"];
    [helloss method];

     

    二、swift调用OC文件

      在swift项目中创建一个OC文件的时候,Xcode 会提示创建一个桥接文件 点确定创建桥接文件,Xcode会自动创建一个桥接文件

    名字:工程名-Bridging-Header.h

      把swift需要用到的OC文件的头文件放到桥接文件里 工程名-Bridging-Header.h

    例如:

    1、

    这个就是一个OC文件
    //#import "sec.h"
    #import <UIKit/UIKit.h>
    @interface sec : UIViewController
    -(void)actionMake;
    @end
     

    2、

    在桥接文件中把需要用到OC的头文件导入进去
    #import "sec.h"
     

    3、

    编译一下,就可以在swift中用swift的语法调用OC文件的方法了
    let second = sec()
    second.actionMake()

     

    三、注意和总结

    注意:

    1、OC项目在导入swift文件前 先按照系统提示创建桥接文件,
    2、在 targets -> Build Settings -> Packaging  中设置Defines Module 为YES
    3、在OC中调用swift文件的时候,swift中的类 要继承NSObject
    不然没办法在OC中调用
    4、OC中调用swift文件需要导入”工程名 -Swift.h"
         (这个是build Setting -> Packaging->Product Module Name 的名字,而这个属性默认是工程的名字)
    5、写完记得command + B 编译 一下
    6、swift项目 引用OC文件也需要创建 桥接文件,在这个桥接文件中导入OC文件的头文件
    7、桥接文件只有一个,作用只是为了 swift 引用OC文件,OC引用swift 文件虽然也需要创建桥接文件
            但是不需要在桥接文件中 导入swift文件
    8、如果一个项目既有OC引用swift 也有swift引用OC ,就先设置OC调用swift文件
         在桥接文件 导入OC文件,OC可以定义PCH文件导入”工程名 -Swift.h" 

     

     

    四、自定义桥接文件 

     

    如果不用Xcode提示创建桥接文件也可以自定义一个桥接文件

     

    1     使用 Header File  把里面的内容清空。

     

    2、 这文件名可以自定义, 一般还是用 工程名-Bridging-Header.h   例如app - file.h

     

    3    然后在 Build Setting -> Swift Compiler - Code Generation中

     

    4、设置Objective-C Bridging Header 为自定义的桥接文件相对于工程的绝对路径,也就是项目总文件夹的路径,如果在第一层,就直接写自定义的桥接文件的名file.h,如果在下一层,文件夹/桥接文件 app/file.h 
    展开全文
  • 所以慢慢多了很多OC混编Swift的项目,但是其实swift调用OC还是挺简单的,把OC项目慢慢转成swift问题不大。swift可以算是OC更上层的语言,我这里说的坑都是关于SwiftOC的,很奇葩吧,还有把Swift项目转成OC的,一句...

    原文地址

    简述:最近几年苹果主推swift,OC已经很少更新了,处于维护状态。所以慢慢多了很多OC混编Swift的项目,但是其实swift调用OC还是挺简单的,把OC项目慢慢转成swift问题不大。swift可以算是OC更上层的语言,我这里说的坑都是关于Swift转OC的,很奇葩吧,还有把Swift项目转成OC的,一句话公司需求,怼得程序员无言以对。(废话不多说了,后面全是骂项目经理和产品的。。。省略一万字)

    OC和Swift混编的基础设置就不说了,可以看我之前的一个文章
    https://www.jianshu.com/p/69ba19692bae

    一. OC调用Swift中的Class类这里

    1.这个类必须是继承NSObjec或者NSObjec的子类

    2.Class前面要加@objcMembers (这个关键字是让该类所有属性和方法加上@objc),3.0之前是苹果自动帮你加上的,据说嫌弃打包会偏大一些,后面改成玩家自己加。
    例如:@objcMembers class CustomServiceTool: NSObject {}

    3.类中的协议、枚举、结构体这些东西的调用
    ① 协议:直接在前面加一个@objc
    @objc protocol CustomServiceToolDelegate: NSObjectProtocol {}

    ②枚举:试了一下,必须定义出Int类型,前面加@objc才能调用(毕竟swift的枚举比OC强大太多)
    @objc enum CPLineType: Int {
    case schoolToHome = 0
    case homeToSchool
    case return
    }

    ③结构体:在oc中是不能调用struct里面的内容的,你想在类似class前面加个@objc的方法加在struct前面是不行的,那但是我们又想在oc中调用struct的属性,那怎么办呢?我们只能够再建一个类,在类里写个方法来返回struct中的值

    坑点:
    1.每次在一个类前面加个@objcMembers的时候都需要重新编译一遍才能打出提示(混编期间,报错请不要怀疑自己的代码,大部分编译一下就没事了。。。)
    2.有种特殊的情况,比如我一个OC控制器中调用了swift写的view,然后其他用swift写的控制器需要调用OC控制器,这时候要是只是把OC控制器写到桥接文件中是会报错的。(这种就是混编项目比较变态的情况)------------解决办法:swift写的View用向前声明( @class BannerView);
    3.swift中的一些类型是OC没有的,或者类型名字差不多但是类型完全不同
    例如:
    swift中的Int定义成可选类型的时候,这时候OC是调不了swift的Int类型,解决方式,定义普通Int型

     

    展开全文
  • 如何新建:一般情况,在Swift工程中新建一个OC类,或者在OC工程新建一个Swift类,系统就会提示你是否创建,选择是就行了,然后再删除你刚刚创建的无用文件。如下图(在OC工程中创建的): 如果你选择了取消,可能下一...
    1. 新建Briding-header.h
      Briding-header.h是Swift和OC的桥接文件,没有是不行的
      如何新建:一般情况,在Swift工程中新建一个OC类,或者在OC工程新建一个Swift类,系统就会提示你是否创建,选择是就行了,然后再删除你刚刚创建的无用文件。如下图(在OC工程中创建的):这里写图片描述这里写图片描述

    如果你选择了取消,可能下一次就不会提醒了,这时你需要手动添加,文件名一般为:工程名-Bridging-Header.h

    这里写图片描述
    这里写图片描述

    进入 YourTarget -> Build Settings -> Swift Compiler-Code Generation 这个设置项里面,把你的 .h 文件的【绝对路径】输入到 Objective-C Bridging Header 里面就可以了。

    2.导入相应的头文件

    3.使用:
    Swift工程使用OC
    首先在上面创建的桥接文件导入OC头文件
    let 实例名 = 类名()
    实例名.方法名(参数名1:参数1,参数名2:参数2)

    OC工程使用Swift
    首先导入#import “工程名-Swift.h”,如你新建的工程是Confuse,#import “Confuse-Swift.h”
    类名 *实例名 = [[类名 alloc] init];
    [实例名 方法名];

    • 使用 swift 的属性
      swift 文件的属性前面需要使用 @objc 修饰,如:
      @objc var name: String!
      然后 oc 文件就可以直接 实例.name 去访问了

    • 使用 swift 的block
      swift 文件
      typealias openSuccess = (_ dic: NSMutableArray) -> Void
      @objc var openSuccessBlock: openSuccess?
      然后 oc 文件就可以直接 实例.openSuccessBlock 去使用了

    展开全文
  • 1. swiftoc混编译具体怎么实现,这儿我就不重复讲出了,网上有大把的人讲解。 2. 在swiftOC混编的编译环境下, oc类不能访问swift创建类中的代理? 解决方法如下: 在代理的头部加上 @objc(代理...
  • 首先就是在 targets->Build Setting ->Packaging 中设置 Defines Module为YES  然后创建swift文件时会生成"文件名-Bridging-Header.h"这样一个桥接文件 怎样使用cocoapods就不多... 因为swift使用的是框架而不是静态库
  • swift导入oc第三方库

    2019-05-05 15:31:39
    对于ios开发而言,目前很多第三方库或者demo还是以oc为主,swift相关的资料很少,这篇文章就结合博主的开发实例对在swift工程中导入并使用oc版本的第三方库进行阐述。 正文 1.编写oc桥接头文件 顾名思义,将oc编写的...
  • Swift调用OC第三方框架

    2017-08-31 10:07:50
    1.在项目中添加一个Briding-Header.h文件 2.在Xcode->Target-->ild settings--->objective-c Bridgin-Header中添加 项目名字/.h...3.在Briding-Header.h文件中添加你想使用的第三方框架 相关的头文件后就可以使用
  • 最近使用swift的时候引用了OC文件,就给大家说一下我的个人经验,以供大家参考。 一、是直接将OC文件拉到Swift的工程中,然后Xcode会自动创建桥接头文件,这种就比较省事了,Xcode给你自动创建。 二、就是Xcode...
  • 最近由于项目需求需要使用Swift做开发,但之前的好多有用的东西都是使用OC写的,鉴于这种情况最好的方式当然是使用swift重写,但这样的工作量太大,而且不能保证功能的稳定性,所以自己就尝试的使用Framework来嵌入...
  • #### 1、OC工程项目导入Swift 版本的framework静态库后,模拟器和真机编译都通过,但是模拟器环境下无法调用库里面的类,真机环境可以 #### 2、如果是Swift项目工程引入这个Swift静态库没有任何问题 1、 真机可以...
  • 2.讲SDK包添加到项目中,新建一个桥接文件BridgingHeader.h并设置好(Build Settings -> Swift Compiler - code Generation -> Objective-C Bridging Header 填入“BridgingHeader.h”),BridgingHeader.h 中 加入...
  • OCswift 混编会让iPA 的包增大20M,即使你只有几个swift 文件,每一个swift文件代码都不多都可能增加20M bitcode 会让ipa 包增加1.5M左右 cocoapod 的设置Objc打开会增加ipa的大小,几M左右,而且这个Objc 是最好要...
  • 使用Swift开发SDK的优点是,生成的SDK对于Obj-C或是Swift调用都不需要自己去建桥接文件,因为SwiftSDK打包时默认已经自动生成供OC调用的.h文件。OC调用时直接import,sdk中的.h文件即可。而Swift调用时,import该...
  • 虽说是SwiftOC混编SDK,但目前只支持项目中使用Swift调用OC的工程,暂不支持OC调用Swift的工程打包Framework,因为“productName-Swift.h”文件是隐藏的,无法暴露出来,因此也就不可能引用,如果哪位大神有办法...
  • 建立桥接头文件 设置桥接文件位置 引入需要的framework #ifndef bridge_h #define bridge_h #import "AFNetworking.h" #endif /* bridge_h */ ...var dataTask = AFHTTPSessionManager.init().post(<...
  • OCswift混编在最上层项目中混编swift引用swiftswift引用OCOC引用swiftOC引用OC在Framework层混编swift引用swiftswift引用OCOC引用swiftOC引用OC上层项目引用Framework时混编swift引用swiftswift引用OCOC引用swift...
  • OCSwift混合开发技巧

    2015-03-29 10:01:35
    在苹果推出了swift语言之后,很多人担心OC很快会被取代,但是苹果方面表示2年内不会摒弃OC。但现在也快了啊。有的开发团队已经开始基于swift开发,但是有很多旧的框架还没来得及用swift写出来,并且某些swift的功能...
  • OCSwift混编

    2019-07-11 01:04:27
    Swift工程中使用OC sdk. 原理就是通过建立桥接文件,将OC转成Swift. 两种方式,方式一 创建任一OC文件,xcode会自动提示创建桥接文件。 方式一不行的话尝试方式二,手动创建桥接文件。(1) 如下图,命名格式为 ...
1 2 3 4 5 ... 20
收藏数 1,848
精华内容 739
热门标签
关键字:

oc使用swift sdk