目录

iOS开发进阶二走近iOS原生开发

iOS开发进阶(二):走近iOS原生开发

  • 开发工具: Xcode

Xcode 是iOS 开发必备工具, 运行于苹果公司的Mac操作系统下,是苹果公司向开发人员提供的集成开发环境,用于开发Mac OS X,iOS的应用程序。Xcode 具有统一的用户界面设计,编码、测试、调试都在一个简单的窗口内完成。当然你也可以使用 APPcode

  • 类库管理工具: CocoaPods

CocoaPods 应该是iOS最常用最有名的类库管理工具了,通过 CocoaPods 工具可以为项目添加被称为“ Pods ”的依赖库(这些类库必须是 CocoaPods 本身所支持的),并且可以轻松管理其版本。

三、 Object-C

鉴于 uni-app 原生插件使用 Object-C 实现。故后续开发语言以 Object-C 为主。

Objective-C ,顾名思义,其扩展了标准的ANSI C语言,引入了 消息传递机制面向对象编程 。(以下默认已具有C/C++语言基础)

语法概述:

  • 没有包名(命名空间)的概念:在 Java 中,为了防止两个类名相同的类冲突,可以将这2个类放在不同的包里面。OC中并没有” “的概念,也就是没有命名空间机制,取而代之的是开发人员给类名加上前缀,使用前缀可以有效的防止类名冲突。比如 NSString (OC中的字符串类)、 NSArray (OC的数组类),它们的前缀都是NS。
  • 关键字都以 @ 开头:OC代码中是可以混入C语言、C++代码的,而C语言和C++作为一门编程语言,都有自己的关键字。为了防止跟C语言、C++关键字冲突,OC的关键字都以 @ 开头。甚至字符串都是以 @ 开头的,比如 @“Hello" 是OC中的字符串,而"Hello"则是C语言中的字符串。

语法要点:

https://img-blog.csdnimg.cn/7f087994bbbc492cafda2f6620a9bbd9.png

  • Oc没有垃圾回收;
  • 源文件后缀为 .m ;入口程序同c,也是 main() ;
  • 导包使用 #import 也不用使用条件编译加入头文件; #import 会自动判断是否已经添加过该头文件。
  • .h文件 :头文件,即类的声明文件,用于声明成员变量、方法。类的声明使用关键字 @interface@end

注意: .h 中的方法只是做一个声明,并不对方法进行实现。也就是说,只是说明一下方法名、方法的返回值类型、方法接收的参数类型而已,并不会编写方法内部的代码。

  • .m文件 :类的实现文件,可以包含 Objective-CC 的代码,用于实现 .h 中声明的方法。类的实现使用关键字 @implementation@end

    .mm文件 :源代码文件,可以包含 Objective-CC 以及 C++ 的代码。仅在需要使用 C++ 特性时使用。

  • 头文件引用 :除了可以使用 #includeObjective-C 提供了更好的指令 #import 确保相同的头文件仅会被包含一次(推荐使用这种方式)。

  • 消息传递Objective-C 的面向对象语法源于 Smalltalk 消息传递风格。不同于 c++ 等面向对象语言对象调用的说法,其采用对象之间消息传递的思想,天生具备动态绑定能力,允许传递未知的消息(编译器不报错),直到运行时才处理消息。反之, C++ 在编译期就会检查是否有对应的方法,若没有则报错。另外 Objective-C 也可以将消息发送给空对象,默认为不做任何事,不用担心程序崩溃,健壮性更强。

示例代码如下:

#import "TestModule.h"

@implementation TestModule

// 通过宏 UNI_EXPORT_METHOD 将异步方法暴露给 js 端
UNI_EXPORT_METHOD(@selector(testAsyncFunc:callback:))

/// 异步方法(注:异步方法会在主线程(UI线程)执行)
/// @param options js 端调用方法时传递的参数
/// @param callback 回调方法,回传参数给 js 端
- (void)testAsyncFunc:(NSDictionary *)options callback:(UniModuleKeepAliveCallback)callback {
    // options 为 js 端调用此方法时传递的参数
    NSLog(@"%@",options);
    
    // 可以在该方法中实现原生能力,然后通过 callback 回调到 js

    // 回调方法,传递参数给 js 端 注:只支持返回 String 或 NSDictionary (map) 类型
    if (callback) {
        // 第一个参数为回传给js端的数据,第二个参数为标识,表示该回调方法是否支持多次调用,如果原生端需要多次回调js端则第二个参数传 YES;
        callback(@"success",NO);
    }
}

// 通过宏 UNI_EXPORT_METHOD_SYNC 将同步方法暴露给 js 端
UNI_EXPORT_METHOD_SYNC(@selector(testSyncFunc:))

/// 同步方法(注:同步方法会在 js 线程执行)
/// @param options js 端调用方法时传递的参数
- (NSString *)testSyncFunc:(NSDictionary *)options {
    // options 为 js 端调用此方法时传递的参数
    NSLog(@"%@",options);

    /*
 可以在该方法中实现原生功能,然后直接通过 return 返回参数给 js
 */

    // 同步返回参数给 js 端 注:只支持返回 String 或 NSDictionary (map) 类型
    return @"success";
}

@end

四、启动流程

main 函数如下:

// 程序启动时执 main函数,在main函数当中有以下操作.
#import <UIKit/UIKit.h>
#import "AppDelegate.h"

int main(int argc, char * argv[]) {
    @autoreleasepool {
    //第三个参数:UIApplication类名或者子类的名称 nil == @"UIApplication" 
    //第四个参数:UIApplication的代理的代理名称
    //NSStringFromClass:把类名转化字符串
    //NSStringFromClass好处:1.有提示功能 2.避免输入错误
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

https://img-blog.csdnimg.cn/0c762d23415d477f8f5b83a5192b77a8.png

程序完整启动流程:

  1. 执行 Main

  2. 执行 UIApplicationMain 函数。

  3. 创建 UIApplication 对象,并设置 UIApplicationMain 对象的代理。 UIApplication 的第三个参数就是 UIApplication 的名称,如果指定为 nil ,它会默认

    UIApplicationUIApplication 的第四个参数为 UIApplication 的代理.。

  4. 开启一个主运行循环保证应用程序不退出。

  5. 加载 info.plist 配置文件。判断 info.plist 文件当中有没有 Main storyboard file base name 里面有没有指定 storyboard 文件,如果有就去加载 info.plist

    文件,如果没有,那么应用程序加载完毕。

五、拓展阅读

  • 《 跨平台应用开发进阶(六) :uni-app实现原生插件集成 》
  • 《 跨平台应用开发进阶(五十九):uni-app实现视屏播放小窗功能 》
  • 《 跨平台应用开发进阶(二十七) iOS原生开发环境搭建步骤详解 》
  • 《 Learn iOS Programming 》
  • 《 The Swift programming language Swift 4.2 》
  • 《 Learning iOS development on GitHub 》
  • 《 iOS Dev Weekly 》