mPaaS iOS フレームワークは、Alipay クライアントの開発フレームワークを基にしています。フレームワークの設計思想に沿って、mPaaS iOS はビジネスを複数の比較的独立したモジュールに分離し、モジュール間の高凝集性と低結合性を実現することを目指しています。
mPaaS iOS フレームワークは、アプリケーションのライフサイクルを直接引き継ぎ、ホストの起動、アプリケーションライフサイクルの管理、UIApplication のデリゲートイベントの処理と配信、各ビジネスモジュール(MicroApplication およびサービス)の統一的な管理などを担当します。
この記事では、mPaaS iOS フレームワークについて詳しく紹介します。
ホストの起動
この記事では、mPaaS iOS フレームワークについて詳しく紹介します。
main -> DFClientDelegate -> Open Launcher アプリケーションホストの起動
mPaaS フレームワークにアクセスすると、AppDelegate が完全に置き換えられます。アプリケーションのライフサイクル全体はフレームワークによって管理されますが、アプリケーションのライフサイクルのさまざまな段階でデリゲートメソッドを実装できます。フレームワークは UIApplicationDelegate 内のすべてのデリゲートメソッドへのアクセス方法を提供するため、Category 内の対応するメソッドをオーバーライドするだけで済みます。
ライフサイクルメソッドは、次のように宣言されます(詳細については、DTFrameworkInterface.h ファイルをご参照ください)。
/**
* フレームワークは didFinishLaunching で特定の初期化ロジックを実装する必要がありますが、このメソッドは実行前に呼び出されます。
*/
- (void)application:(UIApplication *)application beforeDidFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
/**
* フレームワークはこのメソッドをコールバックし、アクセスされたアプリケーションが独自の didFinishLaunching ロジックを引き継ぎます。
* DTFrameworkCallbackResultReturnYES または DTFrameworkCallbackResultReturnNO が返されると、後続のロジックを実行せずに、システムに直接返されます。
* このメソッドは BootLoader の起動前にコールバックされます。アプリケーションは DTFrameworkCallbackResultReturnYES または DTFrameworkCallbackResultReturnNO を返すことで、デフォルトの BootLoader を実行せずに、フレームワークを事前に終了させることができます。
* フレームワークのデフォルト実装を使用します。通常、オーバーライドは必要ありません。
*
* @return : フレームワークの実行を継続するか、システムに YES/NO を返します。
*/
- (DTFrameworkCallbackResult)application:(UIApplication *)application handleDidFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
/**
* フレームワークは didFinishLaunching で特定の初期化ロジックを実装する必要がありますが、このメソッドはすべてのロジックが完了した後に呼び出されます。
*/
- (void)application:(UIApplication *)application afterDidFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
/**
* フレームワークはこのメソッドを事前にコールバックし、アクセスされたアプリケーションが通知メッセージを事前に処理できるようにします。
* DTFrameworkCallbackResultContinue が返されると、フレームワークは UIApplicationDidReceiveRemoteNotification を介してメッセージをグローバルリスナーにブロードキャストし、completionHandler(UIBackgroundFetchResultNoData) を呼び出します。
* DTFrameworkCallbackResultReturn が返されると、アクセスされたアプリケーションがメッセージを完全に処理したことを意味し、フレームワークは後続のロジックの実行を停止します。
*/
- (DTFrameworkCallbackResult)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler;
/**
* フレームワークはこのメソッドを事前にコールバックし、アクセスされたアプリケーションが通知メッセージを事前に処理できるようにします。
* DTFrameworkCallbackResultContinue が返されると、フレームワークは UIApplicationDidReceiveLocalNotification を介してメッセージをグローバルリスナーにブロードキャストします。
* DTFrameworkCallbackResultReturn が返されると、アクセスされたアプリケーションがメッセージを完全に処理したことを意味し、フレームワークは後続のロジックの実行を停止します。
*/
- (DTFrameworkCallbackResult)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification;
/**
* フレームワークはこのメソッドを事前にコールバックし、アクセスされたアプリケーションが通知メッセージを事前に処理できるようにします。
* DTFrameworkCallbackResultContinue が返されると、フレームワークは UIApplicationDidReceiveLocalNotification を介してメッセージをグローバルリスナーにブロードキャストし、completionHandler() を呼び出します。
* DTFrameworkCallbackResultReturn が返されると、アクセスされたアプリケーションがメッセージを完全に処理したことを意味し、フレームワークは後続のロジックの実行を停止します。
*/
- (DTFrameworkCallbackResult)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forLocalNotification:(UILocalNotification *)notification completionHandler:(void (^)())completionHandler;
/**
* フレームワークはこのメソッドを事前にコールバックし、アクセスされたアプリケーションが deviceToken を取得できるようにします。
* DTFrameworkCallbackResultContinue が返されると、フレームワークは UIApplicationDidRegisterForRemoteNotifications を介してメッセージをグローバルリスナーにブロードキャストします。
* DTFrameworkCallbackResultReturn が返されると、アクセスされたアプリケーションが完全に処理されたことを意味し、フレームワークは後続のロジックの実行を停止します。
*/
- (DTFrameworkCallbackResult)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken;
/**
* deviceToken の取得に失敗した場合、フレームワークはこのメソッドを事前にコールバックします。
* DTFrameworkCallbackResultContinue が返されると、フレームワークは実行を継続しますが、現在は他のロジックはありません。
* DTFrameworkCallbackResultReturn が返されると、フレームワークは後続のロジックの実行を停止しますが、現在は他のロジックはありません。
*/
- (DTFrameworkCallbackResult)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error;
/**
* フレームワークは共有コンポーネント(存在する場合、かつ shouldAutoactivateShareKit が YES を返す場合)に事前に通知します。共有コンポーネントが処理できない場合、このメソッドがコールバックされ、アクセスされたアプリケーションが openURL を処理できるようにします。
* DTFrameworkCallbackResultReturnYES または DTFrameworkCallbackResultReturnNO が返されると、フレームワークは後続のロジックを実行せずに、システムに直接返ります。
* DTFrameworkCallbackResultContinue が返されると、フレームワークは URL の処理を継続し、SchemeHandler やその他のクラスに配信してさらに処理します。
*
* システムメソッドと比較して、このメソッドには追加の newURL パラメーターがあり、アプリケーションは処理後に別の URL を返すことができます。関数が DTFrameworkCallbackResultContinue を返し、newURL に値を割り当てた場合、フレームワークは後続の処理に新しい URL を使用します。
*/
- (DTFrameworkCallbackResult)application:(UIApplication *)application openURL:(NSURL *)url newURL:(NSURL **)newURL sourceApplication:(NSString *)sourceApplication annotation:(id)annotation;
/**
* フレームワークはこのメソッドを事前にコールバックします。
* DTFrameworkCallbackResultContinue が返されると、フレームワークは実行を継続しますが、現在は他のロジックはありません。
* DTFrameworkCallbackResultReturn が返されると、フレームワークは後続のロジックの実行を停止しますが、現在は他のロジックはありません。
*/
- (DTFrameworkCallbackResult)applicationWillResignActive:(UIApplication *)application;
/**
* フレームワークはこのメソッドを事前にコールバックします。
* DTFrameworkCallbackResultContinue が返されると、フレームワークは実行を継続しますが、現在は他のロジックはありません。
* DTFrameworkCallbackResultReturn が返されると、フレームワークは後続のロジックの実行を停止しますが、現在は他のロジックはありません。
*/
- (DTFrameworkCallbackResult)applicationDidEnterBackground:(UIApplication *)application;
/**
* フレームワークはこのメソッドを事前にコールバックします。
* DTFrameworkCallbackResultContinue が返されると、フレームワークは実行を継続しますが、現在は他のロジックはありません。
* DTFrameworkCallbackResultReturn が返されると、フレームワークは後続のロジックの実行を停止しますが、現在は他のロジックはありません。
*/
- (DTFrameworkCallbackResult)applicationWillEnterForeground:(UIApplication *)application;
/**
* フレームワークはこのメソッドを事前にコールバックします。
* DTFrameworkCallbackResultContinue が返されると、フレームワークは実行を継続し、共有コンポーネント(存在する場合、かつ shouldAutoactivateShareKit が YES を返す場合)にイベントを渡します。アプリケーション全体がロードされていない場合は、BootLoader が呼び出されます。
* DTFrameworkCallbackResultReturn が返されると、フレームワークは後続のロジックの実行を停止しますが、現在は他のロジックはありません。
*/
- (DTFrameworkCallbackResult)applicationDidBecomeActive:(UIApplication *)application;
/**
* フレームワークはこのメソッドを事前にコールバックします。
* DTFrameworkCallbackResultContinue が返されると、フレームワークは実行を継続しますが、現在は他のロジックはありません。
* DTFrameworkCallbackResultReturn が返されると、フレームワークは後続のロジックの実行を停止しますが、現在は他のロジックはありません。
*/
- (DTFrameworkCallbackResult)applicationWillTerminate:(UIApplication *)application;
/**
* フレームワークはこのメソッドを事前にコールバックします。
* DTFrameworkCallbackResultContinue が返されると、フレームワークは実行を継続しますが、現在は他のロジックはありません。
* DTFrameworkCallbackResultReturn が返されると、フレームワークは後続のロジックの実行を停止しますが、現在は他のロジックはありません。
*/
- (DTFrameworkCallbackResult)applicationDidReceiveMemoryWarning:(UIApplication *)application;
/**
* フレームワークはこのメソッドを事前にコールバックし、アクセスされたアプリケーションが Watch メッセージを事前に処理できるようにします。
* DTFrameworkCallbackResultContinue が返されると、フレームワークは UIApplicationWatchKitExtensionRequestNotifications を介して Watch メッセージをグローバルリスナーにブロードキャストします。
* DTFrameworkCallbackResultReturn が返されると、アクセスされたアプリケーションがメッセージを完全に処理したことを意味し、フレームワークは後続のロジックの実行を停止します。
*/
- (DTFrameworkCallbackResult)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void(^)(NSDictionary *replyInfo))reply;
/**
* フレームワークはこのメソッドを事前にコールバックし、アクセスされたアプリケーションがメッセージを事前に処理できるようにします。
* DTFrameworkCallbackResultContinue が返されると、フレームワークは UIApplicationUserActivityNotifications を介してメッセージをグローバルリスナーにブロードキャストし、最終的にシステムに NO を返します。
* DTFrameworkCallbackResultReturnYES または DTFrameworkCallbackResultReturnNO が返されると、フレームワークは後続のロジックを実行せずに、システムに直接返ります。
*/
- (DTFrameworkCallbackResult)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void(^)(NSArray *restorableObjects))restorationHandler;
/**
* フレームワークはこのメソッドを事前にコールバックし、アクセスされたアプリケーションが 3D Touch クイックエントリのメッセージを事前に処理できるようにします。
* DTFrameworkCallbackResultContinue が返されると、フレームワークは shortcutItem によって提供された URL を処理し、completionHandler() を呼び出して処理されたかどうかを返します。
* DTFrameworkCallbackResultReturn が返されると、フレームワークは後続のロジックを実行せずに、システムに直接返ります。
*/
- (DTFrameworkCallbackResult)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler;
/**
* バックグラウンドフェッチメカニズムのコールバック
* completionHandler は 30 秒以内にコールバックする必要があります。そうしないと、プロセスは終了します。
* このメカニズムを有効にするには、バックグラウンドモードのフェッチオプションを設定し、didFinishLaunching で次のメソッドを呼び出す必要があります。詳細については、ドキュメントをご参照ください。
* [application setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];
* デフォルトの実装は null です。独自の方法で処理する必要があります。
*/
- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler;アプリケーション モジュールの分割
mPaaS フレームワークでは、異なるモジュールを分離するために、MicroApplication と Service が定義されています。「UI インターフェイスを持っているかどうか」を基準として、フレームワークは異なるモジュールを MicroApplication と Service に分類し、Context を介してモジュールでライフサイクル管理を実装します。
用語 | 定義 |
MicroApplication | 実行時にクライアントに UI を持つマイクロアプリケーション |
Service | 実行時にクライアントによって提供される軽量な抽象化サービス |
Context | 実行時のクライアントマイクロコンポーネントのコンテキスト |
このセクションでは、マイクロアプリケーション、サービス、およびコンテキストの概念について説明します。詳細については、「マイクロアプリケーションを作成する」をご参照ください。
マイクロアプリケーション
mPaaS iOS フレームワークに基づくアプリケーション開発プロセスでは、通常、UI を備えた独立したサービスをマイクロアプリケーション(例:Alipay の送金、モバイルチャージなどのサービス)として設定し、他のサービスから分離することで、マイクロアプリケーション間で高い独立性とゼロ相互依存性を実現します。
各マイクロ アプリケーションには独自のライフサイクルがあります。全体的なプロセスは次のとおりです。

