先進的なiOS開発(1):iOSネイティブ開発へのアプローチ

I.はじめに

クロスプラットフォームAPPの開発過程でuni-app、ビデオ再生のための小ウィンドウ機能がサポートされていないことが判明し、プラグインマーケットが提供するプラグインのユーザーエクスペリエンスが良くないことが判明したため、開発することになりました。それ自体はネイティブuni-appプラグインです。

uni-appネイティブ プラグインとは、ネイティブに開発された機能を仕様に従ってプラグイン パッケージにカプセル化し、uni-appフロントエンド プロジェクトで呼び出すことによって開発されたネイティブ機能を指します。js

ネイティブ開発環境の構築手順についてはiOS、ブログ投稿「高度なクロスプラットフォームアプリケーション開発 (27) iOS ネイティブ開発環境の構築手順の詳細」を参照してください。

2. 知識の蓄え

現在、iOS には 2 つの人気のある開発言語があります:Objective-CSwiftObjective-Cオブジェクト指向言語であり、非常に実用的な言語です。C (C++) 言語の基礎を持っている人にとっては、簡単に始めることができます。後者は、SwiftiOS/Mac の将来の開発の主要な言語であり、プログラミングのアイデアと API の作成の点で非常に優れています。

  • 開発ツール:Xcode

    XcodeiOS 開発に不可欠なツールであり、Apple の Mac オペレーティング システムで動作し、Mac OS X および iOS アプリケーションを開発するために Apple が開発者に提供する統合開発環境です。Xcode は統一されたユーザー インターフェイス設計を採用しており、コーディング、テスト、デバッグがすべてシンプルなウィンドウ内で完了します。もちろん も使えますAPPcode

  • クラス ライブラリ管理ツール:CocoaPods

    CocoaPodsこれは、iOS で最も一般的に使用され、よく知られているクラス ライブラリ管理ツールです。このツールを使用すると、「 」と呼ばれる依存ライブラリをCocoaPodsプロジェクトに追加でき (これらのクラス ライブラリはそれ自体でサポートされている必要があります)、それらのライブラリを簡単に管理できます。バージョン。PodsCocoaPods

三、 Object-C

一方、uni-appネイティブ プラグインはObject-Cを使用して実装されます。したがって、後続の開発言語はObject-C主に に基づいてい。

Objective-C名前が示すように、標準の ANSI C 言語を拡張して、メッセージ パッシングオブジェクト指向プログラミングを導入します。(以下のデフォルトにはすでに C/C++ 言語基盤が含まれています)

構文の概要:

  • パッケージ名 (名前空間) の概念はありません。 ではJava、同じクラス名を持つ 2 つのクラスが競合するのを防ぐために、これら 2 つのクラスを異なるパッケージに配置できます。OC には「パッケージ」という概念がありません。つまり、名前空間メカニズムがありません。代わりに、開発者はクラス名にプレフィックスを追加します。プレフィックスを使用すると、クラス名の競合を効果的に防ぐことができます。たとえばNSString、(OC の文字列クラス)、NSArray(OC の配列クラス)、それらのプレフィックスはすべて NS です。

  • キーワードはすべて@次で始まります。OC コードは C 言語および C++ コードと混合できます。C 言語と C++ はプログラミング言語として独自のキーワードを持っています。C 言語および C++ キーワードとの競合を防ぐために、すべての OC キーワードは で始まります@@文字列でも、たとえば@“Hello"OC では文字列で始まり、C 言語では「Hello」が文字列です。

文法のポイント:
ここに画像の説明を挿入

  • oc ガベージコレクションはありません。

  • ソース ファイルのサフィックスは です.m; エントリ プログラムは c と同じですmain()

  • インポートパッケージを使用する場合、#importヘッダーファイルを追加するために条件付きコンパイルを行う必要はなく、#importヘッダーファイルが追加されたかどうかを自動的に判断します。

  • .h ファイル: ヘッダー ファイル、つまりクラスの宣言ファイル。メンバー変数とメソッドを宣言するために使用されます。クラス宣言では、キーワード@interfaceと を使用します@end

    注:.hのメソッドは単なる宣言であり、メソッドの実装ではありません。つまり、メソッド名、メソッドの戻り値の型、メソッドが受け取るパラメータの型を説明するだけで、メソッド内のコードは書きません。

  • .m ファイル: クラスの実装ファイル。実装で宣言されたメソッドのコードをObjective-C含めることができます。クラスの実装では、キーワードと を使用します.mm ファイル:ソース コード ファイル。 とコードを含めることができます機能を使用する必要がある場合にのみ使用してくださいC.h@implementation@end
    Objective-CCC++C++

  • ヘッダー ファイル参照: 使用できることに加えて#include同じヘッダー ファイルが 1 回だけインクルードされるようにするための、Objective-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

4. 起動処理

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]));
    }
}

ここに画像の説明を挿入

完全なプログラム起動プロセス:

  1. を実行しますMain
  2. UIApplicationMain関数を実行します。
  3. UIApplicationオブジェクトを作成し、UIApplicationMainオブジェクトのプロキシを設定します。UIApplication3 番目のパラメータはUIApplication名前で、指定した場合はデフォルトで にnilなります。4番目のパラメータはエージェントです。
    UIApplicationUIApplicationUIApplication
  4. アプリケーションが終了しないようにメイン実行ループを開始します。
  5. info.plist設定ファイルをロードします。ファイル内に指定​​されたファイルがinfo.plistあるかどうかを判断し、存在する場合はファイルをロードし、存在しない場合はアプリケーションをロードします。Main storyboard file base namestoryboardinfo.plist

5. 多読

おすすめ

転載: blog.csdn.net/sunhuaqiang1/article/details/131430731