怎么逆向oc和swift混编。_逆向 swift - CSDN
  • 关于OC和Swift混编的基本使用

    千次阅读 2016-06-15 10:32:23
    概述 Swift的设计的初衷就是摆脱...随着Swift的改进及Swift开源项目剧增,越来越多的Objective-C工程开始使用Swift混编,不管是在基于Swift工程中或者Objective-C工程中,SwiftObjective-C文件都可以无缝结合。本文

    概述

    Swift的设计的初衷就是摆脱ObjC沉重的历史包袱,毕竟ObjC的历史太过悠久,相比于很多现代化语言它缺少一些很酷的语法特性,而且ObjC的语法和其他语言相比差别很大。随着Swift的改进及Swift开源项目剧增,越来越多的Objective-C工程开始使用Swift混编,不管是在基于Swift工程中或者Objective-C工程中,Swift和Objective-C文件都可以无缝结合。本文首先介绍下Swift与Objective-C混编的基本使用。

    Objc与Swift的渊源

    通过对swift的了解,大家不难发现Swift和ObjC必然存在着一定的映射关系,例如对于文件的操作使用了字符串的writeToFile方法,在网络请求时使用的NSURLSession,虽然调用方式不同但是其参数完全和做ObjC开发时调用方式一致。原因就是Swift编译器自动做了映射,如下图:(PS:借来的图)

    这里写图片描述

    Objc和Swift的相互调用

    切入正题,当我们使用OC和Swift在工程中进行混编的时候,通俗来说其实Objc文件和swift文件之间的相互调用。不管你的项目是基于Swift还是基于Objc的,无论是Swift中调用ObjC,还是ObjC中调用Swift都是通过头文件暴漏对应接口的,下图说明了这种交互方式:

    这里写图片描述


    • Swift调用Objc

    下面我们先建个Objc的工程,在Objc工程中新建Swift文件时,(或者在Swift工程新建Objc文件),Xcode会自动提示你是否创建bridging header桥接头文件,点击创建后Xcode会自动为你创建一个桥接头文件。Xcode会自动创建一个名为OC_Swift-Bridging-Header.h桥接头文件如图下图:

    这里写图片描述

    当然你也可以在Building Settings中自己设置桥接头文件,如下图:

    这里写图片描述

    创建好OC_Swift-Bridging-Header.h文件后,在OC_Swift-Bridging-Header.h文件中即可import需要提供给Swift的Objective-C头文件,Swift即可调用对应的Objective-C文件。同时Xcode可以自动生成Objective-C对应的Swift接口。

    ( PS:Objective-C类、协议、属性、方法、扩展、闭包等所有功能都可以无缝地被转换为Swift接口被Swift文件所调用。)


    • Objc调用Swift

    Xcode会自动为Project生成头文件以便在Objective-C中调用。在Objective-C类中调用Swift,只需要#import “productModuleName-Swift.h”即可调用,Xcode提供的头文件以Swift代码的模块名加上-Swift.h为命名。
    (PS:我这有个通俗的理解方式,不喜勿喷,可能不专业,但是好理解。。 “productModuleName-Swift.h文件可以理解为:这个是Objective-C调用Swift的,你写的swift文件在这个文件里对外提供了OC使用的接口,OC调swift,引入这个文件,相当于直接可以使用对外接口了,你可以通俗理解 平常OC的.h文件留的接口)
    在这个头文件中,将包含Swift提供给Objective-C的所有接口、Appdelegate及自动生成的一些宏定义。

    在大部分情况下,Objective-C都可以无缝地调用Swift,但是由于Swift相对于Objective-C多了一些新特性,比如泛型、元组、枚举的等,所以Swift暴漏给Objective-C的接口多了一些限制,因此Swift只能暴露在Objective-C中有效的接口。

    展开全文
  • 首先我发现在编写Swift代码的时候,经常会遇到Xcode不能提示,卡顿,直接闪退等问题,尤其是在Swift和OC混编时。(不知道其他开发者是否也有这样的经历,但是我相信这样的问题,很快会得到解决) 然后感觉Swift并...

    阅读此文章前,您已经有一定的Object-C语法基础了!)

    2014年,Apple推出了Swift,最近开始应用到实际的项目中。

    首先我发现在编写Swift代码的时候,经常会遇到Xcode不能提示,卡顿,直接闪退等问题,尤其是在Swift和OC混编时。(不知道其他开发者是否也有这样的经历,但是我相信这样的问题,很快会得到解决)

    然后感觉Swift并不像网上很多朋友说的那样简单。有很多细节问题是值得注意的,甚至有很多思路是颠覆了传统的开发语言的!又有很多特性是结合了其他编程语言的优点!

    Swift,我个人觉得是趋势,是目前最前卫的开发语言,结合了众多开发语言的优点!
    网上已经有很多Swift相关的论文和博客了,这里我不做推荐和转载了!我归纳一下类和结构体,以及相关的知识吧!

    Swift中,类和结构体都是对数据和方法进行封装的常用做法!首先我们来看看他们的共同之处:

    1. 都可以有属性和方法;

    2. 都有构造器;

    3. 都支持附属脚本;

    4. 都支持扩展;

    5. 都支持协议。

    然后我们来看看他们的不同之处:

    1. 类有继承;

    2. 结构体有一个自动生成的逐一初始化构造器;

    3. 在做赋值操作时,结构体总是被拷贝(Array有特殊处理);

    4. 结构体可以声明静态的属性和方法;

    5. 从设计模式的角度来分析,类的设计更侧重于对功能的封装,而结构体的设计更侧重于对数据的封装。(汽车与书架来区分类与结构体)

    一、构造过程

    1. 默认值

    在OC 类和结构的成员属性会隐式的给出默认值,对象的默认值是nil,基本数据类型的默认值是0。但是在 Swift 中属性必须显示的设置默认值,Swift会在调用构造器之前调用默认值构造器对所有在设置了默认值的属性进行初始化。

    当一个构造过程完成的时候,被构造的类或者结构体的实例的存储属性都会是有值的,否则编译错误!

        class A : SuperClass {
            var _a = 1      // 默认值 = Int(1)
            var _b: Int?    // 默认值 = nil
            var _c: Int     // 无默认值,必须在构造器中赋值
            var _d: Int!    // 默认值 = nil
            init() {
                _c = 1      // 在调用父类的构造器之前,必须给_c赋值,否则编译错误
                super.init()
            }
            ...
        }

    2. 构造器

    类似与OC的 -(instance)init 方法。和OC最大的区别是 OC 初始化完成后返回的是这个对象的指针,而Swift初始化完成后返回的是这个对象的引用。

    根据构造器的实际构造过程可将构造器分为 便利构造器指定构造器,但只有指定构造器才是真实的构造器,便利构造器只是为指定构造器添加一个便利的参数传入,或者增加一些附加操作。

    以下几点在开发的时候需要注意:

    1. 类和结构体都需要在构造器完成对所有存储属性的初始化;

    2. 子类在调用父类的构造器之前必须确保本类声明的所有的存储属性都已经有值了;

    3. 便利构造器必须直接或者间接的调用本类的指定构造器。

    class A : SomeClass {
         var _a: Int
         var _b = 1_000
         // 指定构造器
         init() {
             self._a = 5     // 如果是这样声明的 'var _a: Int = 5' or 'var _a = 5',那么init()构造器可以不写而直接调用
             super.init()
         }
         // 指定构造器
         init(a: Int) {      
             self._a = a     // 因为 _a 属性没有默认值,所以在调用 super.init() 前必须给 _a 赋值,否则编译错误!
             super.init() 
         }
         // 便利构造器
         convince init(a: Int, b: Int) {
             self.init(a: a + b)         // 直接调用指定构造器
         }
         // 便利构造器
         convince init(a: Int, b: Int, c: Int) {
             self.init(a: a, b: b + c)   // 间接调用指定构造器
         }   
         ...
     }

    3. 析构器

    和OC的 dealloc 很像,这里不多做解释了。

    class A {
        ...
        deinit {    
            //...  析构器内部处理
        }
        ...
    }

    二、属性

    OC中的类有属性,也有实例变量。但Swift中将类的实例变量和属性统一用属性来实现。

    1. 存储属性

    简单来说就是一个成员变量/常量。Swift可以为存储属性增加属性监视器来响应属性值被设置时的变化。

    class SomeClass {
        let _a = 100        // 常量
        var _b: Int         // 没有默认值的变量
        var _c = 200        // 默认值=200的Int变量
        var _d: Int = 200 { // 默认值=200的Int变量,如果增加了属性监视器,必须显示的声明变量类型
            didSet {
                println("A 的 _c 属性 didSet = old:\(oldValue) -> \(self._c)")   // oldValue 表示曾经的值
            }
            willSet {
                println("A 的 _c 属性 willSet = \(self._c) -> new:\(newValue)")  // newValue 表示将会被设置的值
            }
        }
    }

    2. 计算属性

    计算属性并不存储任何数据,他只是提供 set/get 的便利接口。

    class A {
        class var a: Int {  // 这是类的计算属性 (区别于下面类的实例的计算属性)
            return 1001
        }
        private(set) var _b = 100   // 外部可以访问,但不能修改
        private var _a = 100        // 私有变量,外部不能访问
        var a: Int {                // 只读计算属性
            return _a
        }
        var b: Int {                // 可读可写的计算属性
            get {
                retrun _a
            }
            set {
                _a = newValue       // newValue 表示的是输入的值
            }
        }
    }

    3. 延迟存储属性

    相 信大家都听说过延迟加载(懒加载),就是为了避免一些无谓的性能开销,在真正需要该数据的时候,才真正执行数据加载操作。 Swift可以使用关键字 lazy 来声明延迟存储属性,延迟存储属性在默认值构造器中不会被初始化,而是在第一次使用前进行初始化! 虽然没被初始化,但是编译器会认为他是有值的。

    全局的常量或者变量都是延迟加载的, 包括结构体的静态属性也是延迟加载的。

    let some = A()
    class A {
        lazy var view = UIView(frame: CGRectZero) // 定义了一个延迟存储属性      ...
    }

    4. 静态属性

    结构体可以使用关键字 static 来声明静态存储属性。(枚举也可以有) Swift的类不支持静态属性,也不支持静态临时变量。 这可以作为Swift中声明单例的一种实现方:

    class Tools {
        class func sharedInstance() -> Tools {
            struct Static {
                static let sharedInstance = QNTools()
            }
            return Static.sharedInstance
        }
    }

    三、方法

    Swift的类和结构体都可以定义自己的方法!(OC的结构体是没有方法的)

    1. 参数

    一个方法的参数有局部参数名称和外部参数名称,一样时写一个即可! Swift的方法的参数非常灵活,可以是值,可以是引用,可以是闭包,可以是元组... Swift的方法的返回值跟参数一样灵活

    这里给出一个简单的加法方法来展示方法的参数:

    class A {
        // eg. 一个简单的相加方法
        // 完整版
        class func sum1(let a/*外部参数名称*/ aValue/*内部参数名称*/: Int, let b/*外部参数名称*/ bValue/*内部参数名称*/: Int) -> Int {
            return aValue + bValue
        }
        // 当函数参数的外部和内部参数相同的时候,可以只写一个,  此时第一个参数的名称在调用时是隐藏的
        class func sum2(a: Int, b: Int) -> Int {
            return a + b
        }
        // 使用 _ 符号,可以在调用的时候隐藏函数参数名称,第一个参数默认就是隐藏的
        class func sum3(a: Int, _ b: Int) -> Int {
            // 内嵌函数的参数名称,都是可以隐藏的。而不用使用 _ 符号声明
            func sum4(a: Int, b: Int) -> Int {
                return a + b
            }
            return sum4(a, b)
        }
        // 可使用 let/var 关键字来声明参数是作为常量还是变量被传入,(如果是常量,可以不用显示的写 let)
        class func sum4(let a: Int, _ b: Int) -> Int {
            // 内嵌函数的参数名称,都是可以隐藏的。而不用使用 _ 符号声明
            func sum4(a: Int, b: Int) -> Int {
                return a + b
            }
            return sum4(a, b)
        }
        // 可使用 let/var 关键字来声明参数是作为常量还是变量被传入,(如果是常量,可以不用显示的写 let)
        class func sum5(let a: Int, let _ b: Int) -> Int {
            // 内嵌函数的参数名称,都是可以隐藏的。而不用使用 _ 符号声明
            return a + b
        }
        class func sum6(var a: Int, var _ b: Int) -> Int {
            // 内嵌函数的参数名称,都是可以隐藏的。而不用使用 _ 符号声明
            a++
            b++
            return a + b
        }
        // 可使用 inout 关键字,传引用
        class func add(inout value: Int) {
            value++
        }
    }

     

    A.sum1(a: 1, b: 2)          // result: 3
    A.sum2(1, b: 2)             // result: 3
    A.sum3(1, 2)                // result: 3
    var aTemp: Int = 1001       // aTemp = 1001
    A.add(&aTemp)
    aTemp                       // aTemp = 1002
    A.sum5(1, 2)               // result: 3
    A.sum6(1, 2)               // result: 5

    2. 实例方法

    类或者结构体的实例所拥有的方法!

    class A {
        private(set) var a: Int = 100
        func reset() -> Void {
            self.a = 100
        }
    }
    struct S {
        var a: Int = 100
        mutating func reset() -> Void { // 注意: 在结构体和枚举的实例方法中如果需要修改属性,则需要增加 mutating 字段
            self.a = 100
        }
    }

    3. 类方法

    Swift 中类的本身也是一个实例。他没有存储属性、但拥有计算属性和方法! 

    参考 “1.参数” 中的示例

    4. 静态方法

    结构体可以使用关键字 static 来声明静态方法。

    struct S {
        static func name() -> String {
            return "Liuyu"
        }
    }

    四、附属脚本

    Swift 提供了附属脚本的语法来简化类似查询的行为。如访问一个数组的第n个元素,array[n], 访问一个字典的值 dictionary[“key”],这些都可以通过附属脚本来实现。 这里给出一个通过字符串类型的索引来查询数组中的元素的例子。

    // 扩展一个通过字符串类型的位置来访问数据的附属脚本
    extension Array {
        subscript(index: String) -> T? {
            if let iIndex = index.toInt() {
                return self[iIndex]
            }
            return nil
        }
    }
    let array = ["Liu0", "Liu1", "Liu2"]
    array[1]    // result : Liu1
    array["1"]! // result : Liu1

    五、继承

    和OC一样,Swift类可以通过继承来获取父类的属性和方法(有限制)。 Swift的类的在继承上增加了很多安全措施

    class SomeSuperClass {
        func someFunc1() {
            ...
        }
        // 定义不能被子类重写的方法,需要加上 final 关键字
        final func someFunc2() {
            ...
        } 
    }
    class SomeClass : SomeSuperClass {
        // 重载父类的方法,需要加上 override 关键字
        override func someFunc1() {
            ...
            super.someFunc1()
        }
        // 不能被子类重写的方法
        override func someFunc2() {     // Error
            ...
            super.someFunc2()
        }
    }

    六、扩展

    扩展就是向一个已有的类、结构体或枚举类型添加新功能。 这包括在没有权限获取原始源代码的情况下扩展类型的能力(即逆向建模)。 扩展和OC中的类别(categories)类似,但又有很多细微的区别:

    1. 扩展没有名字,一旦扩展就会应用到整个工程(模块)

    2. 在扩展中如果要重载现有的方法,需加上override关键字 (不建议修改现有的方法)

    3. 可定义新的嵌套类型

    这里给出一个数学项目中计算距离时的一个扩展

    typealias Distance = Double
    extension Distance {
        var km: Double { return self/1_000.0 }
        var m : Double { return self }
        var cm: Double { return self*100.0 }
        var mm: Double { return self*1_000.0 }
    }
    let distance = Distance(1000)   // 1000m的距离
    distance.km     // result : 1.0     (km)
    distance.m      // result : 1000.0  (m)
    distance.cm     // result : 100.0   (cm)

     

    转载于:https://www.cnblogs.com/Free-Thinker/p/4835425.html

    展开全文
  • 我们在用数据网络下载APP的时候,若是APP体积大于150MB,AppStore便会提示“此项目大于150MB,除非此项目支持增量下载,否则您必须连接至WiFi才能下载”...
        

    我们在用数据网络下载APP的时候,若是APP体积大于150MB,AppStore便会提示“此项目大于150MB,除非此项目支持增量下载,否则您必须连接至WiFi才能下载”。可见如果IPA安装包过大,是极不利于App推广的,那么我们今天的Topic:如何减少App体积?

           最近我们产品由于运营需要接入了三方库,上线后App体积徒增,组内的同学关于IPA瘦身有一些实践和思考, 常规的方法如下图,不是本文重点讨论的内容,如需了解自行百度。

    640?wx_fmt=png

    关于APP Architecture 

           由于历史原因我们APP Architecture设置一般都是arm64,armv7,arm7s,使用MochOView可以查看我们可执行文件支持的架构如图,其实我们的动态库也是Fat Header比如一个30M的MachO ,那么15Mb是64-bit,另外15Mb是32-bit:

    640?wx_fmt=jpeg

           通过整理可知armv7|armv7s|arm64都是ARM处理器的指令集,i386|x86_64 是Mac处理器的指令集表格如下:

    arm设备
    arm64iPhone5s 之后的所有设备
    armv7siPhone5|iPhone5C|iPad4(iPad with Retina Display)
    armv7iPhone4|iPhone4S|iPad|iPad2|iPad3(The New iPad)|iPad mini|iPod Touch 3G|iPod Touch4
    i386模拟器32位处理器
    x86_64模拟器64位处理器

           通过上表可知32位设备离我们最近的已经是6年前的设备iPhone5了,如果不是超级APP完全有理由放弃支持armv7,armv7s架构,没必要让99%的用户为1%的用户浪费流量,这样我们的动态库和二进制可执行文件会减少50%的体积,另外在Xcode 9.0 release note里边有这样的描述,如果你支持到iOS 11则自动不支持32-bit,可见Apple也已经建议不支持32位。(Apps with a deployment target of iOS 11 no longer build a 32-bit slice. To build and include a 32-bit slice, set the deployment target to an earlier version of iOS.)另外如果使用pod管理依赖库,可以看到在Pods-covermedia-frameworks脚本中会通过strip_invalid_archs移除不需要支持的architectures,比如我们提交Appstore时如果动态库包含模拟器库会报错,再比如主MochO不支持32-bit那么pod库也会通过lipo -remove 32-bit slice。

    Tips:放弃支持32-bit我们的IPA至少减小1/3

    关于Swift

          我们分别以Swift和ObjC新建一个空的Project然后Archive打包,发现Swift会比ObjC大大概400倍(当然这个不是Store App 最终size),究其原因是因为使用Swift构建的App需要包含支持Swift运行的系统动态库,在安装包内Framework文件夹下存放动态库如libswiftCore.dylib等等,只要有swift代码不管混编还是纯swift都会引入,我们无法左右也不可避免,我们相信在不久的将来随着Swift的稳定以及开发者的增加,这些包含在app内的swift core dylib会在iOS系统层面去处理。

    case\语言SwiftObjC
    空工程105.6Mb154Kb

    关于Framework

          我们以Swift新建一个空的工程通过Pod分别以静态库和动态库引入SnapKit,MJRefresh,通过use_frameworks!决定pod库以动态库还是静态库引入,这里有的同学可能会说Apple不支持包含Swift的静态库 ,我们等下再说这个问题,直接看对比分析表:

    case\lib静态库动态库
    MJRefresh0848Kb
    SnapKit01.2Mb
    主MachO1.4Mb+ 16kb149Kb
    合计1449.6Kb2225.8Kb

          静态库在编译时就联入可执行文件,动态库以Framework放在IPA内,通过上表可见相同的库使用静态库会比动态库IPA更小,在iOS8以前,苹果只允许发布静态库,但是在iOS8苹果推出了APP extension的概念,可以对项目进行扩展 ,因为APP extension和主项目是两个独立的进程,为了共享代码,苹果允许我们创建动态库,即dynamic framework,在Xcode 9.0 以前Apple并不支持包含Swift的静态库,我们使用pod管理三方库只能使用通过use_frameworks!以动态库方式集成到Ipa内。

    Tips:尽可能的以静态库的形式使用三方库,以减少体积,加快启动速度

          Xcode 9.0 release note 里边提到(Xcode supports static library targets which contain Swift code). 随后在上个月CocoaPods 1.5.0发布更新(Swift static libraries can be used in targets whose search paths are inherited)那么到这里上边的疑问也就不是疑问了。

    Note:Up until Xcode 9, support for building Swift into static libraries was non-existent and use of dynamic frameworks was required. This was a deal-breaker for some developers, particularly those worried about the launch performance implications of linked many dynamic binaries. With CocoaPods 1.5.0, developers are no longer restricted into specifying use_frameworks! in their Podfile in order to install pods that use Swift. Interop with Objective-C should just work. However, if your Swift pod depends on an Objective-C, pod you will need to enable "modular headers" (see below) for that Objective-C pod.

          如果我们的app没有APP extension功能建议podfile去掉use_frameworks以静态库引用pod库,这样既可以缩小IPA文件大小又可以优化App启动时间(动态库在pre main前加载耗时在之前的文件有提过),很遗憾我在去掉use_frameworks后重新编译一些Swift三方库报错,暂不支持静态库。这不是重点,如果需要支持APP extension,那么就必须要使用动态库了,这里有国外一位大佬的使用Carthage的方案给我们提供一种思路,大概原理是将多个静态库编为一个动态库,这样在一定程度也可以缩小体积,缩短启动时间。

    640?wx_fmt=png

    最后为了方便部分读者阅读理解这,里贴一下静态库动态库对比分析表

    case\lib静态库动态库
    APP extension不支持支持APP extension和主项目是两个独立的进程,为了共享代码,苹果允许我们创建动态库,即dynamic framework,每个 App 都只能用自己对应签名的动态库,做不到多个 App 使用一个动态库
    资源文件仅能包含编译后的代码,即.a文件,不能包含其他的资源文件包含以上所有类型支持iOS8之后
    加载时机在启动时加载,加载时间较长编译时联入主MachO

    附相关资料 :

    1. iOS Mach-O文件

    2. http://blog.cnbang.net/tech/2544/ 

    3. How we cut our iOS app’s launch time in half

    4. CocoaPods 1.5.0 — Swift Static Libraries

    关于iOStips

    「iOStips」,定时推送BAT一线圈的互联网资讯,成长感悟,高端主流技术干货,框架源码分析等文章。让你的职场生涯 不再孤单,不再迷茫!

    「iOStips」,长期分享移动开发技术资料你想要的应有尽有只有你不想学的,没有你学不到的,公众号后台留下你的邮箱下列电子书任选一本送给你!

    • 《iOS应用逆向工程(第2版)》

    • 《Hacking.and.Securing.iOS.Applications》

    • 《iOS_Security_Guide》

    • 《Apress.OS.X.and.iOS.Kernel.Programming》

    • 《Wrox Press Mac OS X and iOS Internals, To the Apple's Core》

    • 《Wrox Press Mac OS X and iOS Internals, To the Apple's Core》

    • 《Swift 4 Programming Cookbook》

    • 《LLVM》

    • 《剑指offer第二版》

    • 《Objective-C编程之道:IOS设计模式解析》

    • 《iOS安全攻防手记》在学习过程中自己的总结可能是全网最有深度的学习笔记

    •  若干你需要的...

    640?wx_fmt=png

        更多骚操作,尽在iOSTips,关注公众号,第一时间get新姿势。

    展开全文
  • nvalid Swift Support - The SwiftSupport folder is missing 今天使用 loader 向 iTunes Connect 提交新版本后,等了几个小时一直看不到提交的新版本,然后发现apple给发了封邮件,如图1 Dear developer, ...

    nvalid Swift Support - The SwiftSupport folder is missing

    今天使用 loader 向 iTunes Connect 提交新版本后,等了几个小时一直看不到提交的新版本,然后发现apple给发了封邮件,如图1

    Dear developer,


    We have discovered one or more issues with your recent delivery for "****". To process your delivery, the following issues must be corrected: 


    Invalid Swift Support - The SwiftSupport folder is missing. Rebuild your app using the current public (GM) version of Xcode and resubmit it. 


    Once these issues have been corrected, you can then redeliver the corrected binary. 


    Regards,


    The App Store team
    图1


    其实之前的新版本已经传了上去,上传后会有 正在处理 的标志(如图2),但是在这一步的时候审核没通过,然后被拒了,接着就有了图1的邮件


    图2

    无效的版本不会出现在构建版本里的,但是成功构建版本后之前被拒的版本就会出现

    解决:
    bg:Xcode Version 8.1 (8B62) 项目是使用 Swift 和 OC 混编的
    Invalid Swift Support - The SwiftSupport folder is missing. 这是由于 Archive 的时候 SwiftSupport没有添加到 ipa 中。
    Target -> Build Settings 中 如下配置下:






    切记要archive  不要loader  前车之鉴  我就折腾了一下午

    然后 clear 下,最好在编译一下,然后正常 Archive,接下来重点是 一定不要 Export AdHoc Deployment,直接如下图处理



    接下来 如果没有其他错误的话 就可以在 iTunes Connect 中查看到如下



    图中带 ! 的都是无效的版本,由于某些错误被拒的,然后就可以正常的提交审核了



    文/申申申申申(简书作者)
    原文链接:http://www.jianshu.com/p/e4ef13b539b4
    著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
    展开全文
  • Swift

    2015-01-23 09:21:04
    首先我发现在编写Swift代码的时候,经常会遇到Xcode不能提示,卡顿,直接闪退等问题,尤其是在Swift和OC混编时。(不知道其他开发者是否也有这样的经历,但是我相信这样的问题,很快会得到解决) 然后感觉Swift并...
  • 项目转Swift指南

    2020-05-16 15:47:17
    OCSwift有一个大前提就是你要对Swift有一定的了解,熟悉Swift语法,最好是完整看过一遍官方的Language Guide。 转换的过程分自动化手动转译,鉴于自动化工具的识别率不能让人满意,大部分情况都是需要手动转换的...
  • [iOS/Swift] 类与结构体相关归纳

    千次阅读 2015-01-21 14:57:51
    #swift - 类与结构体 **阅读此文章前,您已经有一定的Object-C语法基础了!** 在Swift中,类结构体都是对数据方法进行封装的常用做法!首先我们来看看他们的共同之处: 1. 都可以有属性方法; 2. 都有构造...
  • ​最近正在尝试逆向App的学习研究,其中不乏出现一些问题,在此主要是分享一些学习中遇到的问题解决方法以及部分原理 1.class-dump无法拖入/usr/bin目录(这个问题是大多数人都迈不过去的坎) ​原因:Mac当前...
  • Python实战社群Java实战社群长按识别下方二维码,按需求添加扫码关注添加客服进Python社群▲扫码关注添加客服进Java社群▲作者:江湖人称 “七叔” 其实就是一个奇葩,立志要成...
  • 1、NSArray与NSSet的区别? NSArray内存中存储地址连续,而NSSet不连续 NSSet效率高,内部使用hash查找;NSArray查找需要遍历 NSSet通过anyObject访问元素,NSArray通过下标访问 2、NSHashTable与NSMapTable?...
  • 使用class-dump从可执行文件中获取类、方法属性信息,通过该工具生成的头文件可以快速找到想要的方法类。 class-dump下载地址:stevenygard.com/projects/class-dump,下载的是dmg文件,直接安装即可。 class...
  • Swift版本点击这里欢迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A curated list of iOS objective-C ecosystem. 注意事项:由于简书文章字数限制,大部分内容请移步Github查阅 How to Use Simply ...
  • iOS 逆向----class-dump获取app头文件

    千次阅读 2018-08-15 14:24:57
    class-dump是用来dump目标文件的类信息...它利用Objective-C语言的runtime的特性,将存储在mach-O文件中的@interface@protocol信息提取出来,并生成对应的.h文件。 从这一段介绍中可以看出来,class-dump只支持...
  • 本文的作者沙梓社吴航共同编写了《 iOS 应用逆向工程》,文章中介绍的是一些基本的 iOS 领域的安全知识,但是由于普及不够,基本上没有被人们重视,希望本文能让大家重视到 iOS 的源代码安全问题。 另外预告...
  • 笔者参加了2017秋季不少的校招iOS岗位面试,下面我把这些面试题都贴出来大家共勉:一.搜狐快站1.谈谈你做过的项目;2.项目中最有成就感的部分;3.倒计时如何实现?(NSTimer,还有其他的实现方式吗);4.UIButton...
  • 2017年校园招聘ios面试题

    千次阅读 2016-12-14 09:19:06
    一.搜狐快站1.谈谈你做过的项目;2.项目中最有成就感的部分;3.倒计时如何实现?(NSTimer,还有其他的实现方式吗);4.UIButton的继承关系?...8.Android开发iOS开发的区别; 二.搜狐社交产品中心1.我们项
1 2 3
收藏数 52
精华内容 20
关键字:

怎么逆向oc和swift混编。