マイクロアプリケーションのライフサイクル全体におけるコールバックメソッド(詳細については、DTMicroApplicationDelegate.h ファイルをご参照ください):
@required
/**
* アプリケーションオブジェクトのデリゲートにルートビューコントローラを返すように要求します。
*
* @param application: アプリケーションオブジェクト。
*
* @return: アプリケーションのルートビューコントローラ。
*/
- (UIViewController *)rootControllerInApplication:(DTMicroApplication *)application;
@optional
/**
* アプリケーションオブジェクトがインスタンス化されたことをアプリケーションデリゲートに通知します。
*
* @param application: アプリケーションオブジェクト。
*/
- (void)applicationDidCreate:(DTMicroApplication *)application;
/**
* アプリケーションが起動されることをアプリケーションデリゲートに通知します。
*
* @param application: 起動されるアプリケーションオブジェクト。
* @param options: アプリケーションの実行パラメーター。
*/
- (void)application:(DTMicroApplication *)application willStartLaunchingWithOptions:(NSDictionary *)options;
/**
* アプリケーションがすでに起動されていることをアプリケーションデリゲートに通知します。
*
* @param application: 起動されたアプリケーションオブジェクト。
*/
- (void)applicationDidFinishLaunching:(DTMicroApplication *)application;
/**
* アプリケーションが一時停止してバックグラウンドに移行することをアプリケーションデリゲートに通知します。
*
* @param application: 起動されたアプリケーションオブジェクト。
*/
- (void)applicationWillPause:(DTMicroApplication *)application;
/**
* アプリケーションが再びアクティブ化されることをアプリケーションデリゲートに通知します。
*
* @param application: アクティブ化されるアプリケーションオブジェクト。
*/
- (void)application:(DTMicroApplication *)application willResumeWithOptions:(NSDictionary *)options;
/**
* アプリケーションがアクティブ化されたことをアプリケーションデリゲートに通知します。
*
* @param application: アクティブ化されるアプリケーションオブジェクト。
*/
- (void)applicationDidResume:(DTMicroApplication *)application;
/**
* アプリケーションがアクティブ化されたことをアプリケーションデリゲートに通知します。
*
* @param application: パラメーターバージョンとともにアクティブ化されるアプリケーションオブジェクト。
*/
- (void)application:(DTMicroApplication *)application didResumeWithOptions:(NSDictionary *)options;
/**
* アプリケーションが終了することをアプリケーションデリゲートに通知します。
*
* @param application: アプリケーションオブジェクト。
*/
- (void)applicationWillTerminate:(DTMicroApplication *)application;
/**
* アプリケーションが終了することをアプリケーションデリゲートに通知します。
*
* @param application: アプリケーションオブジェクト。
* @param animated: アニメーションで終了するかどうか。
*/
- (void)applicationWillTerminate:(DTMicroApplication *)application animated:(BOOL)animated;
/**
* アプリケーションが終了できるかどうかをアプリケーションデリゲートに問い合わせます。
* 注:デリゲートは、特別な場合には **NO** を返します。デフォルトで **Yes** の場合、アプリケーションは終了できます。
*
* @param application: アプリケーションオブジェクト。
*
* @return: アプリケーションが終了できるかどうか。
*/
- (BOOL)applicationShouldTerminate:(DTMicroApplication *)application;サービス
mPaaS iOS フレームワークは、UI を持たないフレームワークをサービスと見なします。マイクロアプリケーションとサービスの違いは次のとおりです。
マイクロアプリケーションは独立したビジネスプロセスとして機能しますが、サービスは一般的なサービスを提供するために使用されます。
サービスはステートフルです。 サービスは一度開始されると、クライアントのライフサイクル全体にわたって存在し、いつでも取得できます。 マイクロアプリケーションは終了後に破棄されます。
サービス管理の関連インターフェイス(詳細については、DTService.h ファイルをご参照ください):
@required
/**
* サービスを開始します。
* 注:
* フレームワークは初期化後にメソッドを呼び出します。
* サービスは、メソッドが呼び出された場合にのみアプリケーションを起動できます。
*/
- (void)start;
@optional
/**
* サービスが作成されます。
*/
- (void)didCreate;
/**
* サービスが破棄されます。
*/
- (void)willDestroy;コンテキスト
コンテキストは、クライアント フレームワーク全体のコントロール センターであり、マイクロ アプリケーションとサービス間のインタラクションとジャンプを一元管理し、次の役割を担います。
マイクロアプリケーションを起動するためのインターフェイスを提供します。ユーザーは、名前を使用してマイクロアプリケーションのジャンプをすばやく見つけ、閉じ、管理できます。
サービスを起動し、サービスの登録、検出、および登録解除を管理するためのインターフェイスを提供します。
マイクロアプリケーションを管理する
マイクロアプリケーション管理の関連インターフェイス (詳細については、
DTContext.hファイルをご参照ください):
/**
* 指定された名前のアプリケーションを起動します。
*
* @param name: 起動するアプリケーションの名前。
* @param params: アプリケーションの起動時に別のアプリケーションに転送する必要があるパラメーター。
* @param animated: アプリケーションの起動時にアニメーションを表示するかどうかを指定します。
*
* @return: アプリケーションが正常に起動した場合は YES を返し、それ以外の場合は NO を返します。
*/
- (BOOL)startApplication:(NSString *)name params:(NSDictionary *)params animated:(BOOL)animated;
/**
* 指定された名前のアプリケーションを起動します。
*
* @param name: 起動するアプリケーションの名前。
* @param params: アプリケーションの起動時に別のアプリケーションに転送する必要があるパラメーター。
* @param launchMode: アプリケーションの起動方法を指定します。
*
* @return: アプリケーションが正常に起動した場合は YES を返し、それ以外の場合は NO を返します。
*/
- (BOOL)startApplication:(NSString *)name params:(NSDictionary *)params launchMode:(DTMicroApplicationLaunchMode)launchMode;
/**
* 指定されたアプリケーションを検索します。
*
* @param name: 検索するアプリケーションの名前。
*
* @return: 指定されたアプリケーションがアプリケーションスタックにある場合は、対応するアプリケーションオブジェクトを返し、それ以外の場合は nil を返します。
*/
- (DTMicroApplication *)findApplicationByName:(NSString *)name;
/**
* 現在スタックの最上位にあるアプリケーション、つまりユーザーに表示されているアプリケーションを返します。
*
* @return: 現在表示されているアプリケーション。
*/
- (DTMicroApplication *)currentApplication;マイクロアプリケーションの起動プロセス:

サービス管理
サービス管理の関連インターフェイス (詳細については、
DTContext.hファイルをご参照ください):
/**
* 指定された名前のサービスを検索します。
*
* @param name: サービス名
*
* @return: 指定された名前のサービスが見つかった場合はサービスオブジェクトを返し、それ以外の場合は null を返します。
*/
- (id)findServiceByName:(NSString *)name;
/**
* サービスを登録します。
*
* @param name: サービス名
*/
- (BOOL)registerService:(id)service forName:(NSString *)name;
/**
* 既存のサービスの登録を解除します。
*
* @param name: サービス名
*/
- (void)unregisterServiceForName:(NSString *)name;サービスの開始プロセス:

コンテキストがマイクロアプリケーションとサービスをどのように管理するかを示す UML クラス図を以下に示します。
