From f5b3b24c22186f50b3e57fc162ef9790f288c704 Mon Sep 17 00:00:00 2001 From: Ruslan Mustakov Date: Mon, 4 Sep 2017 20:10:03 +0700 Subject: [PATCH] Enhance iOS export - The export process now builds complete .ipa on macOS, instead of just creating XCode project. - The project includes Capabilities games usually require: Game Center, Push Notifications, In-App Purchase. - Icons and launch screens can be specified in export preset. --- editor/editor_export.cpp | 2 + misc/dist/ios_xcode/export_options.plist | 10 + ...ot_debug.iphone => godot.iphone.debug.arm} | 0 ...ot_opt.iphone => godot.iphone.debug.arm64} | 0 misc/dist/ios_xcode/godot.iphone.debug.fat | 0 misc/dist/ios_xcode/godot.iphone.release.arm | 0 .../dist/ios_xcode/godot.iphone.release.arm64 | 0 misc/dist/ios_xcode/godot.iphone.release.fat | 0 .../godot_ios.xcodeproj/project.pbxproj | 198 ++++++---- .../contents.xcworkspacedata | 2 +- .../xcshareddata/xcschemes/godot_ios.xcscheme | 93 +++++ ...568h@2x~iphone.png => Default-568h@2x.png} | Bin .../dist/ios_xcode/godot_ios/Default-667h.png | Bin 683 -> 0 bytes .../ios_xcode/godot_ios/Default-736h@3x.png | Bin 2582 -> 0 bytes .../godot_ios/Default-Landscape-1366h@2x.png | Bin 0 -> 32836 bytes ...736h.png => Default-Landscape-736h@3x.png} | Bin ...e@2x~ipad.png => Default-Landscape@2x.png} | Bin .../godot_ios/Default-Landscape~ipad.png | Bin 634 -> 0 bytes .../godot_ios/Default-Portrait-1366h@2x.png | Bin 0 -> 33309 bytes ...-736h.png => Default-Portrait-736h@3x.png} | Bin .../godot_ios/Default-Portrait@2x.png | Bin 0 -> 33309 bytes .../godot_ios/Default-Portrait@2x~ipad.png | Bin 3070 -> 0 bytes .../godot_ios/Default-Portrait~ipad.png | Bin 589 -> 0 bytes .../ios_xcode/godot_ios/Default@2x~iphone.png | Bin 515 -> 0 bytes .../ios_xcode/godot_ios/Default~iphone.png | Bin 309 -> 0 bytes .../AppIcon.appiconset/Contents.json | 128 ------ .../AppIcon.appiconset/Icon-100.png | Bin 250 -> 0 bytes .../AppIcon.appiconset/Icon-114.png | Bin 253 -> 0 bytes .../AppIcon.appiconset/Icon-120.png | Bin 253 -> 0 bytes .../AppIcon.appiconset/Icon-144.png | Bin 259 -> 0 bytes .../AppIcon.appiconset/Icon-152.png | Bin 260 -> 0 bytes .../AppIcon.appiconset/Icon-180.png | Bin 265 -> 0 bytes .../AppIcon.appiconset/Icon-29.png | Bin 242 -> 0 bytes .../AppIcon.appiconset/Icon-40.png | Bin 240 -> 0 bytes .../AppIcon.appiconset/Icon-50.png | Bin 243 -> 0 bytes .../AppIcon.appiconset/Icon-57.png | Bin 243 -> 0 bytes .../AppIcon.appiconset/Icon-58.png | Bin 243 -> 0 bytes .../AppIcon.appiconset/Icon-60.png | Bin 244 -> 0 bytes .../AppIcon.appiconset/Icon-72.png | Bin 244 -> 0 bytes .../AppIcon.appiconset/Icon-76.png | Bin 246 -> 0 bytes .../AppIcon.appiconset/Icon-80.png | Bin 245 -> 0 bytes .../AppIcon.appiconset/icon-167.png | Bin 262 -> 0 bytes .../AppIcon.appiconset/icon-87.png | Bin 247 -> 0 bytes .../Images.xcassets/AppIcon.appiconset/sizes | 17 - .../ios_xcode/godot_ios/godot_ios-Info.plist | 15 +- .../godot_ios/godot_ios.entitlements | 8 + modules/gdnative/SCsub | 2 +- modules/gdnative/gdnative.cpp | 5 +- modules/gdnative/include/gdnative/gdnative.h | 4 +- .../include/nativescript/godot_nativescript.h | 4 +- modules/gdnative/nativescript/SCsub | 3 + platform/iphone/export/export.cpp | 363 ++++++++++++++++-- 52 files changed, 589 insertions(+), 265 deletions(-) create mode 100644 misc/dist/ios_xcode/export_options.plist rename misc/dist/ios_xcode/{godot_debug.iphone => godot.iphone.debug.arm} (100%) rename misc/dist/ios_xcode/{godot_opt.iphone => godot.iphone.debug.arm64} (100%) create mode 100755 misc/dist/ios_xcode/godot.iphone.debug.fat create mode 100755 misc/dist/ios_xcode/godot.iphone.release.arm create mode 100755 misc/dist/ios_xcode/godot.iphone.release.arm64 create mode 100755 misc/dist/ios_xcode/godot.iphone.release.fat create mode 100644 misc/dist/ios_xcode/godot_ios.xcodeproj/xcshareddata/xcschemes/godot_ios.xcscheme rename misc/dist/ios_xcode/godot_ios/{Default-568h@2x~iphone.png => Default-568h@2x.png} (100%) delete mode 100644 misc/dist/ios_xcode/godot_ios/Default-667h.png delete mode 100644 misc/dist/ios_xcode/godot_ios/Default-736h@3x.png create mode 100644 misc/dist/ios_xcode/godot_ios/Default-Landscape-1366h@2x.png rename misc/dist/ios_xcode/godot_ios/{Default-Landscape-736h.png => Default-Landscape-736h@3x.png} (100%) rename misc/dist/ios_xcode/godot_ios/{Default-Landscape@2x~ipad.png => Default-Landscape@2x.png} (100%) delete mode 100644 misc/dist/ios_xcode/godot_ios/Default-Landscape~ipad.png create mode 100644 misc/dist/ios_xcode/godot_ios/Default-Portrait-1366h@2x.png rename misc/dist/ios_xcode/godot_ios/{Default-736h.png => Default-Portrait-736h@3x.png} (100%) create mode 100644 misc/dist/ios_xcode/godot_ios/Default-Portrait@2x.png delete mode 100644 misc/dist/ios_xcode/godot_ios/Default-Portrait@2x~ipad.png delete mode 100644 misc/dist/ios_xcode/godot_ios/Default-Portrait~ipad.png delete mode 100644 misc/dist/ios_xcode/godot_ios/Default@2x~iphone.png delete mode 100644 misc/dist/ios_xcode/godot_ios/Default~iphone.png delete mode 100644 misc/dist/ios_xcode/godot_ios/Images.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 misc/dist/ios_xcode/godot_ios/Images.xcassets/AppIcon.appiconset/Icon-100.png delete mode 100644 misc/dist/ios_xcode/godot_ios/Images.xcassets/AppIcon.appiconset/Icon-114.png delete mode 100644 misc/dist/ios_xcode/godot_ios/Images.xcassets/AppIcon.appiconset/Icon-120.png delete mode 100644 misc/dist/ios_xcode/godot_ios/Images.xcassets/AppIcon.appiconset/Icon-144.png delete mode 100644 misc/dist/ios_xcode/godot_ios/Images.xcassets/AppIcon.appiconset/Icon-152.png delete mode 100644 misc/dist/ios_xcode/godot_ios/Images.xcassets/AppIcon.appiconset/Icon-180.png delete mode 100644 misc/dist/ios_xcode/godot_ios/Images.xcassets/AppIcon.appiconset/Icon-29.png delete mode 100644 misc/dist/ios_xcode/godot_ios/Images.xcassets/AppIcon.appiconset/Icon-40.png delete mode 100644 misc/dist/ios_xcode/godot_ios/Images.xcassets/AppIcon.appiconset/Icon-50.png delete mode 100644 misc/dist/ios_xcode/godot_ios/Images.xcassets/AppIcon.appiconset/Icon-57.png delete mode 100644 misc/dist/ios_xcode/godot_ios/Images.xcassets/AppIcon.appiconset/Icon-58.png delete mode 100644 misc/dist/ios_xcode/godot_ios/Images.xcassets/AppIcon.appiconset/Icon-60.png delete mode 100644 misc/dist/ios_xcode/godot_ios/Images.xcassets/AppIcon.appiconset/Icon-72.png delete mode 100644 misc/dist/ios_xcode/godot_ios/Images.xcassets/AppIcon.appiconset/Icon-76.png delete mode 100644 misc/dist/ios_xcode/godot_ios/Images.xcassets/AppIcon.appiconset/Icon-80.png delete mode 100644 misc/dist/ios_xcode/godot_ios/Images.xcassets/AppIcon.appiconset/icon-167.png delete mode 100644 misc/dist/ios_xcode/godot_ios/Images.xcassets/AppIcon.appiconset/icon-87.png delete mode 100644 misc/dist/ios_xcode/godot_ios/Images.xcassets/AppIcon.appiconset/sizes create mode 100644 misc/dist/ios_xcode/godot_ios/godot_ios.entitlements diff --git a/editor/editor_export.cpp b/editor/editor_export.cpp index 4caf2641fcb..db12998dd20 100644 --- a/editor/editor_export.cpp +++ b/editor/editor_export.cpp @@ -273,6 +273,8 @@ void EditorExportPlatform::gen_debug_flags(Vector &r_flags, int p_flags) } Error EditorExportPlatform::_save_pack_file(void *p_userdata, const String &p_path, const Vector &p_data, int p_file, int p_total) { + if (p_path.ends_with(".so") || p_path.ends_with(".dylib") || p_path.ends_with(".dll")) + return OK; PackData *pd = (PackData *)p_userdata; diff --git a/misc/dist/ios_xcode/export_options.plist b/misc/dist/ios_xcode/export_options.plist new file mode 100644 index 00000000000..86d89a6e422 --- /dev/null +++ b/misc/dist/ios_xcode/export_options.plist @@ -0,0 +1,10 @@ + + + + + method + $export_method + teamID + $team_id + + \ No newline at end of file diff --git a/misc/dist/ios_xcode/godot_debug.iphone b/misc/dist/ios_xcode/godot.iphone.debug.arm similarity index 100% rename from misc/dist/ios_xcode/godot_debug.iphone rename to misc/dist/ios_xcode/godot.iphone.debug.arm diff --git a/misc/dist/ios_xcode/godot_opt.iphone b/misc/dist/ios_xcode/godot.iphone.debug.arm64 similarity index 100% rename from misc/dist/ios_xcode/godot_opt.iphone rename to misc/dist/ios_xcode/godot.iphone.debug.arm64 diff --git a/misc/dist/ios_xcode/godot.iphone.debug.fat b/misc/dist/ios_xcode/godot.iphone.debug.fat new file mode 100755 index 00000000000..e69de29bb2d diff --git a/misc/dist/ios_xcode/godot.iphone.release.arm b/misc/dist/ios_xcode/godot.iphone.release.arm new file mode 100755 index 00000000000..e69de29bb2d diff --git a/misc/dist/ios_xcode/godot.iphone.release.arm64 b/misc/dist/ios_xcode/godot.iphone.release.arm64 new file mode 100755 index 00000000000..e69de29bb2d diff --git a/misc/dist/ios_xcode/godot.iphone.release.fat b/misc/dist/ios_xcode/godot.iphone.release.fat new file mode 100755 index 00000000000..e69de29bb2d diff --git a/misc/dist/ios_xcode/godot_ios.xcodeproj/project.pbxproj b/misc/dist/ios_xcode/godot_ios.xcodeproj/project.pbxproj index bdba8488c85..3f2db941934 100644 --- a/misc/dist/ios_xcode/godot_ios.xcodeproj/project.pbxproj +++ b/misc/dist/ios_xcode/godot_ios.xcodeproj/project.pbxproj @@ -7,18 +7,17 @@ objects = { /* Begin PBXBuildFile section */ - D07CD43F1C5D573600B7FB28 /* Default-568h@2x~iphone.png in Resources */ = {isa = PBXBuildFile; fileRef = D07CD4331C5D573600B7FB28 /* Default-568h@2x~iphone.png */; }; - D07CD4401C5D573600B7FB28 /* Default-667h.png in Resources */ = {isa = PBXBuildFile; fileRef = D07CD4341C5D573600B7FB28 /* Default-667h.png */; }; + 1F1575721F582BE20003B888 /* dylibs in Resources */ = {isa = PBXBuildFile; fileRef = 1F1575711F582BE20003B888 /* dylibs */; }; + 1FF4C1851F584E3F00A41E41 /* GameKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1FF4C1841F584E3F00A41E41 /* GameKit.framework */; }; + 1FF4C1871F584E5600A41E41 /* StoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1FF4C1861F584E5600A41E41 /* StoreKit.framework */; }; + D07CD43F1C5D573600B7FB28 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D07CD4331C5D573600B7FB28 /* Default-568h@2x.png */; }; D07CD4411C5D573600B7FB28 /* Default-667h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D07CD4351C5D573600B7FB28 /* Default-667h@2x.png */; }; - D07CD4421C5D573600B7FB28 /* Default-736h.png in Resources */ = {isa = PBXBuildFile; fileRef = D07CD4361C5D573600B7FB28 /* Default-736h.png */; }; - D07CD4431C5D573600B7FB28 /* Default-736h@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = D07CD4371C5D573600B7FB28 /* Default-736h@3x.png */; }; - D07CD4441C5D573600B7FB28 /* Default-Landscape-736h.png in Resources */ = {isa = PBXBuildFile; fileRef = D07CD4381C5D573600B7FB28 /* Default-Landscape-736h.png */; }; - D07CD4451C5D573600B7FB28 /* Default-Landscape@2x~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = D07CD4391C5D573600B7FB28 /* Default-Landscape@2x~ipad.png */; }; - D07CD4461C5D573600B7FB28 /* Default-Landscape~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = D07CD43A1C5D573600B7FB28 /* Default-Landscape~ipad.png */; }; - D07CD4471C5D573600B7FB28 /* Default-Portrait@2x~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = D07CD43B1C5D573600B7FB28 /* Default-Portrait@2x~ipad.png */; }; - D07CD4481C5D573600B7FB28 /* Default-Portrait~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = D07CD43C1C5D573600B7FB28 /* Default-Portrait~ipad.png */; }; - D07CD4491C5D573600B7FB28 /* Default@2x~iphone.png in Resources */ = {isa = PBXBuildFile; fileRef = D07CD43D1C5D573600B7FB28 /* Default@2x~iphone.png */; }; - D07CD44A1C5D573600B7FB28 /* Default~iphone.png in Resources */ = {isa = PBXBuildFile; fileRef = D07CD43E1C5D573600B7FB28 /* Default~iphone.png */; }; + D07CD4421C5D573600B7FB28 /* Default-Portrait-736h@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = D07CD4361C5D573600B7FB28 /* Default-Portrait-736h@3x.png */; }; + D07CD4441C5D573600B7FB28 /* Default-Landscape-736h@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = D07CD4381C5D573600B7FB28 /* Default-Landscape-736h@3x.png */; }; + D07CD4451C5D573600B7FB28 /* Default-Landscape@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D07CD4391C5D573600B7FB28 /* Default-Landscape@2x.png */; }; + D07CD4461C5D573600B7FB28 /* Default-Landscape-1366h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D07CD43A1C5D573600B7FB28 /* Default-Landscape-1366h@2x.png */; }; + D07CD4471C5D573600B7FB28 /* Default-Portrait@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D07CD43B1C5D573600B7FB28 /* Default-Portrait@2x.png */; }; + D07CD4481C5D573600B7FB28 /* Default-Portrait-1366h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D07CD43C1C5D573600B7FB28 /* Default-Portrait-1366h@2x.png */; }; D07CD44E1C5D589C00B7FB28 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D07CD44D1C5D589C00B7FB28 /* Images.xcassets */; }; D0BCFE3818AEBDA2004A7AAE /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0BCFE3718AEBDA2004A7AAE /* Foundation.framework */; }; D0BCFE3A18AEBDA2004A7AAE /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0BCFE3918AEBDA2004A7AAE /* CoreGraphics.framework */; }; @@ -26,36 +25,36 @@ D0BCFE3E18AEBDA2004A7AAE /* GLKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0BCFE3D18AEBDA2004A7AAE /* GLKit.framework */; }; D0BCFE4018AEBDA2004A7AAE /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0BCFE3F18AEBDA2004A7AAE /* OpenGLES.framework */; }; D0BCFE4618AEBDA2004A7AAE /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = D0BCFE4418AEBDA2004A7AAE /* InfoPlist.strings */; }; - D0BCFE7818AEBFEB004A7AAE /* data.pck in Resources */ = {isa = PBXBuildFile; fileRef = D0BCFE7718AEBFEB004A7AAE /* data.pck */; }; - D0BCFE7A18AEC06A004A7AAE /* godot_opt.iphone in Resources */ = {isa = PBXBuildFile; fileRef = D0BCFE7918AEC06A004A7AAE /* godot_opt.iphone */; }; + D0BCFE7818AEBFEB004A7AAE /* $binary.pck in Resources */ = {isa = PBXBuildFile; fileRef = D0BCFE7718AEBFEB004A7AAE /* $binary.pck */; }; + D0BCFE7A18AEC06A004A7AAE /* $binary.iphone in Resources */ = {isa = PBXBuildFile; fileRef = D0BCFE7918AEC06A004A7AAE /* $binary.iphone */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ - D07CD4331C5D573600B7FB28 /* Default-568h@2x~iphone.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x~iphone.png"; sourceTree = ""; }; - D07CD4341C5D573600B7FB28 /* Default-667h.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-667h.png"; sourceTree = ""; }; + 1F1575711F582BE20003B888 /* dylibs */ = {isa = PBXFileReference; lastKnownFileType = folder; name = dylibs; path = dylibs; sourceTree = ""; }; + 1FF4C1841F584E3F00A41E41 /* GameKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GameKit.framework; path = System/Library/Frameworks/GameKit.framework; sourceTree = SDKROOT; }; + 1FF4C1861F584E5600A41E41 /* StoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = StoreKit.framework; path = System/Library/Frameworks/StoreKit.framework; sourceTree = SDKROOT; }; + 1FF4C1881F584E6300A41E41 /* $binary.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = $binary.entitlements; sourceTree = ""; }; + D07CD4331C5D573600B7FB28 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; D07CD4351C5D573600B7FB28 /* Default-667h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-667h@2x.png"; sourceTree = ""; }; - D07CD4361C5D573600B7FB28 /* Default-736h.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-736h.png"; sourceTree = ""; }; - D07CD4371C5D573600B7FB28 /* Default-736h@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-736h@3x.png"; sourceTree = ""; }; - D07CD4381C5D573600B7FB28 /* Default-Landscape-736h.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-Landscape-736h.png"; sourceTree = ""; }; - D07CD4391C5D573600B7FB28 /* Default-Landscape@2x~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-Landscape@2x~ipad.png"; sourceTree = ""; }; - D07CD43A1C5D573600B7FB28 /* Default-Landscape~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-Landscape~ipad.png"; sourceTree = ""; }; - D07CD43B1C5D573600B7FB28 /* Default-Portrait@2x~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-Portrait@2x~ipad.png"; sourceTree = ""; }; - D07CD43C1C5D573600B7FB28 /* Default-Portrait~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-Portrait~ipad.png"; sourceTree = ""; }; - D07CD43D1C5D573600B7FB28 /* Default@2x~iphone.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default@2x~iphone.png"; sourceTree = ""; }; - D07CD43E1C5D573600B7FB28 /* Default~iphone.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default~iphone.png"; sourceTree = ""; }; + D07CD4361C5D573600B7FB28 /* Default-Portrait-736h@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-Portrait-736h@3x.png"; sourceTree = ""; }; + D07CD4381C5D573600B7FB28 /* Default-Landscape-736h@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-Landscape-736h@3x.png"; sourceTree = ""; }; + D07CD4391C5D573600B7FB28 /* Default-Landscape@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-Landscape@2x.png"; sourceTree = ""; }; + D07CD43A1C5D573600B7FB28 /* Default-Landscape-1366h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-Landscape-1366h@2x.png"; sourceTree = ""; }; + D07CD43B1C5D573600B7FB28 /* Default-Portrait@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-Portrait@2x.png"; sourceTree = ""; }; + D07CD43C1C5D573600B7FB28 /* Default-Portrait-1366h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-Portrait-1366h@2x.png"; sourceTree = ""; }; D07CD44D1C5D589C00B7FB28 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; - D0BCFE3418AEBDA2004A7AAE /* godot_ios.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = godot_ios.app; sourceTree = BUILT_PRODUCTS_DIR; }; + D0BCFE3418AEBDA2004A7AAE /* $binary.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = $binary.app; sourceTree = BUILT_PRODUCTS_DIR; }; D0BCFE3718AEBDA2004A7AAE /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; D0BCFE3918AEBDA2004A7AAE /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; D0BCFE3B18AEBDA2004A7AAE /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; D0BCFE3D18AEBDA2004A7AAE /* GLKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GLKit.framework; path = System/Library/Frameworks/GLKit.framework; sourceTree = SDKROOT; }; D0BCFE3F18AEBDA2004A7AAE /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; - D0BCFE4318AEBDA2004A7AAE /* godot_ios-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "godot_ios-Info.plist"; sourceTree = ""; }; + D0BCFE4318AEBDA2004A7AAE /* $binary-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "$binary-Info.plist"; sourceTree = ""; }; D0BCFE4518AEBDA2004A7AAE /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; - D0BCFE4918AEBDA2004A7AAE /* godot_ios-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "godot_ios-Prefix.pch"; sourceTree = ""; }; + D0BCFE4918AEBDA2004A7AAE /* $binary-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "$binary-Prefix.pch"; sourceTree = ""; }; D0BCFE6118AEBDA3004A7AAE /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; - D0BCFE7718AEBFEB004A7AAE /* data.pck */ = {isa = PBXFileReference; lastKnownFileType = text; path = data.pck; sourceTree = ""; }; - D0BCFE7918AEC06A004A7AAE /* godot_opt.iphone */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.executable"; path = godot_opt.iphone; sourceTree = ""; }; + D0BCFE7718AEBFEB004A7AAE /* $binary.pck */ = {isa = PBXFileReference; lastKnownFileType = file; path = $binary.pck; sourceTree = ""; }; + D0BCFE7918AEC06A004A7AAE /* $binary.iphone */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.executable"; path = $binary.iphone; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -64,8 +63,10 @@ buildActionMask = 2147483647; files = ( D0BCFE4018AEBDA2004A7AAE /* OpenGLES.framework in Frameworks */, + 1FF4C1871F584E5600A41E41 /* StoreKit.framework in Frameworks */, D0BCFE3A18AEBDA2004A7AAE /* CoreGraphics.framework in Frameworks */, D0BCFE3C18AEBDA2004A7AAE /* UIKit.framework in Frameworks */, + 1FF4C1851F584E3F00A41E41 /* GameKit.framework in Frameworks */, D0BCFE3E18AEBDA2004A7AAE /* GLKit.framework in Frameworks */, D0BCFE3818AEBDA2004A7AAE /* Foundation.framework in Frameworks */, ); @@ -77,9 +78,10 @@ D0BCFE2B18AEBDA2004A7AAE = { isa = PBXGroup; children = ( - D0BCFE7918AEC06A004A7AAE /* godot_opt.iphone */, - D0BCFE7718AEBFEB004A7AAE /* data.pck */, - D0BCFE4118AEBDA2004A7AAE /* godot_ios */, + 1F1575711F582BE20003B888 /* dylibs */, + D0BCFE7918AEC06A004A7AAE /* $binary.iphone */, + D0BCFE7718AEBFEB004A7AAE /* $binary.pck */, + D0BCFE4118AEBDA2004A7AAE /* $binary */, D0BCFE3618AEBDA2004A7AAE /* Frameworks */, D0BCFE3518AEBDA2004A7AAE /* Products */, ); @@ -88,7 +90,7 @@ D0BCFE3518AEBDA2004A7AAE /* Products */ = { isa = PBXGroup; children = ( - D0BCFE3418AEBDA2004A7AAE /* godot_ios.app */, + D0BCFE3418AEBDA2004A7AAE /* $binary.app */, ); name = Products; sourceTree = ""; @@ -96,6 +98,8 @@ D0BCFE3618AEBDA2004A7AAE /* Frameworks */ = { isa = PBXGroup; children = ( + 1FF4C1861F584E5600A41E41 /* StoreKit.framework */, + 1FF4C1841F584E3F00A41E41 /* GameKit.framework */, D0BCFE3718AEBDA2004A7AAE /* Foundation.framework */, D0BCFE3918AEBDA2004A7AAE /* CoreGraphics.framework */, D0BCFE3B18AEBDA2004A7AAE /* UIKit.framework */, @@ -106,33 +110,30 @@ name = Frameworks; sourceTree = ""; }; - D0BCFE4118AEBDA2004A7AAE /* godot_ios */ = { + D0BCFE4118AEBDA2004A7AAE /* $binary */ = { isa = PBXGroup; children = ( - D07CD4331C5D573600B7FB28 /* Default-568h@2x~iphone.png */, - D07CD4341C5D573600B7FB28 /* Default-667h.png */, + 1FF4C1881F584E6300A41E41 /* $binary.entitlements */, + D07CD4331C5D573600B7FB28 /* Default-568h@2x.png */, D07CD4351C5D573600B7FB28 /* Default-667h@2x.png */, - D07CD4361C5D573600B7FB28 /* Default-736h.png */, - D07CD4371C5D573600B7FB28 /* Default-736h@3x.png */, - D07CD4381C5D573600B7FB28 /* Default-Landscape-736h.png */, - D07CD4391C5D573600B7FB28 /* Default-Landscape@2x~ipad.png */, - D07CD43A1C5D573600B7FB28 /* Default-Landscape~ipad.png */, - D07CD43B1C5D573600B7FB28 /* Default-Portrait@2x~ipad.png */, - D07CD43C1C5D573600B7FB28 /* Default-Portrait~ipad.png */, - D07CD43D1C5D573600B7FB28 /* Default@2x~iphone.png */, - D07CD43E1C5D573600B7FB28 /* Default~iphone.png */, + D07CD4361C5D573600B7FB28 /* Default-Portrait-736h@3x.png */, + D07CD4381C5D573600B7FB28 /* Default-Landscape-736h@3x.png */, + D07CD4391C5D573600B7FB28 /* Default-Landscape@2x.png */, + D07CD43A1C5D573600B7FB28 /* Default-Landscape-1366h@2x.png */, + D07CD43B1C5D573600B7FB28 /* Default-Portrait@2x.png */, + D07CD43C1C5D573600B7FB28 /* Default-Portrait-1366h@2x.png */, D07CD44D1C5D589C00B7FB28 /* Images.xcassets */, D0BCFE4218AEBDA2004A7AAE /* Supporting Files */, ); - path = godot_ios; + path = $binary; sourceTree = ""; }; D0BCFE4218AEBDA2004A7AAE /* Supporting Files */ = { isa = PBXGroup; children = ( - D0BCFE4318AEBDA2004A7AAE /* godot_ios-Info.plist */, + D0BCFE4318AEBDA2004A7AAE /* $binary-Info.plist */, D0BCFE4418AEBDA2004A7AAE /* InfoPlist.strings */, - D0BCFE4918AEBDA2004A7AAE /* godot_ios-Prefix.pch */, + D0BCFE4918AEBDA2004A7AAE /* $binary-Prefix.pch */, ); name = "Supporting Files"; sourceTree = ""; @@ -140,9 +141,9 @@ /* End PBXGroup section */ /* Begin PBXNativeTarget section */ - D0BCFE3318AEBDA2004A7AAE /* godot_ios */ = { + D0BCFE3318AEBDA2004A7AAE /* $binary */ = { isa = PBXNativeTarget; - buildConfigurationList = D0BCFE7118AEBDA3004A7AAE /* Build configuration list for PBXNativeTarget "godot_ios" */; + buildConfigurationList = D0BCFE7118AEBDA3004A7AAE /* Build configuration list for PBXNativeTarget "$binary" */; buildPhases = ( D0BCFE3018AEBDA2004A7AAE /* Sources */, D0BCFE3118AEBDA2004A7AAE /* Frameworks */, @@ -152,9 +153,9 @@ ); dependencies = ( ); - name = godot_ios; - productName = godot_ios; - productReference = D0BCFE3418AEBDA2004A7AAE /* godot_ios.app */; + name = "$binary"; + productName = "$name"; + productReference = D0BCFE3418AEBDA2004A7AAE /* $binary.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ @@ -165,8 +166,24 @@ attributes = { LastUpgradeCheck = 0500; ORGANIZATIONNAME = GodotEngine; + TargetAttributes = { + D0BCFE3318AEBDA2004A7AAE = { + DevelopmentTeam = $team_id; + SystemCapabilities = { + com.apple.GameCenter = { + enabled = 1; + }; + com.apple.InAppPurchase = { + enabled = 1; + }; + com.apple.Push = { + enabled = 1; + }; + }; + }; + }; }; - buildConfigurationList = D0BCFE2F18AEBDA2004A7AAE /* Build configuration list for PBXProject "godot_ios" */; + buildConfigurationList = D0BCFE2F18AEBDA2004A7AAE /* Build configuration list for PBXProject "$binary" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = English; hasScannedForEncodings = 0; @@ -179,7 +196,7 @@ projectDirPath = ""; projectRoot = ""; targets = ( - D0BCFE3318AEBDA2004A7AAE /* godot_ios */, + D0BCFE3318AEBDA2004A7AAE /* $binary */, ); }; /* End PBXProject section */ @@ -189,22 +206,19 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - D07CD4471C5D573600B7FB28 /* Default-Portrait@2x~ipad.png in Resources */, + 1F1575721F582BE20003B888 /* dylibs in Resources */, D07CD44E1C5D589C00B7FB28 /* Images.xcassets in Resources */, - D0BCFE7818AEBFEB004A7AAE /* data.pck in Resources */, - D07CD4461C5D573600B7FB28 /* Default-Landscape~ipad.png in Resources */, + D0BCFE7818AEBFEB004A7AAE /* $binary.pck in Resources */, + D07CD4471C5D573600B7FB28 /* Default-Portrait@2x.png in Resources */, + D07CD4461C5D573600B7FB28 /* Default-Landscape-1366h@2x.png in Resources */, D07CD4411C5D573600B7FB28 /* Default-667h@2x.png in Resources */, - D07CD4401C5D573600B7FB28 /* Default-667h.png in Resources */, - D07CD4431C5D573600B7FB28 /* Default-736h@3x.png in Resources */, - D07CD43F1C5D573600B7FB28 /* Default-568h@2x~iphone.png in Resources */, - D07CD4451C5D573600B7FB28 /* Default-Landscape@2x~ipad.png in Resources */, - D07CD44A1C5D573600B7FB28 /* Default~iphone.png in Resources */, - D07CD4491C5D573600B7FB28 /* Default@2x~iphone.png in Resources */, - D07CD4441C5D573600B7FB28 /* Default-Landscape-736h.png in Resources */, - D07CD4421C5D573600B7FB28 /* Default-736h.png in Resources */, + D07CD43F1C5D573600B7FB28 /* Default-568h@2x.png in Resources */, + D07CD4451C5D573600B7FB28 /* Default-Landscape@2x.png in Resources */, + D07CD4441C5D573600B7FB28 /* Default-Landscape-736h@3x.png in Resources */, + D07CD4421C5D573600B7FB28 /* Default-Portrait-736h@3x.png in Resources */, + D07CD4481C5D573600B7FB28 /* Default-Portrait-1366h@2x.png in Resources */, D0BCFE4618AEBDA2004A7AAE /* InfoPlist.strings in Resources */, - D0BCFE7A18AEC06A004A7AAE /* godot_opt.iphone in Resources */, - D07CD4481C5D573600B7FB28 /* Default-Portrait~ipad.png in Resources */, + D0BCFE7A18AEC06A004A7AAE /* $binary.iphone in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -249,7 +263,7 @@ CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "$code_sign_identity_debug"; COPY_PHASE_STRIP = NO; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; @@ -265,7 +279,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; @@ -289,7 +303,8 @@ CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CODE_SIGN_IDENTITY = "$code_sign_identity_release"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "$code_sign_identity_release"; COPY_PHASE_STRIP = YES; ENABLE_NS_ASSERTIONS = NO; GCC_C_LANGUAGE_STANDARD = gnu99; @@ -299,7 +314,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; @@ -311,13 +326,22 @@ buildSettings = { ARCHS = "$(ARCHS_STANDARD)"; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_ENTITLEMENTS = $binary/$binary.entitlements; + CODE_SIGN_IDENTITY = "$code_sign_identity_debug"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "$code_sign_identity_debug"; CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)"; + DEVELOPMENT_TEAM = $team_id; GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "godot_ios/godot_ios-Prefix.pch"; - INFOPLIST_FILE = "godot_ios/godot_ios-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; - PRODUCT_BUNDLE_IDENTIFIER = org.godotengine.game.ios; + GCC_PREFIX_HEADER = "$binary/$binary-Prefix.pch"; + INFOPLIST_FILE = "$binary/$binary-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/dylibs", + ); + PRODUCT_BUNDLE_IDENTIFIER = $identifier; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE = "$provisioning_profile_uuid_debug"; TARGETED_DEVICE_FAMILY = "1,2"; VALID_ARCHS = "armv7 armv7s"; WRAPPER_EXTENSION = app; @@ -329,14 +353,22 @@ buildSettings = { ARCHS = "$(ARCHS_STANDARD)"; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_IDENTITY = "iPhone Distribution: Ariel Manzur (BYC57PA2Q5)"; + CODE_SIGN_ENTITLEMENTS = $binary/$binary.entitlements; + CODE_SIGN_IDENTITY = "$code_sign_identity_release"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "$code_sign_identity_release"; CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)"; + DEVELOPMENT_TEAM = $team_id; GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "godot_ios/godot_ios-Prefix.pch"; - INFOPLIST_FILE = "godot_ios/godot_ios-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; - PRODUCT_BUNDLE_IDENTIFIER = org.godotengine.game.ios; + GCC_PREFIX_HEADER = "$binary/$binary-Prefix.pch"; + INFOPLIST_FILE = "$binary/$binary-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/dylibs", + ); + PRODUCT_BUNDLE_IDENTIFIER = $identifier; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE = "$provisioning_profile_uuid_release"; TARGETED_DEVICE_FAMILY = "1,2"; VALID_ARCHS = "armv7 armv7s"; WRAPPER_EXTENSION = app; @@ -346,7 +378,7 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - D0BCFE2F18AEBDA2004A7AAE /* Build configuration list for PBXProject "godot_ios" */ = { + D0BCFE2F18AEBDA2004A7AAE /* Build configuration list for PBXProject "$binary" */ = { isa = XCConfigurationList; buildConfigurations = ( D0BCFE6F18AEBDA3004A7AAE /* Debug */, @@ -355,7 +387,7 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - D0BCFE7118AEBDA3004A7AAE /* Build configuration list for PBXNativeTarget "godot_ios" */ = { + D0BCFE7118AEBDA3004A7AAE /* Build configuration list for PBXNativeTarget "$binary" */ = { isa = XCConfigurationList; buildConfigurations = ( D0BCFE7218AEBDA3004A7AAE /* Debug */, diff --git a/misc/dist/ios_xcode/godot_ios.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/misc/dist/ios_xcode/godot_ios.xcodeproj/project.xcworkspace/contents.xcworkspacedata index 3c9ba38bbe6..c9c19829f4a 100644 --- a/misc/dist/ios_xcode/godot_ios.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ b/misc/dist/ios_xcode/godot_ios.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -2,6 +2,6 @@ + location = "self:$binary.xcodeproj"> diff --git a/misc/dist/ios_xcode/godot_ios.xcodeproj/xcshareddata/xcschemes/godot_ios.xcscheme b/misc/dist/ios_xcode/godot_ios.xcodeproj/xcshareddata/xcschemes/godot_ios.xcscheme new file mode 100644 index 00000000000..3f0df5c4379 --- /dev/null +++ b/misc/dist/ios_xcode/godot_ios.xcodeproj/xcshareddata/xcschemes/godot_ios.xcscheme @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/misc/dist/ios_xcode/godot_ios/Default-568h@2x~iphone.png b/misc/dist/ios_xcode/godot_ios/Default-568h@2x.png similarity index 100% rename from misc/dist/ios_xcode/godot_ios/Default-568h@2x~iphone.png rename to misc/dist/ios_xcode/godot_ios/Default-568h@2x.png diff --git a/misc/dist/ios_xcode/godot_ios/Default-667h.png b/misc/dist/ios_xcode/godot_ios/Default-667h.png deleted file mode 100644 index b13a399c831d66fddf16a0342089c5146fca4b94..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 683 zcmeAS@N?(olHy`uVBq!ia0y~yV0y>Ez-q<_6kvF?hHo{HVo7)Ob!1>{TVVKNT0D@? zl;rL1!oYa9OLz&8$64SJSq!8-z}W3%wjGecUgGKN%Km^&Oh{X7?~>x@3=E8?JY5_^ zDsH_!W5~7{q@&hN2wtY1b@%(t8n-(@_yT;a9~8M zmbgZgq$HN4S|t~y0x1R~14A=i12bJCqYxtlD`QJ5BQtFSBP#=glWR`^Qx}qk-29Zx Yv`X9>c6=xRCPfAYPgg&ebxsLQ06X`39RL6T diff --git a/misc/dist/ios_xcode/godot_ios/Default-736h@3x.png b/misc/dist/ios_xcode/godot_ios/Default-736h@3x.png deleted file mode 100644 index 33847ac13653fafab3d3fec08e2f4d19ffc69336..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2582 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 literal 0 HcmV?d00001 diff --git a/misc/dist/ios_xcode/godot_ios/Default-Landscape-736h.png b/misc/dist/ios_xcode/godot_ios/Default-Landscape-736h@3x.png similarity index 100% rename from misc/dist/ios_xcode/godot_ios/Default-Landscape-736h.png rename to misc/dist/ios_xcode/godot_ios/Default-Landscape-736h@3x.png diff --git a/misc/dist/ios_xcode/godot_ios/Default-Landscape@2x~ipad.png b/misc/dist/ios_xcode/godot_ios/Default-Landscape@2x.png similarity index 100% rename from misc/dist/ios_xcode/godot_ios/Default-Landscape@2x~ipad.png rename to misc/dist/ios_xcode/godot_ios/Default-Landscape@2x.png diff --git a/misc/dist/ios_xcode/godot_ios/Default-Landscape~ipad.png b/misc/dist/ios_xcode/godot_ios/Default-Landscape~ipad.png deleted file mode 100644 index 4a761c339acd052b110110f6df826eb20b0b015a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 634 zcmeAS@N?(olHy`uVBq!ia0y~yU;#3j85n^i!=!^63xE_$x}&cn17q6)!xz)yfqbSU zZ+904#=Bj@OMpDi0*}aIAngIhZYQ(tfDHB$PhVH|2W(+Ly3kl9QM|L0$m6pL`E5@Q?%0~i90eI1@C|w7(8A5 KT-G@yGywotIYi?C diff --git a/misc/dist/ios_xcode/godot_ios/Default-Portrait-1366h@2x.png b/misc/dist/ios_xcode/godot_ios/Default-Portrait-1366h@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d054ba2abb2b45094c8c0c5cbc94f45be70d07 GIT binary patch literal 33309 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 AXaE2J diff --git a/misc/dist/ios_xcode/godot_ios/Default-Portrait~ipad.png b/misc/dist/ios_xcode/godot_ios/Default-Portrait~ipad.png deleted file mode 100644 index fa698eb70cb662913e5ec17d43a4ef4cc0dd1dc9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 589 zcmeAS@N?(olHy`uVBq!ia0y~yUQI)kyu?!51Ii4<#Ar-gY zo;BoUVBle1@XP$}s)$X@JQL))9TWsOSeP0|De45l!S@NJkESJuSniw*j0)8f*NBpo z#FA92+YZQJFY)wsWq-gXCZsL4cS-Sc1_nkYPZ!6K zid%2b7y`}aVN&=#{Th>Xxf8>sbV06Gr-cC;A|sr7nA%UO_ zQmvAUQh^kMk%6I^u7R1Zkx__|ft9hPm64gYfsvJg!O68JfU$<8AvZrIGp!Q0h8-UY R-T^f*c)I$ztaD0e0szKvj_m*d diff --git a/misc/dist/ios_xcode/godot_ios/Default~iphone.png b/misc/dist/ios_xcode/godot_ios/Default~iphone.png deleted file mode 100644 index c485a33b03b4887553ecf427d2aea02cce39ca0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 309 zcmeAS@N?(olHy`uVBq!ia0y~yU~~ZD2aG@ghCkmsUjiwXbVpxD2FA7phA*bY1Nlrz z-tI08jCZ?)mjHR31s;*bK-vS0-A-oP0U7Kip1!W^57@+nw8i!=DSi$V3h{Jt45_&F z_LQR_0|O6}!td$V*mkovn7<5m2^4W93*|E(|GhK(l}B0t(0tVr*NBpo#FA92Dyr(~v8;?}U^L%}RdP`(kYX@0Ff`LOFw-?M z3NbRUGPblbGSfCNvNA9@x%LFeu?P*h`6-!cmAEzR_)zc;sDZ)L)z4*}Q$iB})>cFF diff --git a/misc/dist/ios_xcode/godot_ios/Images.xcassets/AppIcon.appiconset/Icon-114.png b/misc/dist/ios_xcode/godot_ios/Images.xcassets/AppIcon.appiconset/Icon-114.png deleted file mode 100644 index 2e205e920cff70017aa2dc67f9b78d219fb01121..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 253 zcmeAS@N?(olHy`uVBq!ia0vp^MIg)wBp8-2+i?L%v7|ftIx;Y}EiimBEgr~cO7eDh zVPL%5CA+YZQJFY)wsWq-gXCZsK@vQ{Y;C?w?Mnv89!fnYMwEm4U&@wI@LCMQF&)PsvQH#I0e+hk|!N4Gf;HelF{r5}E)p CFh!yO diff --git a/misc/dist/ios_xcode/godot_ios/Images.xcassets/AppIcon.appiconset/Icon-120.png b/misc/dist/ios_xcode/godot_ios/Images.xcassets/AppIcon.appiconset/Icon-120.png deleted file mode 100644 index 6245f83f484fedb63c5a79e36aaacb8da57f4a5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 253 zcmeAS@N?(olHy`uVBq!ia0vp^6(GzABp3wcx$A)xOS+@4BLidG0>c;6;(>goByV>Y z2FANx!b^ZW&H|6fVj%4S#%?FG?SKsS5>H=O_6KZYLfWD#Yn5VwLNcB%jv*GOlYjJc zNx1!7{3r0AM*S4~Q}RzQ&*5h72bs7|%SHKHUXu_V85o>gdjjNMgofPwl+3hB+!}U#D0m0dz~JfX=d#Wzp$PzV C6+@-~ diff --git a/misc/dist/ios_xcode/godot_ios/Images.xcassets/AppIcon.appiconset/Icon-144.png b/misc/dist/ios_xcode/godot_ios/Images.xcassets/AppIcon.appiconset/Icon-144.png deleted file mode 100644 index 7b24e01bc63f413ea90d76600864a8142128741d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 259 zcmeAS@N?(olHy`uVBq!ia0vp^6F`^|NHCnYy)O!+SkfJR9T^zg78t&m77yezC3(BM zFfiWj5?%u2aTa()76WMyFm^kcZ3kqqmw5WRvOi!G6Vet{S*sKa6jJhZaSZV|{`Q0+ z&}<$ih2PV!F=%gK_PeC)rMYxUkXP+WMhOqG@{5~Kp8~2@Epd$~Nl7e8wMs5Z1yT$~ z28L$324=cOMj=K9R>qcAMrPUuMpgy}C)b_;xf-D%H$NpatrE9}9Ultb0W~mqy85}S Ib4q9e03W@~ diff --git a/misc/dist/ios_xcode/godot_ios/Images.xcassets/AppIcon.appiconset/Icon-152.png b/misc/dist/ios_xcode/godot_ios/Images.xcassets/AppIcon.appiconset/Icon-152.png deleted file mode 100644 index 344b470fa3009ec2be635d6c26d739b29df32af2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 260 zcmeAS@N?(olHy`uVBq!ia0vp^GeDRTNH7@elTiI14-?i-EKU7`vU!wgWQQOFVsD*&ncp32BR}tW}By3MqTKIEHu}e|y4^ zmw|zYdBHF9yIeDxR0}4>6`r$vKBxHH-aU+!DYkLy=Kj$@<*FsF5hW>!C8<`)MX5lF z!N|bSOxM6n*T^Wu$iT|j(#pt8+rY@mz~JQC6Ch_JH00)|WTsW(*0AG4!8@P^22WQ% Jmvv4FO#r}SMaTdE diff --git a/misc/dist/ios_xcode/godot_ios/Images.xcassets/AppIcon.appiconset/Icon-180.png b/misc/dist/ios_xcode/godot_ios/Images.xcassets/AppIcon.appiconset/Icon-180.png deleted file mode 100644 index 0dcebbc3f2ccfb5e4915a2f8445b68249e6ffbe1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 265 zcmeAS@N?(olHy`uVBq!ia0vp^TR@l*NHBf?aSVw#{Pu() zF9QPy^M;?{-OOnW%qnkhzR7&F_xru-_aNf`6K=OGA~>+Bcl)_11n=oD9nO2Eg!;TLH?|>Q@ NJYD@<);T3K0RYb-OrQV& diff --git a/misc/dist/ios_xcode/godot_ios/Images.xcassets/AppIcon.appiconset/Icon-29.png b/misc/dist/ios_xcode/godot_ios/Images.xcassets/AppIcon.appiconset/Icon-29.png deleted file mode 100644 index 9ae94e9aaf28038dcc1e3feee3014612af0c1e94..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^vLMU|BpB*mL@feREa{HEjtq=#3k+XOiwE+VlDyqr z7#Qz%2`>TiI14-?i-EKU7`vU!wgWQQOFVsD*&ncp32BR}tW}By3JH3;IEHXsPyX@$ z|9}2AM;8W$X0M_{d)vY{03}sRTq8?Mnv89!f qnYMwEm4U&@wI@K1L}TiI14-?i-EKU7`vU!wgWQQOFVsD*&ncp32BR}tW}By3h{foIEHXsPyWHr z#G~BC!jQ4}xTWX&W-FkSYKdz^NlIc#s#S7PDv)9@GB7mLH89gPG72#=urju^GBVRP oFtRc*IJx!&$cYFIx%nxXX_dG&?D$ad4yb{_)78&qol`;+0J_*b761SM diff --git a/misc/dist/ios_xcode/godot_ios/Images.xcassets/AppIcon.appiconset/Icon-50.png b/misc/dist/ios_xcode/godot_ios/Images.xcassets/AppIcon.appiconset/Icon-50.png deleted file mode 100644 index 9e69ed3121d16e44cf8dee8ad8ba420cc5d34234..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 243 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*@xBpA$Gw#oo0mUKs7M+U~W1%@xC#RK_FN#5=* z42*ZXgqHw$oCO|{#X#BvjNMLV+W{HuC7!;n><`$)gtSFf)+)sUg@im^977~7C;#AQ zW0!Dy>FCJJ@Vz7;C2QWY!$4Wp64!{5l*E!$tK_0oAjM#0U}&amV5Vzi6k=pxWo&6> rWTtIkWMyD*a_tF_D-jxU^HVa@DsgMr@uA=yPy>UftDnm{r-UW|_KiHm diff --git a/misc/dist/ios_xcode/godot_ios/Images.xcassets/AppIcon.appiconset/Icon-57.png b/misc/dist/ios_xcode/godot_ios/Images.xcassets/AppIcon.appiconset/Icon-57.png deleted file mode 100644 index b970fa3067fc6af4b5775a0eee5653efdd41bd23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 243 zcmeAS@N?(olHy`uVBq!ia0vp^mLSXsBp8+?@6!NMEa{HEjtq=#3k+XOiwE+VlDyqr z7#Qz%2`>TiI14-?i-EKU7`vU!wgWQQOFVsD*&ncp32BR}tW}By3JH0-IEHAPPyWHr z$jh_1NAM&AgY)-QjPgfy6M(X+C9V-ADTyViR>?)FK#IZ0z|c(Bz)aW3D8$IX%GlD% r$V}V7$jZRrBp6N}C~pN)Ea{HEjtq=#3k+XOiwE+VlDyqr z7#Qz%2`>TiI14-?i-EKU7`vU!wgWQQOFVsD*&ncp32BR}tW}By3JH0-IEHAPPyWHr z$S&a~sXUvJ;fLq`UsBD|W rWTtIkWMyD*a_tF_D-jxU^HVa@DsgMr@uA=yPy>UftDnm{r-UW|ebYSG diff --git a/misc/dist/ios_xcode/godot_ios/Images.xcassets/AppIcon.appiconset/Icon-60.png b/misc/dist/ios_xcode/godot_ios/Images.xcassets/AppIcon.appiconset/Icon-60.png deleted file mode 100644 index 21b9622eb6d43c503b79d100af2dbfcfb725cdf4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 244 zcmeAS@N?(olHy`uVBq!ia0vp^HXzIhBp8I+pWFvhEa{HEjtq=#3k+XOiwE+VlDyqr z7#Qz%2`>TiI14-?i-EKU7`vU!wgWQQOFVsD*&ncp32BR}tW}By3JH6UO_QmvAUQh^kMk%6I^u7R1Zkx__|ft9hP sm64gYfsvJg!O68JK+Z&H$jwj5OsmALVaJDpcR&pcp00i_>zopr03ftJE&u=k diff --git a/misc/dist/ios_xcode/godot_ios/Images.xcassets/AppIcon.appiconset/Icon-72.png b/misc/dist/ios_xcode/godot_ios/Images.xcassets/AppIcon.appiconset/Icon-72.png deleted file mode 100644 index 34dea8e6ad255261a0d0b14cef0dd51ad45fbb85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 244 zcmeAS@N?(olHy`uVBq!ia0vp^9w5vJBp7O^^}Pa8Ea{HEjtq=#3k+XOiwE+VlDyqr z7#Qz%2`>TiI14-?i-9y)8-v@)Y&#%_y~NYkmHh#mn2@%p%37sZppdYqi(`n!`Q#t` z%sh+N1YVnv&dBg$YwPq)!C8<`)MX5lF!N|bSOxM6n*T^Wu$iT|j t(#pt8+rY@mz~JQC6Ch_IH00)|WTsW(*0AG4!8@P^22WQ%mvv4FO#nH8Kr{dV diff --git a/misc/dist/ios_xcode/godot_ios/Images.xcassets/AppIcon.appiconset/Icon-76.png b/misc/dist/ios_xcode/godot_ios/Images.xcassets/AppIcon.appiconset/Icon-76.png deleted file mode 100644 index f72eb0b345c2789332313f3ad9516d563eaea9f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^J|N5pBpBYm$!P;pEa{HEjtq=#3k+XOiwE+VlDyqr z7#Qz%2`>TiI14-?i-EKU7`vU!wgWQQOFVsD*&ncp32BR}tW}By3W<8UIEHAPPyWHr zEHB|UbMcu#wU<5&20uS+e#s+u38+A|#5JNMC9x#cD!C{XNHG{07@FxCnCTiBg%}xF v8CzNznQ0psSs56dTzdlKP=tou{FKbJO57TDd?gTe~DWM4f?!Z9> diff --git a/misc/dist/ios_xcode/godot_ios/Images.xcassets/AppIcon.appiconset/Icon-80.png b/misc/dist/ios_xcode/godot_ios/Images.xcassets/AppIcon.appiconset/Icon-80.png deleted file mode 100644 index 793c9b1f5fd34ef3f385f3f383a4f213f4c1909c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 245 zcmeAS@N?(olHy`uVBq!ia0vp^0U*o>Bp8-uod;1Y>5jgR42*3H3|~x(2lAPcyxmFngm*rctkiQNnuUg_7QIe8al4_M)lnSI6j0_CTbPddOjf_H!46KYT tt&GgH4UDV|3{I{+0dgloLvDUbW?Cg~4Ld#*yaQ@r@O1TaS?83{1OU53KTiMv diff --git a/misc/dist/ios_xcode/godot_ios/Images.xcassets/AppIcon.appiconset/icon-167.png b/misc/dist/ios_xcode/godot_ios/Images.xcassets/AppIcon.appiconset/icon-167.png deleted file mode 100644 index 7cd0e054ab4b00f8ed33d73f38a87be7d9da8b6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^%R!hCNHE0Y7CHhcmUKs7M+U~W1%@xC#RK_FN#5=* z42*ZXgqHw$oCO|{#X#BvjNMLV+W{HuC7!;n><`$)gtSFf)+)sUg;YIV978;gzdd0H zG@FBY!B_sZ+7A*LEKbU)U5mhE#~%lv@~nq;iq3g8cJLvN>UO_QmvAUQh^kM zk%6I^u7R1Zkx__|ft9hPm64gYfsvJg!O68JKn_P}$jwj5OsmALVaJDpcR&pcp00i_ I>zopr09l<#(EtDd diff --git a/misc/dist/ios_xcode/godot_ios/Images.xcassets/AppIcon.appiconset/icon-87.png b/misc/dist/ios_xcode/godot_ios/Images.xcassets/AppIcon.appiconset/icon-87.png deleted file mode 100644 index e9b2429754656ca4825b3984bcbb3347ada2857a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 247 zcmeAS@N?(olHy`uVBq!ia0vp^;ULTiBp4z$KRF1bSkfJR9T^zg78t&m77yezC3(BM zFfiWj5?%u2aTa()76WMyFm^kcZ3kqqmw5WRvOi!G6Vet{S*sKa6cY1vaSX9Io&1BJ z{lA3U&Bbp5zjdTDGj!b8DW%hL0A#UhiEBhjN@7W>RdP`(kYX@0Ff`LOFw-?M3NbRU tGPblbGSfCNvNA9@x%LFAhTQy=%(P0}8g_grcn7qB!PC{xWt~$(69Ay2LLmSE diff --git a/misc/dist/ios_xcode/godot_ios/Images.xcassets/AppIcon.appiconset/sizes b/misc/dist/ios_xcode/godot_ios/Images.xcassets/AppIcon.appiconset/sizes deleted file mode 100644 index e328a62cb64..00000000000 --- a/misc/dist/ios_xcode/godot_ios/Images.xcassets/AppIcon.appiconset/sizes +++ /dev/null @@ -1,17 +0,0 @@ -100 -114 -120 -144 -152 -167 -180 -29 -40 -50 -57 -58 -60 -72 -76 -80 -87 diff --git a/misc/dist/ios_xcode/godot_ios/godot_ios-Info.plist b/misc/dist/ios_xcode/godot_ios/godot_ios-Info.plist index f97b0fca36e..1531a41bd04 100644 --- a/misc/dist/ios_xcode/godot_ios/godot_ios-Info.plist +++ b/misc/dist/ios_xcode/godot_ios/godot_ios-Info.plist @@ -5,32 +5,33 @@ CFBundleDevelopmentRegion en CFBundleDisplayName - Insert Name Here + $name CFBundleExecutable - godot_opt.iphone + $binary.iphone CFBundleIcons CFBundleIcons~ipad CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) + $identifier CFBundleInfoDictionaryVersion 6.0 CFBundleName - ${PRODUCT_NAME} + $name CFBundlePackageType APPL CFBundleShortVersionString - 1.0 + $short_version CFBundleSignature - ???? + $signature CFBundleVersion - 1.0 + $version LSRequiresIPhoneOS UIRequiredDeviceCapabilities armv7 + gamekit UIRequiresFullScreen diff --git a/misc/dist/ios_xcode/godot_ios/godot_ios.entitlements b/misc/dist/ios_xcode/godot_ios/godot_ios.entitlements new file mode 100644 index 00000000000..903def2af53 --- /dev/null +++ b/misc/dist/ios_xcode/godot_ios/godot_ios.entitlements @@ -0,0 +1,8 @@ + + + + + aps-environment + development + + diff --git a/modules/gdnative/SCsub b/modules/gdnative/SCsub index f386f2b5424..39f5ec53785 100644 --- a/modules/gdnative/SCsub +++ b/modules/gdnative/SCsub @@ -11,7 +11,7 @@ gdn_env.add_source_files(env.modules_sources, "nativescript/*.cpp") gdn_env.Append(CPPFLAGS=['-DGDAPI_BUILT_IN']) gdn_env.Append(CPPPATH=['#modules/gdnative/include/']) -if "platform" in env and env["platform"] == "x11": # there has to be a better solution? +if "platform" in env and env["platform"] in ["x11", "iphone"]: env.Append(LINKFLAGS=["-rdynamic"]) env.use_ptrcall = True diff --git a/modules/gdnative/gdnative.cpp b/modules/gdnative/gdnative.cpp index 93a9bac11c1..11856e4ffb2 100644 --- a/modules/gdnative/gdnative.cpp +++ b/modules/gdnative/gdnative.cpp @@ -234,8 +234,11 @@ bool GDNative::initialize() { ERR_PRINT("No library set for this platform"); return false; } - +#ifdef IPHONE_ENABLED + String path = lib_path.replace("res://", "dylibs/"); +#else String path = ProjectSettings::get_singleton()->globalize_path(lib_path); +#endif Error err = OS::get_singleton()->open_dynamic_library(path, native_handle); if (err != OK) { return false; diff --git a/modules/gdnative/include/gdnative/gdnative.h b/modules/gdnative/include/gdnative/gdnative.h index 18d51daeb32..19dd0306377 100644 --- a/modules/gdnative/include/gdnative/gdnative.h +++ b/modules/gdnative/include/gdnative/gdnative.h @@ -49,8 +49,8 @@ extern "C" { #elif defined(__APPLE__) #include "TargetConditionals.h" #if TARGET_OS_IPHONE -#define GDCALLINGCONV -#define GDAPI +#define GDCALLINGCONV __attribute__((visibility("default"))) +#define GDAPI GDCALLINGCONV #elif TARGET_OS_MAC #define GDCALLINGCONV __attribute__((sysv_abi)) #define GDAPI GDCALLINGCONV diff --git a/modules/gdnative/include/nativescript/godot_nativescript.h b/modules/gdnative/include/nativescript/godot_nativescript.h index 96f213ead7c..5095b7a83ea 100644 --- a/modules/gdnative/include/nativescript/godot_nativescript.h +++ b/modules/gdnative/include/nativescript/godot_nativescript.h @@ -51,8 +51,8 @@ extern "C" { #elif defined(__APPLE__) #include "TargetConditionals.h" #if TARGET_OS_IPHONE -#define GDCALLINGCONV -#define GDAPI +#define GDCALLINGCONV __attribute__((visibility("default"))) +#define GDAPI GDCALLINGCONV #elif TARGET_OS_MAC #define GDCALLINGCONV __attribute__((sysv_abi)) #define GDAPI GDCALLINGCONV diff --git a/modules/gdnative/nativescript/SCsub b/modules/gdnative/nativescript/SCsub index e980e40e8ec..178afec64a9 100644 --- a/modules/gdnative/nativescript/SCsub +++ b/modules/gdnative/nativescript/SCsub @@ -7,4 +7,7 @@ mod_env.add_source_files(env.modules_sources, "*.cpp") mod_env.Append(CPPPATH='#modules/gdnative') mod_env.Append(CPPFLAGS=['-DGDAPI_BUILT_IN']) +if "platform" in env and env["platform"] in ["x11", "iphone"]: + env.Append(LINKFLAGS=["-rdynamic"]) + Export('mod_env') diff --git a/platform/iphone/export/export.cpp b/platform/iphone/export/export.cpp index 8bb7f23ead1..c91781ce1d7 100644 --- a/platform/iphone/export/export.cpp +++ b/platform/iphone/export/export.cpp @@ -52,7 +52,14 @@ class EditorExportPlatformIOS : public EditorExportPlatform { Ref logo; - void _fix_config_file(const Ref &p_preset, Vector &pfile, const String &p_name, const String &p_binary); + typedef Error (*FileHandler)(String p_file, void *p_userdata); + static Error _walk_dir_recursive(DirAccess *p_da, FileHandler p_handler, void *p_userdata); + static Error _codesign(String p_file, void *p_userdata); + + void _fix_config_file(const Ref &p_preset, Vector &pfile, const String &p_name, const String &p_binary, bool p_debug); + static Error _export_dylibs(void *p_userdata, const String &p_path, const Vector &p_data, int p_file, int p_total); + Error _export_loading_screens(const Ref &p_preset, const String &p_dest_dir); + Error _export_icons(const Ref &p_preset, const String &p_iconset_dir); protected: virtual void get_preset_features(const Ref &p_preset, List *r_features); @@ -63,7 +70,7 @@ public: virtual String get_os_name() const { return "iOS"; } virtual Ref get_logo() const { return logo; } - virtual String get_binary_extension() const { return "xcodeproj"; } + virtual String get_binary_extension() const { return "ipa"; } virtual Error export_project(const Ref &p_preset, bool p_debug, const String &p_path, int p_flags = 0); virtual bool can_export(const Ref &p_preset, String &r_error, bool &r_missing_templates) const; @@ -96,16 +103,44 @@ void EditorExportPlatformIOS::get_export_options(List *r_options) r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "custom_package/debug", PROPERTY_HINT_GLOBAL_FILE, "zip"), "")); r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "custom_package/release", PROPERTY_HINT_GLOBAL_FILE, "zip"), "")); + r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "application/app_store_team_id"), "")); + + r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "application/provisioning_profile_uuid_debug"), "")); + r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "application/code_sign_identity_debug"), "iPhone Developer")); + r_options->push_back(ExportOption(PropertyInfo(Variant::INT, "application/export_method_debug", PROPERTY_HINT_ENUM, "App Store,Development,Ad-Hoc,Enterprise"), 1)); + + r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "application/provisioning_profile_uuid_release"), "")); + r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "application/code_sign_identity_release"), "iPhone Distribution")); + r_options->push_back(ExportOption(PropertyInfo(Variant::INT, "application/export_method_release", PROPERTY_HINT_ENUM, "App Store,Development,Ad-Hoc,Enterprise"), 0)); + r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "application/name"), "")); r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "application/info"), "Made with Godot Engine")); - // r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "application/icon", PROPERTY_HINT_FILE, "png"), "")); r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "application/identifier"), "org.godotengine.iosgame")); - r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "application/signature"), "godotiosgame")); + r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "application/signature"), "????")); r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "application/short_version"), "1.0")); r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "application/version"), "1.0")); r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "application/copyright"), "")); r_options->push_back(ExportOption(PropertyInfo(Variant::INT, "application/bits_mode", PROPERTY_HINT_ENUM, "Fat (32 & 64 bits),64 bits,32 bits"), 1)); + r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "required_icons/iphone_120x120", PROPERTY_HINT_FILE, "png"), "")); // Home screen on iPhone/iPod Touch with retina display + r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "required_icons/ipad_76x76", PROPERTY_HINT_FILE, "png"), "")); // Home screen on iPad + + r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "optional_icons/iphone_180x180", PROPERTY_HINT_FILE, "png"), "")); // Home screen on iPhone with retina HD display + r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "optional_icons/ipad_152x152", PROPERTY_HINT_FILE, "png"), "")); // Home screen on iPad with retina display + r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "optional_icons/ipad_167x167", PROPERTY_HINT_FILE, "png"), "")); // Home screen on iPad Pro + r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "optional_icons/spotlight_40x40", PROPERTY_HINT_FILE, "png"), "")); // Spotlight + r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "optional_icons/spotlight_80x80", PROPERTY_HINT_FILE, "png"), "")); // Spotlight on devices with retina display + + r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "landscape_launch_screens/iphone_2208x1242", PROPERTY_HINT_FILE, "png"), "")); // iPhone 6 Plus, 6s Plus, 7 Plus + r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "landscape_launch_screens/ipad_2732x2048", PROPERTY_HINT_FILE, "png"), "")); // 12.9-inch iPad Pro + r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "landscape_launch_screens/ipad_2048x1536", PROPERTY_HINT_FILE, "png"), "")); // Other iPads + + r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "portrait_launch_screens/iphone_640x1136", PROPERTY_HINT_FILE, "png"), "")); // iPhone 5, 5s, SE + r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "portrait_launch_screens/iphone_750x1334", PROPERTY_HINT_FILE, "png"), "")); // iPhone 6, 6s, 7 + r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "portrait_launch_screens/iphone_1242x2208", PROPERTY_HINT_FILE, "png"), "")); // iPhone 6 Plus, 6s Plus, 7 Plus + r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "portrait_launch_screens/ipad_2048x2732", PROPERTY_HINT_FILE, "png"), "")); // 12.9-inch iPad Pro + r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "portrait_launch_screens/ipad_1536x2048", PROPERTY_HINT_FILE, "png"), "")); // Other iPads + r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "texture_format/s3tc"), false)); r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "texture_format/etc"), false)); r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "texture_format/etc2"), true)); @@ -113,11 +148,17 @@ void EditorExportPlatformIOS::get_export_options(List *r_options) /* probably need some more info */ } -void EditorExportPlatformIOS::_fix_config_file(const Ref &p_preset, Vector &pfile, const String &p_name, const String &p_binary) { - +void EditorExportPlatformIOS::_fix_config_file(const Ref &p_preset, Vector &pfile, const String &p_name, const String &p_binary, bool p_debug) { + static const String export_method_string[] = { + "app-store", + "development", + "ad-hoc", + "enterprise" + }; String str; String strnew; str.parse_utf8((const char *)pfile.ptr(), pfile.size()); + print_line(str); Vector lines = str.split("\n"); for (int i = 0; i < lines.size(); i++) { if (lines[i].find("$binary") != -1) { @@ -136,6 +177,19 @@ void EditorExportPlatformIOS::_fix_config_file(const Ref &p_ strnew += lines[i].replace("$signature", p_preset->get("application/signature")) + "\n"; } else if (lines[i].find("$copyright") != -1) { strnew += lines[i].replace("$copyright", p_preset->get("application/copyright")) + "\n"; + } else if (lines[i].find("$team_id") != -1) { + strnew += lines[i].replace("$team_id", p_preset->get("application/app_store_team_id")) + "\n"; + } else if (lines[i].find("$export_method") != -1) { + int export_method = p_preset->get(p_debug ? "application/export_method_debug" : "application/export_method_release"); + strnew += lines[i].replace("$export_method", export_method_string[export_method]) + "\n"; + } else if (lines[i].find("$provisioning_profile_uuid_release") != -1) { + strnew += lines[i].replace("$provisioning_profile_uuid_release", p_preset->get("application/provisioning_profile_uuid_release")) + "\n"; + } else if (lines[i].find("$provisioning_profile_uuid_debug") != -1) { + strnew += lines[i].replace("$provisioning_profile_uuid_debug", p_preset->get("application/provisioning_profile_uuid_debug")) + "\n"; + } else if (lines[i].find("$code_sign_identity_debug") != -1) { + strnew += lines[i].replace("$code_sign_identity_debug", p_preset->get("application/code_sign_identity_debug")) + "\n"; + } else if (lines[i].find("$code_sign_identity_release") != -1) { + strnew += lines[i].replace("$code_sign_identity_release", p_preset->get("application/code_sign_identity_release")) + "\n"; } else { strnew += lines[i] + "\n"; } @@ -150,12 +204,214 @@ void EditorExportPlatformIOS::_fix_config_file(const Ref &p_ } } +Error EditorExportPlatformIOS::_export_dylibs(void *p_userdata, const String &p_path, const Vector &p_data, int p_file, int p_total) { + if (!p_path.ends_with(".dylib")) return OK; + const String &dest_dir = *(String *)p_userdata; + String rel_path = p_path.replace_first("res://", "dylibs/"); + DirAccess *dest_dir_access = DirAccess::open(dest_dir); + ERR_FAIL_COND_V(!dest_dir_access, ERR_CANT_OPEN); + + String base_dir = rel_path.get_base_dir(); + Error make_dir_err = OK; + if (!dest_dir_access->dir_exists(base_dir)) { + make_dir_err = dest_dir_access->make_dir_recursive(base_dir); + } + if (make_dir_err != OK) { + memdelete(dest_dir_access); + return make_dir_err; + } + + Error copy_err = dest_dir_access->copy(p_path, dest_dir + rel_path); + memdelete(dest_dir_access); + + return copy_err; +} + +struct IconInfo { + const char *preset_key; + const char *idiom; + const char *export_name; + const char *actual_size_side; + const char *scale; + const char *unscaled_size; + bool is_required; +}; + +static const IconInfo icon_infos[] = { + { "required_icons/iphone_120x120", "iphone", "Icon-120.png", "120", "2x", "60x60", true }, + { "required_icons/iphone_120x120", "iphone", "Icon-120.png", "120", "3x", "40x40", true }, + + { "required_icons/ipad_76x76", "ipad", "Icon-76.png", "76", "1x", "76x76", false }, + + { "optional_icons/iphone_180x180", "iphone", "Icon-180.png", "180", "3x", "60x60", false }, + + { "optional_icons/ipad_152x152", "ipad", "Icon-152.png", "152", "2x", "76x76", false }, + + { "optional_icons/ipad_167x167", "ipad", "Icon-167.png", "167", "2x", "83.5x83.5", false }, + + { "optional_icons/spotlight_40x40", "ipad", "Icon-40.png", "40", "1x", "40x40", false }, + + { "optional_icons/spotlight_80x80", "iphone", "Icon-80.png", "80", "2x", "40x40", false }, + { "optional_icons/spotlight_80x80", "ipad", "Icon-80.png", "80", "2x", "40x40", false } + +}; + +Error EditorExportPlatformIOS::_export_icons(const Ref &p_preset, const String &p_iconset_dir) { + String json_description = "{\"images\":["; + String sizes; + + DirAccess *da = DirAccess::open(p_iconset_dir); + ERR_FAIL_COND_V(!da, ERR_CANT_OPEN); + + for (int i = 0; i < (sizeof(icon_infos) / sizeof(icon_infos[0])); ++i) { + IconInfo info = icon_infos[i]; + String icon_path = p_preset->get(info.preset_key); + if (icon_path.length() == 0) { + if (info.is_required) { + ERR_PRINT("Required icon is not specified in the preset"); + return ERR_UNCONFIGURED; + } + continue; + } + Error err = da->copy(icon_path, p_iconset_dir + info.export_name); + if (err) { + memdelete(da); + String err_str = String("Failed to export icon: ") + icon_path; + ERR_PRINT(err_str.utf8().get_data()); + return err; + } + sizes += String(info.actual_size_side) + "\n"; + if (i > 0) { + json_description += ","; + } + json_description += String("{"); + json_description += String("\"idiom\":") + "\"" + info.idiom + "\","; + json_description += String("\"size\":") + "\"" + info.unscaled_size + "\","; + json_description += String("\"scale\":") + "\"" + info.scale + "\","; + json_description += String("\"filename\":") + "\"" + info.export_name + "\""; + json_description += String("}"); + } + json_description += "]}"; + memdelete(da); + + FileAccess *json_file = FileAccess::open(p_iconset_dir + "Contents.json", FileAccess::WRITE); + ERR_FAIL_COND_V(!json_file, ERR_CANT_CREATE); + CharString json_utf8 = json_description.utf8(); + json_file->store_buffer((const uint8_t *)json_utf8.get_data(), json_utf8.length()); + memdelete(json_file); + + FileAccess *sizes_file = FileAccess::open(p_iconset_dir + "sizes", FileAccess::WRITE); + ERR_FAIL_COND_V(!sizes_file, ERR_CANT_CREATE); + CharString sizes_utf8 = sizes.utf8(); + sizes_file->store_buffer((const uint8_t *)sizes_utf8.get_data(), sizes_utf8.length()); + memdelete(sizes_file); + + return OK; +} + +struct LoadingScreenInfo { + const char *preset_key; + const char *export_name; +}; + +static const LoadingScreenInfo loading_screen_infos[] = { + { "landscape_launch_screens/iphone_2208x1242", "Default-Landscape-736h@3x.png" }, + { "landscape_launch_screens/ipad_2732x2048", "Default-Landscape-1366h@2x.png" }, + { "landscape_launch_screens/ipad_2048x1536", "Default-Landscape@2x.png" }, + + { "portrait_launch_screens/iphone_640x1136", "Default-568h@2x.png" }, + { "portrait_launch_screens/iphone_750x1334", "Default-667h@2x.png" }, + { "portrait_launch_screens/iphone_1242x2208", "Default-Portrait-736h@3x.png" }, + { "portrait_launch_screens/ipad_2048x2732", "Default-Portrait-1366h@2x.png" }, + { "portrait_launch_screens/ipad_1536x2048", "Default-Portrait@2x.png" } +}; + +Error EditorExportPlatformIOS::_export_loading_screens(const Ref &p_preset, const String &p_dest_dir) { + DirAccess *da = DirAccess::open(p_dest_dir); + ERR_FAIL_COND_V(!da, ERR_CANT_OPEN); + + for (int i = 0; i < sizeof(loading_screen_infos) / sizeof(loading_screen_infos[0]); ++i) { + LoadingScreenInfo info = loading_screen_infos[i]; + String loading_screen_file = p_preset->get(info.preset_key); + Error err = da->copy(loading_screen_file, p_dest_dir + info.export_name); + if (err) { + memdelete(da); + String err_str = String("Failed to export loading screen: ") + loading_screen_file; + ERR_PRINT(err_str.utf8().get_data()); + return err; + } + } + memdelete(da); + + return OK; +} + +Error EditorExportPlatformIOS::_walk_dir_recursive(DirAccess *p_da, FileHandler p_handler, void *p_userdata) { + Vector dirs; + String path; + String current_dir = p_da->get_current_dir(); + p_da->list_dir_begin(); + while ((path = p_da->get_next()).length() != 0) { + if (p_da->current_is_dir()) { + if (path != "." && path != "..") { + dirs.push_back(path); + } + } else { + Error err = p_handler(current_dir + "/" + path, p_userdata); + if (err) { + p_da->list_dir_end(); + return err; + } + } + } + p_da->list_dir_end(); + + for (int i = 0; i < dirs.size(); ++i) { + String dir = dirs[i]; + p_da->change_dir(dir); + Error err = _walk_dir_recursive(p_da, p_handler, p_userdata); + p_da->change_dir(".."); + if (err) { + return err; + } + } + + return OK; +} + +struct CodesignData { + const Ref &preset; + bool debug; + + CodesignData(const Ref &p_preset, bool p_debug) + : preset(p_preset), debug(p_debug) { + } +}; + +Error EditorExportPlatformIOS::_codesign(String p_file, void *p_userdata) { + if (p_file.ends_with(".dylib")) { + CodesignData *data = (CodesignData *)p_userdata; + print_line(String("Signing ") + p_file); + List codesign_args; + codesign_args.push_back("-f"); + codesign_args.push_back("-s"); + codesign_args.push_back(data->preset->get(data->debug ? "application/code_sign_identity_debug" : "application/code_sign_identity_release")); + codesign_args.push_back(p_file); + return OS::get_singleton()->execute("/usr/bin/codesign", codesign_args, true); + } + return OK; +} + Error EditorExportPlatformIOS::export_project(const Ref &p_preset, bool p_debug, const String &p_path, int p_flags) { String src_pkg_name; String dest_dir = p_path.get_base_dir() + "/"; String binary_name = p_path.get_file().get_basename(); - EditorProgress ep("export", "Exporting for iOS", 3); + EditorProgress ep("export", "Exporting for iOS", 5); + + String team_id = p_preset->get("application/app_store_team_id"); + ERR_EXPLAIN("App Store Team ID not specified - cannot configure the project."); + ERR_FAIL_COND_V(team_id.length() == 0, ERR_CANT_OPEN); if (p_debug) src_pkg_name = p_preset->get("custom_package/debug"); @@ -206,6 +462,15 @@ Error EditorExportPlatformIOS::export_project(const Ref &p_p bool found_binary = false; int total_size = 0; + Set files_to_parse; + files_to_parse.insert("godot_ios/godot_ios-Info.plist"); + files_to_parse.insert("godot_ios.xcodeproj/project.pbxproj"); + files_to_parse.insert("export_options.plist"); + files_to_parse.insert("godot_ios.xcodeproj/project.xcworkspace/contents.xcworkspacedata"); + files_to_parse.insert("godot_ios.xcodeproj/xcshareddata/xcschemes/godot_ios.xcscheme"); + + print_line("Unzipping..."); + while (ret == UNZ_OK) { bool is_execute = false; @@ -229,12 +494,9 @@ Error EditorExportPlatformIOS::export_project(const Ref &p_p file = file.replace_first("iphone/", ""); - if (file == "godot_ios.xcodeproj/project.pbxproj") { - print_line("parse pbxproj"); - _fix_config_file(p_preset, data, pkg_name, binary_name); - } else if (file == "godot_ios/godot_ios-Info.plist") { - print_line("parse plist"); - _fix_config_file(p_preset, data, pkg_name, binary_name); + if (files_to_parse.has(file)) { + print_line(String("parse ") + file); + _fix_config_file(p_preset, data, pkg_name, binary_name, p_debug); } else if (file.begins_with("godot.iphone")) { if (file != binary_to_use) { ret = unzGoToNextFile(src_pkg_zip); @@ -264,6 +526,7 @@ Error EditorExportPlatformIOS::export_project(const Ref &p_p if (dir_err) { ERR_PRINTS("Can't create '" + dir_name + "'."); unzClose(src_pkg_zip); + memdelete(tmp_app_path); return ERR_CANT_CREATE; } } @@ -273,6 +536,7 @@ Error EditorExportPlatformIOS::export_project(const Ref &p_p if (!f) { ERR_PRINTS("Can't write '" + file + "'."); unzClose(src_pkg_zip); + memdelete(tmp_app_path); return ERR_CANT_CREATE; }; f->store_buffer(data.ptr(), data.size()); @@ -295,26 +559,79 @@ Error EditorExportPlatformIOS::export_project(const Ref &p_p if (!found_binary) { ERR_PRINTS("Requested template binary '" + binary_to_use + "' not found. It might be missing from your template archive."); - unzClose(src_pkg_zip); + memdelete(tmp_app_path); return ERR_FILE_NOT_FOUND; } - ep.step("Making PKG", 1); + String iconset_dir = dest_dir + binary_name + "/Images.xcassets/AppIcon.appiconset/"; + Error err = OK; + if (!tmp_app_path->dir_exists(iconset_dir)) { + Error err = tmp_app_path->make_dir_recursive(iconset_dir); + } + memdelete(tmp_app_path); + if (err) + return err; + + err = _export_icons(p_preset, iconset_dir); + if (err) + return err; + + err = _export_loading_screens(p_preset, dest_dir + binary_name + "/"); + if (err) + return err; + + ep.step("Making .pck", 1); String pack_path = dest_dir + binary_name + ".pck"; - Error err = save_pack(p_preset, pack_path); - - if (err) { + err = save_pack(p_preset, pack_path); + if (err) + return err; + + err = export_project_files(p_preset, _export_dylibs, &dest_dir); + if (err) return err; - } #ifdef OSX_ENABLED - /* and open up xcode with our new project.... */ - List args; - args.push_back(p_path); - err = OS::get_singleton()->execute("/usr/bin/open", args, false); + ep.step("Making .xcarchive", 2); + String archive_path = p_path.get_basename() + ".xcarchive"; + List archive_args; + archive_args.push_back("-project"); + archive_args.push_back(dest_dir + binary_name + ".xcodeproj"); + archive_args.push_back("-scheme"); + archive_args.push_back(binary_name); + archive_args.push_back("-sdk"); + archive_args.push_back("iphoneos"); + archive_args.push_back("-configuration"); + archive_args.push_back(p_debug ? "Debug" : "Release"); + archive_args.push_back("-destination"); + archive_args.push_back("generic/platform=iOS"); + archive_args.push_back("archive"); + archive_args.push_back("-archivePath"); + archive_args.push_back(archive_path); + err = OS::get_singleton()->execute("/usr/bin/xcodebuild", archive_args, true); ERR_FAIL_COND_V(err, err); + ep.step("Code-signing dylibs", 3); + DirAccess *dylibs_dir = DirAccess::open(archive_path + "/Products/Applications/" + binary_name + ".app/dylibs"); + ERR_FAIL_COND_V(!dylibs_dir, ERR_CANT_OPEN); + CodesignData codesign_data(p_preset, p_debug); + err = _walk_dir_recursive(dylibs_dir, _codesign, &codesign_data); + memdelete(dylibs_dir); + ERR_FAIL_COND_V(err, err); + + ep.step("Making .ipa", 4); + List export_args; + export_args.push_back("-exportArchive"); + export_args.push_back("-archivePath"); + export_args.push_back(archive_path); + export_args.push_back("-exportOptionsPlist"); + export_args.push_back(dest_dir + "export_options.plist"); + export_args.push_back("-exportPath"); + export_args.push_back(dest_dir); + err = OS::get_singleton()->execute("/usr/bin/xcodebuild", export_args, true); + ERR_FAIL_COND_V(err, err); +#else + print_line(".ipa can only be built on macOS. Leaving XCode project without building the package."); #endif return OK;