#import #import #import #import #import #include #include void tf_run_thread_start(const char* zip_path); @interface ViewController : UIViewController @property(strong, nonatomic) WKWebView* web_view; @property bool initial_load_complete; @end static void _start_initial_load(WKWebView* web_view) { [web_view loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://localhost:12345/"]]]; } @implementation ViewController : UIViewController - (void)viewDidLoad { [super viewDidLoad]; WKWebViewConfiguration* configuration = [[WKWebViewConfiguration alloc] init]; self.web_view = [[WKWebView alloc] initWithFrame:self.view.frame configuration:configuration]; self.web_view.UIDelegate = self; self.web_view.navigationDelegate = self; [self.view addSubview:self.web_view]; _start_initial_load(self.web_view); } - (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation { self.initial_load_complete = true; } - (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation withError:(NSError *)error { if (!self.initial_load_complete) { _start_initial_load(self.web_view); } } - (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL result))completionHandler { UIAlertController *alertController = [UIAlertController alertControllerWithTitle:message message:nil preferredStyle:UIAlertControllerStyleAlert]; [alertController addAction:[UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { completionHandler(true); }]]; [alertController addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) { completionHandler(false); }]]; [self presentViewController:alertController animated:YES completion:^{}]; } - (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler { UIAlertController *alertController = [UIAlertController alertControllerWithTitle:message message:nil preferredStyle:UIAlertControllerStyleAlert]; [alertController addAction:[UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { completionHandler(); }]]; [self presentViewController:alertController animated:YES completion:^{}]; } - (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString *))completionHandler { NSString *sender = [NSString stringWithFormat:@"%@", self.web_view.URL.host]; UIAlertController *alertController = [UIAlertController alertControllerWithTitle:prompt message:sender preferredStyle:UIAlertControllerStyleAlert]; [alertController addTextFieldWithConfigurationHandler:^(UITextField *textField) { textField.placeholder = defaultText; textField.text = defaultText; }]; [alertController addAction:[UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { NSString *input = ((UITextField *)alertController.textFields.firstObject).text; completionHandler(input); }]]; [alertController addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) { completionHandler(nil); }]]; [self presentViewController:alertController animated:YES completion:^{}]; } @end @interface AppDelegate : UIResponder @property(strong, nonatomic) UIWindow* window; @end @implementation AppDelegate - (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; ViewController* view_controller = [[ViewController alloc] init]; self.window.rootViewController = view_controller; [self.window makeKeyAndVisible]; return YES; } @end int main(int argc, char* argv[]) { NSFileManager* file_manager = [NSFileManager defaultManager]; NSString* library_directory = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) objectAtIndex:0]; [file_manager changeCurrentDirectoryPath:library_directory]; size_t path_length = strlen(argv[0]) - strlen(basename(argv[0])); size_t length = path_length + strlen("data.zip"); char* zip_path = alloca(length + 1); snprintf(zip_path, length + 1, "%.*sdata.zip", (int)path_length, argv[0]); tf_run_thread_start(zip_path); return UIApplicationMain(argc, argv, nil, @"AppDelegate"); }