Browse Source

Working on iOS deployment

Josh Engebretson 10 years ago
parent
commit
32f021ec76

+ 4 - 4
CMake/Modules/iOSBundleInfo.plist.template

@@ -5,13 +5,13 @@
     <key>CFBundleDevelopmentRegion</key>
     <string>English</string>
     <key>CFBundleExecutable</key>
-    <string>${MACOSX_BUNDLE_EXECUTABLE_NAME}</string>
+    <string>AtomicPlayer</string>
     <key>CFBundleGetInfoString</key>
-    <string>${MACOSX_BUNDLE_INFO_STRING}</string>
+    <string>"Atomic Player"</string>
     <key>CFBundleIconFile</key>
     <string>${MACOSX_BUNDLE_ICON_FILE}</string>
     <key>CFBundleIdentifier</key>
-    <string>${MACOSX_BUNDLE_GUI_IDENTIFIER}</string>
+    <string>com.atomicgameengine.atomicplayer</string>
     <key>CFBundleInfoDictionaryVersion</key>
     <string>6.0</string>
     <key>CFBundleLongVersionString</key>
@@ -31,7 +31,7 @@
     <key>LSRequiresCarbon</key>
     <true/>
     <key>NSHumanReadableCopyright</key>
-    <string>${MACOSX_BUNDLE_COPYRIGHT}</string>
+    <string>"(c) THUNDERBEAST GAMES LLC"</string>
     <key>CFBundleIconFiles</key>
     <array>
         <string>${MACOSX_BUNDLE_ICON_FILE}</string>

+ 9 - 4
CMakeLists.txt

@@ -7,6 +7,9 @@ set (CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/CMake/Modules)
 
 add_definitions( -DATOMIC_STATIC_DEFINE -DATOMIC_LOGGING -DATOMIC_PHYSICS -DATOMIC_ATOMIC2D )
 
+# this is here as QtCreator is having trouble picking up #include <Atomic/*> without it
+include_directories(${CMAKE_SOURCE_DIR}/Source ${CMAKE_SOURCE_DIR}/Source/AtomicEditor/Source)
+
 set (ATOMIC_LINK_LIBRARIES Atomic Box2D Bullet Duktape FreeType JO LZ4 PugiXml StanHull STB )
 
 if (NOT EMSCRIPTEN)
@@ -20,11 +23,13 @@ if (MSVC)
 
 elseif (IOS)
 
-	include(AtomicIOS)
-
 elseif(APPLE)
 
-    include(AtomicMac)
+    if (IOS)
+        include(AtomicIOS)
+    else()
+        include(AtomicMac)
+    endif()
 
 elseif(ANDROID)
 
@@ -36,4 +41,4 @@ elseif(EMSCRIPTEN)
 
 endif()
 
-add_subdirectory(Source)
+add_subdirectory(Source)

+ 36 - 0
Data/AtomicEditor/Resources/EditorData/AtomicEditor/editor/ui/buildsettings_ios.tb.txt

@@ -0,0 +1,36 @@
+TBLayout: axis: y, distribution: gravity, position: left
+	TBSeparator: gravity: left right, skin: AESeparator
+	TBLayout: distribution: gravity
+		TBTextField: text: "App Name:"
+		TBLayout: gravity: left right, distribution-position: right bottom
+			TBEditField: id: app_name, autofocus: 1
+				lp: min-width: 220
+	TBLayout: distribution: gravity
+		TBTextField: text: "App Package:"
+		TBLayout: gravity: left right, distribution-position: right bottom
+			TBEditField: id: app_package, autofocus: 1
+				lp: min-width: 220
+	TBLayout: distribution: gravity
+		TBTextField: text: "Company Name:"
+		TBLayout: gravity: left right, distribution-position: right bottom
+			TBEditField: id: company_name, autofocus: 1
+				lp: min-width: 220
+	TBLayout: distribution: gravity
+		TBTextField: text: "Product Name:"
+		TBLayout: gravity: left right, distribution-position: right bottom
+			TBEditField: id: product_name, autofocus: 1
+				lp: min-width: 220
+	TBSeparator: gravity: left right, skin: AESeparator
+	TBLayout: axis: y, position: left, distribution: gravity
+		TBTextField: text: "Provision:"
+		TBLayout: gravity: left right, distribution-position: right bottom
+			TBEditField: id: provision_path, autofocus: 0
+				lp: min-width: 250
+			TBButton: text: "Choose" id: choose_provision_path
+	TBSeparator: gravity: left right, skin: AESeparator
+	TBTextField: text: "Icon:"
+	TBLayout: gravity: left right, distribution-position: right bottom
+		TBSkinImage: skin: LogoAtomic64
+	TBTextField: text: "Splash Screen:"
+	TBLayout: gravity: left right, distribution-position: right bottom
+		TBSkinImage: skin: LogoAtomic64

+ 20 - 0
Rakefile

@@ -44,6 +44,26 @@ namespace :android do
 
 end  
 
+namespace :ios do
+
+  CMAKE_IOS_BUILD_FOLDER = "#{$RAKE_ROOT}/Artifacts/IOS_Build"
+
+  task :player do
+
+    if !Dir.exists?("#{CMAKE_IOS_BUILD_FOLDER}")
+      FileUtils.mkdir_p(CMAKE_IOS_BUILD_FOLDER)
+    end
+
+    Dir.chdir(CMAKE_IOS_BUILD_FOLDER) do
+      sh "cmake -DIOS=1 -DCMAKE_BUILD_TYPE=Release -G Xcode ../../"
+      sh "xcodebuild -configuration Release"
+    end 
+    
+  end
+
+end  
+
+
 namespace :web do
 
   CMAKE_WEB_BUILD_FOLDER = "#{$RAKE_ROOT}/Artifacts/Web_Build"

+ 2 - 1
Source/Atomic/CMakeLists.txt

@@ -1,5 +1,6 @@
 
-include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/Source/ThirdParty
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}
+                    ${CMAKE_SOURCE_DIR}/Source/ThirdParty
                     ${CMAKE_SOURCE_DIR}/Source/ThirdParty/rapidjson/include
                     ${CMAKE_SOURCE_DIR}/Source/ThirdParty/kNet/include
                     ${CMAKE_SOURCE_DIR}/Source/ThirdParty/FreeType/include

+ 5 - 6
Source/AtomicEditor/CMakeLists.txt

@@ -1,12 +1,11 @@
 
-include_directories(${CMAKE_SOURCE_DIR}/Source)
-include_directories(${CMAKE_SOURCE_DIR}/Source/ThirdParty ${CMAKE_SOURCE_DIR}/Source/ThirdParty/rapidjson/include)
+include_directories (${CMAKE_SOURCE_DIR}/Source/ThirdParty/rapidjson/include
+                     ${CMAKE_SOURCE_DIR}/Source/ThirdParty
+                     ${CMAKE_CURRENT_SOURCE_DIR}/Vendor/nativefiledialog
+                     ${CMAKE_CURRENT_SOURCE_DIR}/Vendor/Poco/Foundation/include)
 
-file (GLOB_RECURSE SOURCE_FILES Source/*.cpp Source/*.h)
 
-include_directories (${CMAKE_SOURCE_DIR}/Source/AtomicEditor/Source)
-include_directories (${CMAKE_CURRENT_SOURCE_DIR}/Vendor/nativefiledialog)
-include_directories (${CMAKE_CURRENT_SOURCE_DIR}/Vendor/Poco/Foundation/include)
+file (GLOB_RECURSE SOURCE_FILES Source/*.cpp Source/*.h)
 
 add_definitions(-DPOCO_NO_AUTOMATIC_LIBS)
 

+ 0 - 6
Source/AtomicEditor/Source/AEEditor.cpp

@@ -226,12 +226,6 @@ void Editor::RequestPlatformChange(AEEditorPlatform platform)
         return;
     }
 
-    if (platform == AE_PLATFORM_IOS)
-    {
-        PostModalInfo("iOS Platform Info", "iOS Platform not supported in this Atomic Editor Preview Build");
-        return;
-    }
-
     if (currentPlatform_ == platform)
         return;
 

+ 32 - 0
Source/AtomicEditor/Source/Build/BuildSettings.cpp

@@ -46,6 +46,19 @@ void BuildSettings::Load(rapidjson::Value::Member* jobject)
         android_.productName = GetStringMember(jandroid, "product_name");
     }
     // END ANDROID ------
+
+    // IOS ------
+    rapidjson::Value::Member* jios = jobject->value.FindMember("ios");
+    if (jios && jios->value.IsObject())
+    {
+        ios_.appName = GetStringMember(jios, "app_name");
+        ios_.package = GetStringMember(jios, "package");
+        ios_.provisionFile = GetStringMember(jios, "provision_file");
+        ios_.companyName = GetStringMember(jios, "company_name");
+        ios_.productName = GetStringMember(jios, "product_name");
+    }
+    // END IOS ------
+
 }
 
 void BuildSettings::Save(rapidjson::PrettyWriter<rapidjson::FileStream>& writer)
@@ -78,6 +91,25 @@ void BuildSettings::Save(rapidjson::PrettyWriter<rapidjson::FileStream>& writer)
     writer.EndObject();
     // END ANDROID ------
 
+    // IOS ------
+    writer.String("ios");
+    writer.StartObject();
+
+    writer.String("app_name");
+    writer.String(ios_.appName.CString());
+    writer.String("package");
+    writer.String(ios_.package.CString());
+    writer.String("provision_file");
+    writer.String(ios_.provisionFile.CString());
+    writer.String("company_name");
+    writer.String(ios_.companyName.CString());
+    writer.String("product_name");
+    writer.String(ios_.productName.CString());
+
+    writer.EndObject();
+    // END IOS ------
+
+
     writer.EndObject();
 
 }

+ 14 - 0
Source/AtomicEditor/Source/Build/BuildSettings.h

@@ -27,6 +27,16 @@ struct AndroidBuildSettings
     String productName;
 };
 
+struct IOSBuildSettings
+{
+    String appName;
+    String package;
+    String companyName;
+    String productName;
+    String provisionFile;
+};
+
+
 class BuildSettings : public Object
 {
     OBJECT(BuildSettings);
@@ -40,6 +50,9 @@ public:
     const AndroidBuildSettings& GetAndroidSettings() { return android_; }
     void SetAndroidSettings(const AndroidBuildSettings& settings) { android_ = settings; }
 
+    const IOSBuildSettings& GetIOSSettings() { return ios_; }
+    void SetIOSSettings(const IOSBuildSettings& settings) { ios_ = settings; }
+
     void Load(rapidjson::Value::Member* jobject);
     void Save(rapidjson::PrettyWriter<rapidjson::FileStream>& writer);
 
@@ -48,6 +61,7 @@ private:
     String GetStringMember(rapidjson::Value::Member* jobject, const String& name);
 
     AndroidBuildSettings android_;
+    IOSBuildSettings ios_;
 
 };
 

+ 24 - 0
Source/AtomicEditor/Source/Project/ProjectUtils.cpp

@@ -67,6 +67,30 @@ String ProjectUtils::GetBuildPath(const String& defaultPath)
 
 }
 
+String ProjectUtils::GetMobileProvisionPath()
+{
+    nfdchar_t *outPath = NULL;
+
+    nfdresult_t result = NFD_OpenDialog( "mobileprovision",
+                                NULL,
+                                &outPath);
+
+    String fullpath;
+
+    if (outPath && result == NFD_OKAY)
+    {
+         fullpath = outPath;
+    }
+
+    GetSubsystem<Graphics>()->RaiseWindow();
+
+    if (outPath)
+        free(outPath);
+
+    return fullpath;
+
+}
+
 String ProjectUtils::GetAndroidSDKPath(const String& defaultPath)
 {
     String sdkPath;

+ 1 - 0
Source/AtomicEditor/Source/Project/ProjectUtils.h

@@ -21,6 +21,7 @@ class ProjectUtils : public Object
 
     String GetBuildPath(const String& defaultPath);
     String GetAndroidSDKPath(const String& defaultPath);
+    String GetMobileProvisionPath();
 
 public:
     /// Construct.

+ 31 - 0
Source/AtomicEditor/Source/UI/Modal/UIBuildSettings.cpp

@@ -27,6 +27,7 @@ UIBuildSettings::UIBuildSettings(Context* context):
     windowsSettings_(new UIBuildSettingsWindows(context)),
     androidSettings_(new UIBuildSettingsAndroid(context)),
     webSettings_(new UIBuildSettingsWeb(context)),
+    iosSettings_(new UIBuildSettingsIOS(context)),
     platformIndicator_(0)
 {
     TBUI* tbui = GetSubsystem<TBUI>();
@@ -85,6 +86,9 @@ UIBuildSettings::UIBuildSettings(Context* context):
         SelectAndroidSettings();
     else if (platform == AE_PLATFORM_HTML5)
         SelectWebSettings();
+    else if (platform == AE_PLATFORM_IOS)
+        SelectIOSSettings();
+
 
     window_->ResizeToFitContent();
     Center();
@@ -107,6 +111,10 @@ void UIBuildSettings::RemoveSettingsWidgets()
     if (webSettings_->GetWidgetDelegate()->GetParent() == settingscontainer)
         settingscontainer->RemoveChild(webSettings_->GetWidgetDelegate());
 
+    if (iosSettings_->GetWidgetDelegate()->GetParent() == settingscontainer)
+        settingscontainer->RemoveChild(iosSettings_->GetWidgetDelegate());
+
+
 }
 
 void UIBuildSettings::SelectWindowsSettings()
@@ -145,6 +153,20 @@ void UIBuildSettings::SelectAndroidSettings()
 
 }
 
+void UIBuildSettings::SelectIOSSettings()
+{
+    RemoveSettingsWidgets();
+
+    TBLayout* settingscontainer = delegate_->GetWidgetByIDAndType<TBLayout>(TBIDC("settingscontainer"));
+    assert(settingscontainer);
+    settingscontainer->AddChild(iosSettings_->GetWidgetDelegate());
+    iosSettings_->Refresh();
+
+    platformSelect_->SetValue(4);
+
+}
+
+
 void UIBuildSettings::SelectMacSettings()
 {
     RemoveSettingsWidgets();
@@ -207,6 +229,7 @@ void UIBuildSettings::RequestPlatformChange(TBID id)
 void UIBuildSettings::StoreSettings()
 {
     androidSettings_->StoreSettings();
+    iosSettings_->StoreSettings();
 
     Editor* editor = GetSubsystem<Editor>();
     editor->SaveProject();
@@ -235,6 +258,11 @@ bool UIBuildSettings::OnEvent(const TBWidgetEvent &ev)
             SelectWebSettings();
             return true;
         }
+        else if (ev.ref_id == TBIDC("iOSBuildSettings"))
+        {
+            SelectIOSSettings();
+            return true;
+        }
         else if (ev.target->GetID() == TBIDC("set_current_platform"))
         {
             TBID id = platformSelect_->GetSelectedItemID();
@@ -269,6 +297,9 @@ void UIBuildSettings::UpdateCurrentPlatform(AEEditorPlatform platform)
         platformIndicator_->SetSkinBg(TBIDC("LogoAndroid"));
     else if (platform == AE_PLATFORM_HTML5)
         platformIndicator_->SetSkinBg(TBIDC("LogoHTML5"));
+    else if (platform == AE_PLATFORM_IOS)
+        platformIndicator_->SetSkinBg(TBIDC("LogoIOS"));
+
 }
 
 void UIBuildSettings::HandlePlatformChange(StringHash eventType, VariantMap& eventData)

+ 3 - 0
Source/AtomicEditor/Source/UI/Modal/UIBuildSettings.h

@@ -14,6 +14,7 @@
 #include "UIBuildSettingsWindows.h"
 #include "UIBuildSettingsAndroid.h"
 #include "UIBuildSettingsWeb.h"
+#include "UIBuildSettingsIOS.h"
 
 namespace AtomicEditor
 {
@@ -40,6 +41,7 @@ private:
     void SelectAndroidSettings();
     void SelectMacSettings();
     void SelectWebSettings();
+    void SelectIOSSettings();
 
     void StoreSettings();
 
@@ -53,6 +55,7 @@ private:
     SharedPtr<UIBuildSettingsWindows> windowsSettings_;
     SharedPtr<UIBuildSettingsAndroid> androidSettings_;
     SharedPtr<UIBuildSettingsWeb> webSettings_;
+    SharedPtr<UIBuildSettingsIOS> iosSettings_;
 
 };
 

+ 122 - 0
Source/AtomicEditor/Source/UI/Modal/UIBuildSettingsIOS.cpp

@@ -0,0 +1,122 @@
+// Copyright (c) 2014-2015, THUNDERBEAST GAMES LLC All rights reserved
+// Please see LICENSE.md in repository root for license information
+// https://github.com/AtomicGameEngine/AtomicGameEngine
+
+#include "AtomicEditor.h"
+#include <TurboBadger/tb_layout.h>
+#include <TurboBadger/tb_editfield.h>
+#include <TurboBadger/tb_select.h>
+#include <Atomic/Core/Context.h>
+#include <Atomic/IO/Log.h>
+#include <Atomic/IO/FileSystem.h>
+#include <Atomic/IO/MemoryBuffer.h>
+#include <Atomic/UI/TBUI.h>
+
+#include "AEEditor.h"
+#include "AEEvents.h"
+#include "AEPreferences.h"
+#include "Project/ProjectUtils.h"
+#include "Subprocess/AESubprocessSystem.h"
+
+#include "Build/BuildSystem.h"
+
+#include "UIBuildSettingsIOS.h"
+
+namespace AtomicEditor
+{
+
+UIBuildSettingsIOS::UIBuildSettingsIOS(Context* context) :
+    AEWidget(context)
+{
+    TBUI* tbui = GetSubsystem<TBUI>();
+    tbui->LoadResourceFile(delegate_, "AtomicEditor/editor/ui/buildsettings_ios.tb.txt");
+
+    appNameEdit_ = delegate_->GetWidgetByIDAndType<TBEditField>(TBIDC("app_name"));
+    assert(appNameEdit_);
+
+    appPackageEdit_ = delegate_->GetWidgetByIDAndType<TBEditField>(TBIDC("app_package"));
+    assert(appPackageEdit_);
+
+    productNameEdit_ = delegate_->GetWidgetByIDAndType<TBEditField>(TBIDC("product_name"));
+    assert(productNameEdit_);
+
+    companyNameEdit_ = delegate_->GetWidgetByIDAndType<TBEditField>(TBIDC("company_name"));
+    assert(companyNameEdit_);
+
+    provisionPath_ = delegate_->GetWidgetByIDAndType<TBEditField>(TBIDC("provision_path"));
+    assert(provisionPath_);
+
+    Refresh();
+}
+
+UIBuildSettingsIOS::~UIBuildSettingsIOS()
+{
+
+}
+
+
+void UIBuildSettingsIOS::StoreSettings()
+{
+    BuildSystem* buildSystem = GetSubsystem<BuildSystem>();
+
+    IOSBuildSettings settings;
+
+    TBStr text;
+    appNameEdit_->GetText(text);
+    settings.appName = text.CStr();
+    text.Clear();
+
+    appPackageEdit_->GetText(text);
+    settings.package = text.CStr();
+    text.Clear();
+
+    productNameEdit_->GetText(text);
+    settings.productName = text.CStr();
+    text.Clear();
+
+    companyNameEdit_->GetText(text);
+    settings.companyName = text.CStr();
+    text.Clear();
+
+    provisionPath_->GetText(text);
+    settings.provisionFile = text.CStr();
+    text.Clear();
+
+    buildSystem->GetBuildSettings()->SetIOSSettings(settings);
+
+}
+
+void UIBuildSettingsIOS::Refresh()
+{
+    BuildSystem* buildSystem = GetSubsystem<BuildSystem>();
+
+    const IOSBuildSettings& settings = buildSystem->GetBuildSettings()->GetIOSSettings();
+
+    provisionPath_->SetText(settings.provisionFile.CString());
+    appNameEdit_->SetText(settings.appName.CString());
+    appPackageEdit_->SetText(settings.package.CString());
+    productNameEdit_->SetText(settings.productName.CString());
+    companyNameEdit_->SetText(settings.companyName.CString());
+}
+
+bool UIBuildSettingsIOS::OnEvent(const TBWidgetEvent &ev)
+{
+    Editor* editor = context_->GetSubsystem<Editor>();
+    ProjectUtils* utils = context_->GetSubsystem<ProjectUtils>();
+
+    if (ev.type == EVENT_TYPE_CLICK)
+    {
+        if (ev.target->GetID() == TBIDC("choose_provision_path"))
+        {
+            String path = utils->GetMobileProvisionPath();
+            provisionPath_->SetText(path.CString());
+            return true;
+        }
+    }
+
+    return false;
+
+}
+
+}
+

+ 51 - 0
Source/AtomicEditor/Source/UI/Modal/UIBuildSettingsIOS.h

@@ -0,0 +1,51 @@
+// Copyright (c) 2014-2015, THUNDERBEAST GAMES LLC All rights reserved
+// Please see LICENSE.md in repository root for license information
+// https://github.com/AtomicGameEngine/AtomicGameEngine
+
+#pragma once
+
+#include "UI/AEWidget.h"
+
+using namespace Atomic;
+using namespace tb;
+
+namespace tb
+{
+class TBLayout;
+class TBEditField;
+class TBSelectDropdown;
+}
+
+namespace AtomicEditor
+{
+
+class UIBuildSettingsIOS: public AEWidget
+{
+    OBJECT(UIBuildSettingsIOS);
+
+public:
+
+    UIBuildSettingsIOS(Context* context);
+    virtual ~UIBuildSettingsIOS();
+
+    bool OnEvent(const TBWidgetEvent &ev);
+
+    void Refresh();
+
+    void StoreSettings();
+
+private:
+
+    String targetOutput_;
+    HashMap<unsigned, String> targetLookup_;
+
+    TBEditField* appNameEdit_;
+    TBEditField* appPackageEdit_;
+    TBEditField* productNameEdit_;
+    TBEditField* companyNameEdit_;
+
+    TBEditField* provisionPath_;
+
+};
+
+}

+ 2 - 0
Source/AtomicEditor/Source/UI/UIMainFrame.cpp

@@ -640,6 +640,8 @@ void MainFrame::HandlePlatformChange(StringHash eventType, VariantMap& eventData
         platformIndicator_->SetSkinBg(TBIDC("LogoAndroid"));
     else if (platform == AE_PLATFORM_HTML5)
         platformIndicator_->SetSkinBg(TBIDC("LogoHTML5"));
+    else if (platform == AE_PLATFORM_IOS)
+        platformIndicator_->SetSkinBg(TBIDC("LogoIOS"));
 
 }
 

+ 19 - 0
Source/AtomicPlayer/CMakeLists.txt

@@ -21,8 +21,27 @@ endif()
 target_link_libraries(AtomicPlayer ${ATOMIC_LINK_LIBRARIES})
 
 if (APPLE)
+
+if (NOT IOS)
+
     set (TARGET_PROPERTIES MACOSX_BUNDLE_INFO_PLIST MacOSXBundleInfo.plist.template)
+
+else()
+
+    set_target_properties(AtomicPlayer PROPERTIES
+      MACOSX_BUNDLE_GUI_IDENTIFIER "com.atomicgameengine.atomicplayer"
+      XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer"
+      XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT "dwarf-with-dsym"
+      XCODE_ATTRIBUTE_INFOPLIST_PREPROCESS YES
+      XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET 7.1
+      XCODE_ATTRIBUTE_TARGETED_DEVICE_FAMILY "1,2" # iPhone/iPad
+      XCODE_ATTRIBUTE_COMBINE_HIDPI_IMAGES NO
+    )
+
+	set (TARGET_PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${CMAKE_SOURCE_DIR}/CMake/Modules/iOSBundleInfo.plist.template)
+
 endif()
+endif(APPLE)
 
 if (TARGET_PROPERTIES)
     set_target_properties (AtomicPlayer PROPERTIES ${TARGET_PROPERTIES})