diff --git a/build/config/ios/ios_app.py b/build/config/ios/ios_app.py index fa86c7acf17fe5039ba169f79e236d429034c1a7..044d597ccbc52c586a2a4df8dda804fc468d4864 100644 --- a/build/config/ios/ios_app.py +++ b/build/config/ios/ios_app.py @@ -15,9 +15,25 @@ PLUTIL = [ 'plutil' ] +def MakeDirectories(path): + try: + os.makedirs(path) + except OSError as exc: + if exc.errno == errno.EEXIST and os.path.isdir(path): + return 0 + else: + return -1 + + return 0 + def ProcessInfoPlist(args): output_plist_file = os.path.abspath(os.path.join(args.output, 'Info.plist')) + + print os.path.dirname(output_plist_file) + if MakeDirectories(os.path.dirname(output_plist_file)) == -1: + return -1 + return subprocess.check_call( PLUTIL + [ '-convert', 'binary1', @@ -42,18 +58,6 @@ def PerformCodeSigning(args): ]) -def MakeDirectories(path): - try: - os.makedirs(path) - except OSError as exc: - if exc.errno == errno.EEXIST and os.path.isdir(path): - return 0 - else: - return -1 - - return 0 - - def GenerateProjectStructure(args): application_path = os.path.join( args.dir, args.name + ".app" ) return MakeDirectories( application_path ) diff --git a/build/config/ios/rules.gni b/build/config/ios/rules.gni index 003226287b79adfdc78977dfc838f7bd78a74f72..caf8eb2df4e9dd08159dd6d0b4046aa7961f2019 100644 --- a/build/config/ios/rules.gni +++ b/build/config/ios/rules.gni @@ -56,6 +56,10 @@ template("resource_copy_ios") { set_sources_assignment_filter([]) sources = _resources outputs = [ "$root_build_dir/$_app_name.app/$_bundle_directory/{{source_file_part}}" ] + + if (defined(invoker.deps)) { + deps = invoker.deps + } } } @@ -115,14 +119,14 @@ template("ios_app") { script = ios_app_script sources = [ invoker.info_plist ] - outputs = [ "$root_build_dir/Info.plist" ] + outputs = [ "$root_build_dir/plist/$app_name/Info.plist" ] args = [ "plist", "-i", rebase_path(invoker.info_plist, root_build_dir), "-o", - rebase_path(root_build_dir), + rebase_path("$root_build_dir/plist/$app_name"), ] } @@ -131,7 +135,7 @@ template("ios_app") { copy_gen_target_name = target_name + "_copy" copy(copy_gen_target_name) { sources = [ - "$root_build_dir/Info.plist", + "$root_build_dir/plist/$app_name/Info.plist", "$root_build_dir/$app_name", ] diff --git a/sky/build/sky_app.gni b/sky/build/sky_app.gni index a4380bf3b2a25e3a3b4b1a497da72067ead38094..6919b7d6b62d4ec2d4c538ab7345acfe2ad8003f 100644 --- a/sky/build/sky_app.gni +++ b/sky/build/sky_app.gni @@ -7,7 +7,7 @@ import("//sky/build/skyx.gni") template("sky_app") { skyx_target_name = target_name - if (is_android) { + if (is_android || is_ios) { skyx_target_name = "app" } @@ -89,5 +89,45 @@ template("sky_app") { deps += invoker.deps } } + } else if (is_ios && defined(invoker.info_plist)) { + import("//build/config/ios/rules.gni") + import("//build/config/ios/ios_sdk.gni") + + ios_app(target_name) { + app_name = target_name + "_app" + + code_signing_identity = ios_code_signing_identity + + info_plist = invoker.info_plist + + if (defined(invoker.entitlements_path)) { + entitlements_path = invoker.entitlements_path + } else { + entitlements_path = "//sky/shell/ios/Entitlements.xcent" + } + + resources_gen_target_name = target_name + "_res" + resource_copy_ios(resources_gen_target_name) { + resources = [ + "//third_party/icu/android/icudtl.dat", + "$target_gen_dir/app.skyx", + ] + bundle_directory = "." + deps = [ ":app" ] + } + + deps = [ + "//sky/shell:ios_scaffolding", + ":$resources_gen_target_name", + ":$skyx_target_name", + ] + + if (defined(invoker.deps)) { + deps += invoker.deps + } + } + } else { + group(target_name) { + } } } diff --git a/sky/packages/sky/example/game/BUILD.gn b/sky/packages/sky/example/game/BUILD.gn index e4b47a3b41a77b7b381b6c0453d131f2c5c69fcf..aecc1613c68250f2ab4609dcceb1c3671aa2d0ba 100644 --- a/sky/packages/sky/example/game/BUILD.gn +++ b/sky/packages/sky/example/game/BUILD.gn @@ -14,5 +14,7 @@ sky_app("game") { deps = [ "//sky/packages/sky/example/game/apk:resources", ] + } else if (is_ios) { + info_plist = "ios/Info.plist" } } diff --git a/sky/sdk/example/game/ios/Info.plist b/sky/sdk/example/game/ios/Info.plist new file mode 100644 index 0000000000000000000000000000000000000000..a2de16e639236964e0362fafbede1f585349ca21 --- /dev/null +++ b/sky/sdk/example/game/ios/Info.plist @@ -0,0 +1,52 @@ + + + + + CFBundleDevelopmentRegion + en + + + CFBundleExecutable + game_app + + CFBundleIdentifier + org.domokit.sky.game + + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + game_app + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UIRequiredDeviceCapabilities + + armv7 + + DTPlatformName + iphonesimulator + DTSDKName + iphonesimulator8.3 + LSRequiresIPhoneOS + + MinimumOSVersion + 8.3 + UIDeviceFamily + + 1 + 2 + + CFBundleSupportedPlatforms + + iPhoneSimulator + + + diff --git a/sky/shell/BUILD.gn b/sky/shell/BUILD.gn index b469b01b5307059c85253030d5df833e50faa466..cb33f44b8d7a821f903bbd78245cf0a3a403619a 100644 --- a/sky/shell/BUILD.gn +++ b/sky/shell/BUILD.gn @@ -169,10 +169,40 @@ if (is_android) { import("//build/config/ios/rules.gni") import("//build/config/ios/ios_sdk.gni") + group("ios_shell_scaffolding") { + + } + + source_set("ios_scaffolding") { + sources = [ + "ios/main_ios.mm", + "ios/sky_app_delegate.h", + "ios/sky_app_delegate.mm", + "ios/sky_surface.h", + "ios/sky_surface.mm", + "ios/sky_view_controller.h", + "ios/sky_view_controller.mm", + ] + + set_sources_assignment_filter([]) + sources += [ + "mac/platform_mac.h", + "mac/platform_mac.mm", + "mac/platform_service_provider_mac.cc", + "mac/platform_view_mac.h", + "mac/platform_view_mac.mm", + ] + set_sources_assignment_filter(sources_assignment_filter) + + deps = common_deps + [ + ":common", + "//sky/services/ns_net", + ] + } + ios_app("shell") { app_name = "SkyShell" info_plist = "ios/Info.plist" - scaffolding_target = "ios_scaffolding" entitlements_path = "ios/Entitlements.xcent" code_signing_identity = ios_code_signing_identity @@ -181,35 +211,8 @@ if (is_android) { bundle_directory = "." } - source_set(scaffolding_target) { - sources = [ - "ios/main_ios.mm", - "ios/sky_app_delegate.h", - "ios/sky_app_delegate.mm", - "ios/sky_surface.h", - "ios/sky_surface.mm", - "ios/sky_view_controller.h", - "ios/sky_view_controller.mm", - ] - - set_sources_assignment_filter([]) - sources += [ - "mac/platform_mac.h", - "mac/platform_mac.mm", - "mac/platform_service_provider_mac.cc", - "mac/platform_view_mac.h", - "mac/platform_view_mac.mm", - ] - set_sources_assignment_filter(sources_assignment_filter) - - deps = common_deps + [ - ":common", - "//sky/services/ns_net", - ] - } - deps = [ - ":$scaffolding_target", + ":ios_scaffolding", ":sky_resources", ] } diff --git a/sky/shell/ios/sky_surface.mm b/sky/shell/ios/sky_surface.mm index 92122b69c7222fda4381832eb2728cc70ceeec30..815cf32ca14bc79c3ba193d2f3d46e9d4fb49124 100644 --- a/sky/shell/ios/sky_surface.mm +++ b/sky/shell/ios/sky_surface.mm @@ -125,22 +125,32 @@ static sky::InputEventPtr BasicInputEventFromRecognizer( } - (NSString*)skyInitialLoadURL { - NSUserDefaults *standardDefaults = [NSUserDefaults standardUserDefaults]; - NSString *target = [standardDefaults stringForKey:@"target"]; - NSString *server = [standardDefaults stringForKey:@"server"]; - if (server && target) { - return [NSString stringWithFormat:@"http://%@/%@", server, target]; - } - return [NSBundle mainBundle].infoDictionary[@"org.domokit.sky.load_url"]; } +- (NSString*)skyInitialBundleURL { + return [[NSBundle mainBundle] pathForResource:@"app" ofType:@"skyx"]; +} + - (void)connectToEngineAndLoad { auto interface_request = mojo::GetProxy(&_sky_engine); self.platformView->ConnectToEngine(interface_request.Pass()); - mojo::String string(self.skyInitialLoadURL.UTF8String); - _sky_engine->RunFromNetwork(string); + NSString *endpoint = self.skyInitialBundleURL; + if (endpoint.length > 0) { + // Load from bundle + mojo::String string(endpoint.UTF8String); + _sky_engine->RunFromBundle(string); + return; + } + + endpoint = self.skyInitialLoadURL; + if (endpoint.length > 0) { + // Load from URL + mojo::String string(endpoint.UTF8String); + _sky_engine->RunFromNetwork(string); + return; + } } - (void)notifySurfaceDestruction {