Framework mPaaS iOS berasal dari kerangka pengembangan aplikasi klien Alipay. Sesuai dengan prinsip desain Framework, mPaaS iOS membagi bisnis menjadi beberapa modul yang relatif independen, bertujuan mencapai koherensi tinggi dan kopling rendah antar modul.
Framework mPaaS iOS mengambil alih siklus hidup aplikasi secara langsung, bertanggung jawab atas startup Host, mengelola siklus hidup aplikasi, memproses serta mendistribusikan event delegate dari UIApplication, serta mengelola setiap modul bisnis (MicroApplication dan Services) secara terpadu.
Artikel ini memberikan penjelasan rinci tentang framework mPaaS iOS.
Startup Host
Dengan mengganti fungsi utama program, siklus hidup aplikasi diambil alih secara langsung. Proses startup keseluruhan adalah sebagai berikut:
main -> DFClientDelegate -> Buka aplikasi LauncherPengelolaan siklus hidup aplikasi
Setelah Anda mengakses framework mPaaS, framework sepenuhnya menggantikan AppDelegate. Seluruh siklus hidup aplikasi dikelola oleh framework, namun Anda tetap dapat mengimplementasikan metode delegasi pada tahap-tahap berbeda dalam siklus hidup aplikasi. Framework menyediakan metode akses untuk semua metode delegasi dalam UIApplicationDelegate. Anda hanya perlu menimpa metode yang sesuai dalam Category.
Metode siklus hidup dideklarasikan sebagai berikut (lihat file DTFrameworkInterface.h untuk informasi lebih lanjut):
/**
* Framework perlu mengimplementasikan logika inisialisasi tertentu di didFinishLaunching, tetapi metode ini akan dipanggil sebelum eksekusi.
*/
- (void)application:(UIApplication *)application beforeDidFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
/**
* Framework memanggil balik metode ini, membuat aplikasi yang diakses mengambil alih logika didFinishLaunching miliknya sendiri.
* Ketika DTFrameworkCallbackResultReturnYES atau DTFrameworkCallbackResultReturnNO dikembalikan, mereka langsung dikembalikan ke sistem, tanpa menjalankan logika selanjutnya.
* Metode ini dipanggil balik sebelum memulai BootLoader, aplikasi dapat membuat framework keluar lebih awal dengan mengembalikan DTFrameworkCallbackResultReturnYES atau DTFrameworkCallbackResultReturnNO, tanpa menjalankan BootLoader default.
* Gunakan implementasi default dalam framework, override biasanya tidak diperlukan.
*
* @return : Untuk melanjutkan menjalankan framework, atau mengembalikan YES/NO ke sistem.
*/
- (DTFrameworkCallbackResult)application:(UIApplication *)application handleDidFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
/**
* Framework perlu mengimplementasikan logika inisialisasi tertentu di didFinishLaunching, tetapi metode ini akan dipanggil setelah semua logika selesai.
*/
- (void)application:(UIApplication *)application afterDidFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
/**
* Framework memanggil balik metode ini terlebih dahulu, memungkinkan aplikasi yang diakses untuk memproses pesan notifikasi lebih awal.
* Ketika DTFrameworkCallbackResultContinue dikembalikan, framework menyiarkan pesan ke pendengar global melalui UIApplicationDidReceiveRemoteNotification, dan memanggil completionHandler(UIBackgroundFetchResultNoData).
* Ketika DTFrameworkCallbackResultReturn dikembalikan, itu berarti aplikasi yang diakses telah sepenuhnya memproses pesan, dan framework menghentikan eksekusi logika selanjutnya.
*/
- (DTFrameworkCallbackResult)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler;
/**
* Framework memanggil balik metode ini terlebih dahulu, memungkinkan aplikasi yang diakses untuk memproses pesan notifikasi lebih awal.
* Ketika DTFrameworkCallbackResultContinue dikembalikan, framework menyiarkan pesan ke pendengar global melalui UIApplicationDidReceiveLocalNotification.
* Ketika DTFrameworkCallbackResultReturn dikembalikan, itu berarti aplikasi yang diakses telah sepenuhnya memproses pesan, dan framework menghentikan eksekusi logika selanjutnya.
*/
- (DTFrameworkCallbackResult)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification;
/**
* Framework memanggil balik metode ini terlebih dahulu, memungkinkan aplikasi yang diakses untuk memproses pesan notifikasi lebih awal.
* Ketika DTFrameworkCallbackResultContinue dikembalikan, framework menyiarkan pesan ke pendengar global melalui UIApplicationDidReceiveLocalNotification, dan memanggil completionHandler().
* Ketika DTFrameworkCallbackResultReturn dikembalikan, itu berarti aplikasi yang diakses telah sepenuhnya memproses pesan, dan framework menghentikan eksekusi logika selanjutnya.
*/
- (DTFrameworkCallbackResult)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forLocalNotification:(UILocalNotification *)notification completionHandler:(void (^)())completionHandler;
/**
* Framework memanggil balik metode ini terlebih dahulu, memungkinkan aplikasi yang diakses untuk mendapatkan deviceToken.
* Ketika DTFrameworkCallbackResultContinue dikembalikan, framework menyiarkan pesan ke pendengar global melalui UIApplicationDidRegisterForRemoteNotifications.
* Ketika DTFrameworkCallbackResultReturn dikembalikan, itu berarti aplikasi yang diakses telah sepenuhnya memproses, dan framework menghentikan eksekusi logika selanjutnya.
*/
- (DTFrameworkCallbackResult)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken;
/**
* Framework memanggil balik metode ini terlebih dahulu ketika gagal mendapatkan deviceToken.
* Ketika DTFrameworkCallbackResultContinue dikembalikan, framework melanjutkan eksekusi, saat ini tidak ada logika lain.
* Ketika DTFrameworkCallbackResultReturn dikembalikan, framework menghentikan eksekusi logika selanjutnya, saat ini tidak ada logika lain.
*/
- (DTFrameworkCallbackResult)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error;
/**
* Framework memberi tahu komponen berbagi (jika ada, dan shouldAutoactivateShareKit mengembalikan YES) terlebih dahulu, jika komponen berbagi tidak dapat memprosesnya, metode ini dipanggil balik untuk memungkinkan aplikasi yang diakses memproses openURL.
* Ketika DTFrameworkCallbackResultReturnYES atau DTFrameworkCallbackResultReturnNO dikembalikan, framework langsung mengembalikan ke sistem, tanpa menjalankan logika selanjutnya.
* Ketika DTFrameworkCallbackResultContinue dikembalikan, framework melanjutkan pemrosesan URL, dan mendistribusikannya ke SchemeHandler dan kelas lain untuk pemrosesan lebih lanjut.
*
* Dibandingkan dengan metode sistem, metode ini memiliki parameter newURL tambahan, memungkinkan aplikasi mengembalikan URL yang berbeda setelah pemrosesan. Jika fungsi mengembalikan DTFrameworkCallbackResultContinue dan memberikan nilai ke newURL, framework akan menggunakan URL baru untuk pemrosesan selanjutnya.
*/
- (DTFrameworkCallbackResult)application:(UIApplication *)application openURL:(NSURL *)url newURL:(NSURL **)newURL sourceApplication:(NSString *)sourceApplication annotation:(id)annotation;
/**
* Framework memanggil balik metode ini terlebih dahulu.
* Ketika DTFrameworkCallbackResultContinue dikembalikan, framework melanjutkan eksekusi, saat ini tidak ada logika lain.
* Ketika DTFrameworkCallbackResultReturn dikembalikan, framework menghentikan eksekusi logika selanjutnya, saat ini tidak ada logika lain.
*/
- (DTFrameworkCallbackResult)applicationWillResignActive:(UIApplication *)application;
/**
* Framework memanggil balik metode ini terlebih dahulu.
* Ketika DTFrameworkCallbackResultContinue dikembalikan, framework melanjutkan eksekusi, saat ini tidak ada logika lain.
* Ketika DTFrameworkCallbackResultReturn dikembalikan, framework menghentikan eksekusi logika selanjutnya, saat ini tidak ada logika lain.
*/
- (DTFrameworkCallbackResult)applicationDidEnterBackground:(UIApplication *)application;
/**
* Framework memanggil balik metode ini terlebih dahulu.
* Ketika DTFrameworkCallbackResultContinue dikembalikan, framework melanjutkan eksekusi, saat ini tidak ada logika lain.
* Ketika DTFrameworkCallbackResultReturn dikembalikan, framework menghentikan eksekusi logika selanjutnya, saat ini tidak ada logika lain.
*/
- (DTFrameworkCallbackResult)applicationWillEnterForeground:(UIApplication *)application;
/**
* Framework memanggil balik metode ini terlebih dahulu.
* Ketika DTFrameworkCallbackResultContinue dikembalikan, framework melanjutkan eksekusi dan memberikan event ke komponen berbagi (jika ada, dan shouldAutoactivateShareKit mengembalikan YES). Jika seluruh aplikasi belum dimuat, BootLoader dipanggil.
* Ketika DTFrameworkCallbackResultReturn dikembalikan, framework menghentikan eksekusi logika selanjutnya, saat ini tidak ada logika lain.
*/
- (DTFrameworkCallbackResult)applicationDidBecomeActive:(UIApplication *)application;
/**
* Framework memanggil balik metode ini terlebih dahulu.
* Ketika DTFrameworkCallbackResultContinue dikembalikan, framework melanjutkan eksekusi, saat ini tidak ada logika lain.
* Ketika DTFrameworkCallbackResultReturn dikembalikan, framework menghentikan eksekusi logika selanjutnya, saat ini tidak ada logika lain.
*/
- (DTFrameworkCallbackResult)applicationWillTerminate:(UIApplication *)application;
/**
* Framework memanggil balik metode ini terlebih dahulu.
* Ketika DTFrameworkCallbackResultContinue dikembalikan, framework melanjutkan eksekusi, saat ini tidak ada logika lain.
* Ketika DTFrameworkCallbackResultReturn dikembalikan, framework menghentikan eksekusi logika selanjutnya, saat ini tidak ada logika lain.
*/
- (DTFrameworkCallbackResult)applicationDidReceiveMemoryWarning:(UIApplication *)application;
/**
* Framework memanggil balik metode ini terlebih dahulu, memungkinkan aplikasi yang diakses untuk memproses pesan Watch lebih awal.
* Ketika DTFrameworkCallbackResultContinue dikembalikan, framework menyiarkan pesan Watch ke pendengar global melalui UIApplicationWatchKitExtensionRequestNotifications.
* Ketika DTFrameworkCallbackResultReturn dikembalikan, itu berarti aplikasi yang diakses telah sepenuhnya memproses pesan, dan framework menghentikan eksekusi logika selanjutnya.
*/
- (DTFrameworkCallbackResult)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void(^)(NSDictionary *replyInfo))reply;
/**
* Framework memanggil balik metode ini terlebih dahulu, memungkinkan aplikasi yang diakses untuk memproses pesan lebih awal.
* Ketika DTFrameworkCallbackResultContinue dikembalikan, framework menyiarkan pesan ke pendengar global melalui UIApplicationUserActivityNotifications, dan mengembalikan NO ke sistem pada akhirnya.
* Ketika DTFrameworkCallbackResultReturnYES atau DTFrameworkCallbackResultReturnNO dikembalikan, framework langsung mengembalikan ke sistem, tanpa menjalankan logika selanjutnya.
*/
- (DTFrameworkCallbackResult)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void(^)(NSArray *restorableObjects))restorationHandler;
/**
* Framework memanggil balik metode ini terlebih dahulu, memungkinkan aplikasi yang diakses untuk memproses pesan entri cepat 3D Touch lebih awal.
* Ketika DTFrameworkCallbackResultContinue dikembalikan, framework memproses URL yang dibawa oleh shortcutItem, dan memanggil completionHandler() untuk mengembalikan apakah sudah diproses.
* Ketika DTFrameworkCallbackResultReturn dikembalikan, framework langsung mengembalikan ke sistem, tanpa menjalankan logika selanjutnya.
*/
- (DTFrameworkCallbackResult)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler;
/**
* Mekanisme callback Background Fetch
* completionHandler harus dipanggil balik dalam 30 detik, jika tidak proses akan dihentikan.
* Untuk mengaktifkan mekanisme ini, Anda perlu mengonfigurasi opsi fetch dari Background Modes, lalu panggil metode berikut di didFinishLaunching. Lihat dokumentasi untuk informasi lebih lanjut.
* [application setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];
* Implementasi default adalah null, Anda perlu memprosesnya dengan cara Anda sendiri.
*/
- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler;Pembagian modul aplikasi
Framework mPaaS mendefinisikan MicroApplication dan Service untuk memisahkan modul yang berbeda. Menggunakan "apakah memiliki antarmuka UI" sebagai kriteria, Framework mengklasifikasikan modul menjadi MicroApplication dan Service, serta mengimplementasikan manajemen siklus hidup modul melalui Context.
Istilah | Definisi |
MicroApplication | Aplikasi mikro dengan UI pada klien saat runtime |
Service | Layanan ringan yang disediakan oleh klien saat runtime |
Context | Konteks komponen mikro klien saat runtime |
Bagian ini memperkenalkan konsep aplikasi mikro, layanan, dan konteks. Lihat Buat aplikasi mikro untuk informasi lebih lanjut.
MicroApplication
Dalam pengembangan aplikasi berbasis framework mPaaS iOS, layanan independen dengan UI umumnya ditetapkan sebagai aplikasi mikro (misalnya: transfer, isi ulang ponsel, dan layanan lainnya di Alipay). Layanan tersebut diisolasi dari layanan lain untuk mencapai kemandirian tinggi dan nol ketergantungan di antara aplikasi mikro.
Setiap aplikasi mikro memiliki siklus hidupnya sendiri. Proses keseluruhan adalah sebagai berikut:

Metode callback aplikasi mikro selama siklus hidup penuh (lihat file DTMicroApplicationDelegate.h untuk informasi lebih lanjut):
@required
/**
* Meminta delegasi objek aplikasi untuk mengembalikan root view controller.
*
* @param application: Objek aplikasi.
*
* @return: Root view controller dari aplikasi.
*/
- (UIViewController *)rootControllerInApplication:(DTMicroApplication *)application;
@optional
/**
* Memberi tahu delegasi aplikasi bahwa objek aplikasi telah diinstansiasi.
*
* @param application: Objek aplikasi.
*/
- (void)applicationDidCreate:(DTMicroApplication *)application;
/**
* Memberi tahu delegasi aplikasi bahwa aplikasi akan diluncurkan.
*
* @param application: Objek aplikasi yang diluncurkan.
* @param options: Parameter operasi aplikasi.
*/
- (void)application:(DTMicroApplication *)application willStartLaunchingWithOptions:(NSDictionary *)options;
/**
* Memberi tahu delegasi aplikasi bahwa aplikasi sudah diluncurkan.
*
* @param application: Objek aplikasi yang diluncurkan.
*/
- (void)applicationDidFinishLaunching:(DTMicroApplication *)application;
/**
* Memberi tahu delegasi aplikasi bahwa aplikasi akan dijeda dan dimasukkan ke latar belakang.
*
* @param application: Objek aplikasi yang diluncurkan.
*/
- (void)applicationWillPause:(DTMicroApplication *)application;
/**
* Memberi tahu delegasi aplikasi bahwa aplikasi akan diaktifkan kembali.
*
* @param application: Objek aplikasi yang akan diaktifkan.
*/
- (void)application:(DTMicroApplication *)application willResumeWithOptions:(NSDictionary *)options;
/**
* Memberi tahu delegasi aplikasi bahwa aplikasi telah diaktifkan.
*
* @param application: Objek aplikasi yang akan diaktifkan.
*/
- (void)applicationDidResume:(DTMicroApplication *)application;
/**
* Memberi tahu delegasi aplikasi bahwa aplikasi telah diaktifkan.
*
* @param application: Objek aplikasi yang akan diaktifkan, bersama dengan versi parameter.
*/
- (void)application:(DTMicroApplication *)application didResumeWithOptions:(NSDictionary *)options;
/**
* Memberi tahu delegasi aplikasi bahwa aplikasi akan keluar.
*
* @param application: Objek aplikasi.
*/
- (void)applicationWillTerminate:(DTMicroApplication *)application;
/**
* Memberi tahu delegasi aplikasi bahwa aplikasi akan keluar.
*
* @param application: Objek aplikasi.
* @param animated: Apakah keluar dengan animasi.
*/
- (void)applicationWillTerminate:(DTMicroApplication *)application animated:(BOOL)animated;
/**
* Menanyakan delegasi aplikasi apakah aplikasi dapat keluar atau tidak.
* Catatan: Delegasi mengembalikan **NO** dalam beberapa kasus khusus. Jika defaultnya adalah **Yes**, aplikasi dapat keluar.
*
* @param application: Objek aplikasi.
*
* @return: Apakah aplikasi dapat keluar atau tidak.
*/
- (BOOL)applicationShouldTerminate:(DTMicroApplication *)application;Service
Framework mPaaS iOS menganggap Framework tanpa UI sebagai layanan. Perbedaan antara microapplication dan layanan adalah sebagai berikut:
Microapplication berfungsi sebagai proses bisnis independen, sementara layanan digunakan untuk menyediakan layanan umum.
Layanan bersifat stateful. Setelah dimulai, layanan ada sepanjang siklus hidup klien dan dapat diperoleh kapan saja; microapplication akan dihapus setelah keluar.
Antarmuka relevan untuk manajemen layanan (lihat file DTService.h untuk informasi lebih lanjut):
@required
/**
* Mulai layanan.
* Catatan:
* Framework akan memanggil metode ini setelah inisialisasi.
* Layanan hanya dapat memulai aplikasi jika metode ini dipanggil.
*/
- (void)start;
@optional
/**
* Layanan dibuat.
*/
- (void)didCreate;
/**
* Layanan akan dihapus.
*/
- (void)willDestroy;Context
Context adalah pusat kontrol dari seluruh kerangka kerja klien, melakukan manajemen terpadu pada interaksi dan lompatan di antara aplikasi mikro dan layanan, dengan tanggung jawab berikut:
Menyediakan antarmuka untuk memulai aplikasi mikro. Pengguna dapat dengan cepat menemukan, menutup, dan mengelola lompatan aplikasi mikro melalui nama.
Menyediakan antarmuka untuk memulai layanan, mengelola pendaftaran, penemuan, dan pencabutan pendaftaran layanan.
Kelola aplikasi mikro
Antarmuka relevan untuk manajemen aplikasi mikro (lihat file
DTContext.huntuk informasi lebih lanjut):
/**
* Mulai aplikasi sesuai dengan nama yang diberikan.
*
* @param name: Nama aplikasi yang akan dimulai.
* @param params: Parameter yang perlu diteruskan ke aplikasi lain saat aplikasi dimulai.
* @param animated: Tentukan apakah akan menampilkan animasi saat memulai aplikasi.
*
* @return: Kembalikan YES jika aplikasi berhasil dimulai, jika tidak NO.
*/
- (BOOL)startApplication:(NSString *)name params:(NSDictionary *)params animated:(BOOL)animated;
/**
* Mulai aplikasi sesuai dengan nama yang diberikan.
*
* @param name: Nama aplikasi yang akan dimulai.
* @param params: Parameter yang perlu diteruskan ke aplikasi lain saat aplikasi dimulai.
* @param launchMode: Tentukan metode memulai aplikasi.
*
* @return: Kembalikan YES jika aplikasi berhasil dimulai, jika tidak NO.
*/
- (BOOL)startApplication:(NSString *)name params:(NSDictionary *)params launchMode:(DTMicroApplicationLaunchMode)launchMode;
/**
* Temukan aplikasi yang ditentukan.
*
* @param name: Nama aplikasi yang ingin dicari.
*
* @return: Kembalikan objek aplikasi yang sesuai jika aplikasi yang ditentukan ada dalam tumpukan aplikasi, jika tidak nil.
*/
- (DTMicroApplication *)findApplicationByName:(NSString *)name;
/**
* Kembalikan aplikasi yang berada di bagian atas tumpukan saat ini, yaitu aplikasi yang terlihat oleh pengguna.
*
* @return: Aplikasi yang terlihat saat ini.
*/
- (DTMicroApplication *)currentApplication;Proses memulai aplikasi mikro:

Manajemen layanan
Antarmuka relevan untuk manajemen layanan (lihat file
DTContext.huntuk informasi lebih lanjut):
/**
* Temukan layanan sesuai dengan nama yang diberikan.
*
* @param name: Nama layanan
*
* @return: Kembalikan objek layanan jika layanan dengan nama yang diberikan ditemukan, jika tidak null.
*/
- (id)findServiceByName:(NSString *)name;
/**
* Daftarkan layanan.
*
* @param name: Nama layanan
*/
- (BOOL)registerService:(id)service forName:(NSString *)name;
/**
* Hapus pendaftaran layanan yang ada.
*
* @param name: Nama layanan
*/
- (void)unregisterServiceForName:(NSString *)name;Proses memulai layanan:

Diagram kelas UML yang menggambarkan bagaimana context mengelola aplikasi mikro dan layanan ditunjukkan di bawah ini:
