Browse Source

build Qt launcher, launch Client with it

kambala-decapitator/vcmi#17
Andrey Filipenkov 4 years ago
parent
commit
67ef0c234d

+ 1 - 1
CMakeLists.txt

@@ -57,10 +57,10 @@ endif()
 
 option(ENABLE_ERM "Enable compilation of ERM scripting module" OFF)
 option(ENABLE_LUA "Enable compilation of LUA scripting module" OFF)
+option(ENABLE_LAUNCHER "Enable compilation of launcher" ON)
 if(APPLE_IOS)
 	set(BUNDLE_IDENTIFIER_PREFIX "" CACHE STRING "Bundle identifier prefix")
 else()
-	option(ENABLE_LAUNCHER "Enable compilation of launcher" ON)
 	option(ENABLE_TEST "Enable compilation of unit tests" ON)
 endif()
 if(NOT ${CMAKE_VERSION} VERSION_LESS "3.16.0")

+ 9 - 0
client/ios/Info.plist

@@ -18,6 +18,15 @@
 	<string>$(MARKETING_VERSION)</string>
 	<key>CFBundleSignature</key>
 	<string>????</string>
+	<key>CFBundleURLTypes</key>
+	<array>
+		<dict>
+			<key>CFBundleURLSchemes</key>
+			<array>
+				<string>vcmi</string>
+			</array>
+		</dict>
+	</array>
 	<key>CFBundleVersion</key>
 	<string>1</string>
 	<key>LSRequiresIPhoneOS</key>

+ 3 - 2
configure_ios.sh

@@ -1,9 +1,10 @@
 #!/usr/bin/env bash
 
-boostPrefix=~/dev/other/Apple-Boost-BuildScript/build/boost/1.75.0/ios/debug/prefix
+boostPrefix=~/dev/other/Apple-Boost-BuildScript/build-static/boost/1.75.0/ios/debug/prefix
 ffmpegDir=~/dev/ios/vcmi-ios-deps/mobile-ffmpeg-min-universal-4.4
 sdlLibsDir=~/dev/ios/vcmi-ios-deps/SDL2-lib
-prefixPath="$boostPrefix;$ffmpegDir;$sdlLibsDir"
+qtDir=~/dev/Qt-libs/5.15.2/ios
+prefixPath="$boostPrefix;$ffmpegDir;$sdlLibsDir;$qtDir"
 
 # prefixPath="$boostPrefix;$sdlLibsDir"
 # xcodeMajorVersion=$(xcodebuild -version | fgrep Xcode | cut -d ' ' -f 2 | cut -d . -f 1)

+ 39 - 7
launcher/CMakeLists.txt

@@ -53,6 +53,10 @@ set(launcher_FORMS
 		updatedialog_moc.ui
 )
 
+if(APPLE_IOS)
+	set(launcher_SRCS ${launcher_SRCS} ios/mainwindow_moc.mm)
+endif()
+
 assign_source_group(${launcher_SRCS} ${launcher_HEADERS} VCMI_launcher.rc)
 
 # Tell CMake to run moc when necessary:
@@ -98,6 +102,26 @@ if(APPLE)
 	# This makes Xcode project prettier by moving vcmilauncher_autogen directory into vcmiclient subfolder
 	set_property(GLOBAL PROPERTY AUTOGEN_TARGETS_FOLDER vcmilauncher)
 endif()
+if(APPLE_IOS)
+	set(CMAKE_EXE_LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS} "-Wl,-e,_qt_main_wrapper")
+
+	set(ENTITLEMENTS_OUT_PATH ${CMAKE_CURRENT_BINARY_DIR}/VCMI.entitlements)
+	configure_file(ios/Entitlements.in ${ENTITLEMENTS_OUT_PATH} @ONLY)
+
+	set_target_properties(vcmilauncher PROPERTIES
+		MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_LIST_DIR}/ios/Info.plist"
+		SKIP_BUILD_RPATH 1
+		XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED YES
+		XCODE_ATTRIBUTE_ASSETCATALOG_COMPILER_APPICON_NAME AppIcon
+		XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS ${ENTITLEMENTS_OUT_PATH}
+	)
+
+	target_sources(vcmilauncher PRIVATE ${CMAKE_SOURCE_DIR}/client/LaunchScreen.storyboard)
+	set_source_files_properties(${CMAKE_SOURCE_DIR}/client/LaunchScreen.storyboard PROPERTIES MACOSX_PACKAGE_LOCATION "Resources")
+
+	target_sources(vcmilauncher PRIVATE ios/Images.xcassets)
+	set_source_files_properties(ios/Images.xcassets PROPERTIES MACOSX_PACKAGE_LOCATION "Resources")
+endif()
 
 target_link_libraries(vcmilauncher vcmi Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::Network)
 target_include_directories(vcmilauncher
@@ -112,11 +136,19 @@ add_custom_command(TARGET vcmilauncher POST_BUILD
 	COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/launcher/icons ${CMAKE_BINARY_DIR}/bin/${CMAKE_CFG_INTDIR}/launcher/icons
 )
 
-install(TARGETS vcmilauncher DESTINATION ${BIN_DIR})
-# copy whole directory
-install(DIRECTORY icons DESTINATION ${DATA_DIR}/launcher)
-# Install icons and desktop file on Linux
-if(NOT WIN32 AND NOT APPLE)
-	install(FILES "vcmilauncher.desktop" DESTINATION share/applications)
-	install(FILES "eu.vcmi.VCMI.metainfo.xml" DESTINATION share/metainfo)
+if(APPLE_IOS)
+	add_custom_command(TARGET vcmilauncher POST_BUILD
+		COMMAND ${CMAKE_COMMAND} --install "${CMAKE_BINARY_DIR}" --config "$<CONFIG>" --prefix "$<TARGET_BUNDLE_CONTENT_DIR:vcmilauncher>"
+		COMMAND ${CMAKE_INSTALL_NAME_TOOL} -add_rpath @executable_path/Frameworks $<TARGET_FILE:vcmilauncher> || true
+		COMMAND ${CMAKE_SOURCE_DIR}/apple_codesign.sh
+	)
+else()
+	install(TARGETS vcmilauncher DESTINATION ${BIN_DIR})
+	# copy whole directory
+	install(DIRECTORY icons DESTINATION ${DATA_DIR}/launcher)
+	# Install icons and desktop file on Linux
+	if(NOT WIN32 AND NOT APPLE)
+		install(FILES "vcmilauncher.desktop" DESTINATION share/applications)
+		install(FILES "eu.vcmi.VCMI.metainfo.xml" DESTINATION share/metainfo)
+	endif()
 endif()

+ 10 - 0
launcher/ios/Entitlements.in

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>com.apple.security.application-groups</key>
+	<array>
+		<string>group.@[email protected]</string>
+	</array>
+</dict>
+</plist>

+ 121 - 0
launcher/ios/Images.xcassets/AppIcon.appiconset/Contents.json

@@ -0,0 +1,121 @@
+{
+  "images" : [
+    {
+      "filename" : "[email protected]",
+      "idiom" : "iphone",
+      "scale" : "2x",
+      "size" : "20x20"
+    },
+    {
+      "filename" : "[email protected]",
+      "idiom" : "iphone",
+      "scale" : "3x",
+      "size" : "20x20"
+    },
+    {
+      "filename" : "[email protected]",
+      "idiom" : "iphone",
+      "scale" : "1x",
+      "size" : "29x29"
+    },
+    {
+      "filename" : "[email protected]",
+      "idiom" : "iphone",
+      "scale" : "2x",
+      "size" : "29x29"
+    },
+    {
+      "filename" : "[email protected]",
+      "idiom" : "iphone",
+      "scale" : "3x",
+      "size" : "29x29"
+    },
+    {
+      "filename" : "[email protected]",
+      "idiom" : "iphone",
+      "scale" : "2x",
+      "size" : "40x40"
+    },
+    {
+      "filename" : "[email protected]",
+      "idiom" : "iphone",
+      "scale" : "3x",
+      "size" : "40x40"
+    },
+    {
+      "filename" : "[email protected]",
+      "idiom" : "iphone",
+      "scale" : "2x",
+      "size" : "60x60"
+    },
+    {
+      "filename" : "[email protected]",
+      "idiom" : "iphone",
+      "scale" : "3x",
+      "size" : "60x60"
+    },
+    {
+      "filename" : "[email protected]",
+      "idiom" : "ipad",
+      "scale" : "1x",
+      "size" : "20x20"
+    },
+    {
+      "filename" : "[email protected]",
+      "idiom" : "ipad",
+      "scale" : "2x",
+      "size" : "20x20"
+    },
+    {
+      "filename" : "[email protected]",
+      "idiom" : "ipad",
+      "scale" : "1x",
+      "size" : "29x29"
+    },
+    {
+      "filename" : "[email protected]",
+      "idiom" : "ipad",
+      "scale" : "2x",
+      "size" : "29x29"
+    },
+    {
+      "filename" : "[email protected]",
+      "idiom" : "ipad",
+      "scale" : "1x",
+      "size" : "40x40"
+    },
+    {
+      "filename" : "[email protected]",
+      "idiom" : "ipad",
+      "scale" : "2x",
+      "size" : "40x40"
+    },
+    {
+      "filename" : "[email protected]",
+      "idiom" : "ipad",
+      "scale" : "1x",
+      "size" : "76x76"
+    },
+    {
+      "filename" : "[email protected]",
+      "idiom" : "ipad",
+      "scale" : "2x",
+      "size" : "76x76"
+    },
+    {
+      "filename" : "[email protected]",
+      "idiom" : "ipad",
+      "scale" : "2x",
+      "size" : "83.5x83.5"
+    },
+    {
+      "idiom" : "ios-marketing",
+      "scale" : "1x",
+      "size" : "1024x1024"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
launcher/ios/Images.xcassets/AppIcon.appiconset/[email protected]


BIN
launcher/ios/Images.xcassets/AppIcon.appiconset/[email protected]


BIN
launcher/ios/Images.xcassets/AppIcon.appiconset/[email protected]


BIN
launcher/ios/Images.xcassets/AppIcon.appiconset/[email protected]


BIN
launcher/ios/Images.xcassets/AppIcon.appiconset/[email protected]


BIN
launcher/ios/Images.xcassets/AppIcon.appiconset/[email protected]


BIN
launcher/ios/Images.xcassets/AppIcon.appiconset/[email protected]


BIN
launcher/ios/Images.xcassets/AppIcon.appiconset/[email protected]


BIN
launcher/ios/Images.xcassets/AppIcon.appiconset/[email protected]


BIN
launcher/ios/Images.xcassets/AppIcon.appiconset/[email protected]


BIN
launcher/ios/Images.xcassets/AppIcon.appiconset/[email protected]


BIN
launcher/ios/Images.xcassets/AppIcon.appiconset/[email protected]


BIN
launcher/ios/Images.xcassets/AppIcon.appiconset/[email protected]


BIN
launcher/ios/Images.xcassets/AppIcon.appiconset/[email protected]


+ 6 - 0
launcher/ios/Images.xcassets/Contents.json

@@ -0,0 +1,6 @@
+{
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

+ 55 - 0
launcher/ios/Info.plist

@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>en</string>
+	<key>CFBundleExecutable</key>
+	<string>$(PRODUCT_NAME)</string>
+	<key>CFBundleIdentifier</key>
+	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundleName</key>
+	<string>VCMI laucher</string>
+	<key>CFBundlePackageType</key>
+	<string>APPL</string>
+	<key>CFBundleShortVersionString</key>
+	<string>$(MARKETING_VERSION)</string>
+	<key>CFBundleSignature</key>
+	<string>????</string>
+	<key>CFBundleVersion</key>
+	<string>1</string>
+	<key>LSApplicationQueriesSchemes</key>
+	<array>
+		<string>vcmi</string>
+	</array>
+	<key>LSRequiresIPhoneOS</key>
+	<true/>
+	<key>NSAppTransportSecurity</key>
+	<dict>
+		<key>NSAllowsArbitraryLoads</key>
+		<true/>
+	</dict>
+	<key>UIFileSharingEnabled</key>
+	<true/>
+	<key>UILaunchStoryboardName</key>
+	<string>LaunchScreen</string>
+	<key>UIRequiredDeviceCapabilities</key>
+	<array>
+		<string>armv7</string>
+	</array>
+	<key>UISupportedInterfaceOrientations</key>
+	<array>
+		<string>UIInterfaceOrientationLandscapeLeft</string>
+		<string>UIInterfaceOrientationLandscapeRight</string>
+	</array>
+	<key>UISupportedInterfaceOrientations~ipad</key>
+	<array>
+		<string>UIInterfaceOrientationLandscapeLeft</string>
+		<string>UIInterfaceOrientationLandscapeRight</string>
+		<string>UIInterfaceOrientationPortrait</string>
+		<string>UIInterfaceOrientationPortraitUpsideDown</string>
+	</array>
+</dict>
+</plist>

+ 25 - 0
launcher/ios/mainwindow_moc.mm

@@ -0,0 +1,25 @@
+/*
+ * mainwindow_moc.mm, part of VCMI engine
+ *
+ * Authors: listed in file AUTHORS in main folder
+ *
+ * License: GNU General Public License v2.0 or later
+ * Full text of license available in license.txt file, in main folder
+ *
+ */
+
+#include "../mainwindow_moc.h"
+
+#import <UIKit/UIKit.h>
+
+void MainWindow::startExecutable(QString /*name*/)
+{
+    NSString * vcmiScheme = NSBundle.mainBundle.infoDictionary[@"LSApplicationQueriesSchemes"][0];
+    [UIApplication.sharedApplication openURL:[NSURL URLWithString:[vcmiScheme stringByAppendingString:@":"]] options:@{} completionHandler:^(BOOL success) {
+        if (success)
+            return;
+        auto alert = [UIAlertController alertControllerWithTitle:@"Can't open VCMI client" message:nil preferredStyle:UIAlertControllerStyleAlert];
+        [alert addAction:[UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil]];
+        [UIApplication.sharedApplication.keyWindow.rootViewController presentViewController:alert animated:YES completion:nil];
+    }];
+}

+ 2 - 1
launcher/mainwindow_moc.cpp

@@ -102,6 +102,7 @@ void MainWindow::on_startGameButton_clicked()
 	startExecutable(pathToQString(VCMIDirs::get().clientPath()));
 }
 
+#ifndef Q_OS_IOS
 void MainWindow::startExecutable(QString name)
 {
 	QProcess process;
@@ -119,6 +120,6 @@ void MainWindow::startExecutable(QString name)
 		                      "Reason: " + process.errorString(),
 		                      QMessageBox::Ok,
 		                      QMessageBox::Ok);
-		return;
 	}
 }
+#endif