├── .gitignore ├── .vscode ├── launch.json └── settings.json ├── BugSplat.uplugin ├── Config └── FilterPlugin.ini ├── Content ├── Assets │ ├── bug.uasset │ ├── grey_button_pressed.uasset │ ├── grey_button_up.uasset │ └── splats-overlap-gradient-bg-text-dark.uasset ├── Maps │ └── BugSplat_Demo.umap └── UI │ ├── W_BugSplatButton.uasset │ └── W_BugSplatDemo.uasset ├── LICENSE.md ├── README.md ├── Resources ├── Icon128.png ├── bs-unreal-plugin-header.png └── logo.png ├── Source ├── BugSplat │ ├── BugSplat.Build.cs │ ├── Private │ │ ├── BugSplat.cpp │ │ ├── BugSplatCrashReportClient.cpp │ │ ├── BugSplatEditorSettingsCustomization.cpp │ │ └── BugSplatSymbols.cpp │ └── Public │ │ ├── BugSplat.h │ │ ├── BugSplatCrashReportClient.h │ │ ├── BugSplatEditorSettingsCustomization.h │ │ └── BugSplatSymbols.h ├── BugSplatRuntime │ ├── BugSplatRuntime.Build.cs │ ├── BugSplat_Android_UPL.xml │ ├── BugSplat_IOS_UPL.xml │ ├── Private │ │ ├── BugSplatEditorSettings.cpp │ │ ├── BugSplatRuntime.cpp │ │ └── BugSplatUtils.cpp │ └── Public │ │ ├── BugSplatEditorSettings.h │ │ ├── BugSplatRuntime.h │ │ └── BugSplatUtils.h ├── Scripts │ ├── .bugsplat.conf │ ├── post-build-linux.sh │ ├── post-build-mac.sh │ ├── post-build-win64.ps1 │ ├── pre-build-linux.sh │ ├── pre-build-mac.sh │ ├── pre-build-win64.ps1 │ └── upload-symbols-ios.sh └── ThirdParty │ ├── Android │ ├── LICENSE │ └── bugsplat-android-release.aar │ ├── IOS │ ├── BugSplat.embeddedframework.zip │ ├── BugSplat.framework │ │ ├── Bugsplat │ │ ├── Headers │ │ │ ├── BugSplatDelegate.h │ │ │ ├── Bugsplat.h │ │ │ └── BugsplatAttachment.h │ │ ├── Info.plist │ │ ├── Modules │ │ │ └── module.modulemap │ │ ├── PrivacyInfo.xcprivacy │ │ └── _CodeSignature │ │ │ └── CodeResources │ ├── HockeySDK.embeddedframework.zip │ ├── HockeySDK.framework │ │ ├── Headers │ │ │ ├── BITAuthenticator.h │ │ │ ├── BITCrashAttachment.h │ │ │ ├── BITCrashDetails.h │ │ │ ├── BITCrashManager.h │ │ │ ├── BITCrashManagerDelegate.h │ │ │ ├── BITCrashMetaData.h │ │ │ ├── BITFeedbackActivity.h │ │ │ ├── BITFeedbackComposeViewController.h │ │ │ ├── BITFeedbackComposeViewControllerDelegate.h │ │ │ ├── BITFeedbackListViewController.h │ │ │ ├── BITFeedbackManager.h │ │ │ ├── BITFeedbackManagerDelegate.h │ │ │ ├── BITHockeyAttachment.h │ │ │ ├── BITHockeyBaseManager.h │ │ │ ├── BITHockeyBaseViewController.h │ │ │ ├── BITHockeyLogger.h │ │ │ ├── BITHockeyManager.h │ │ │ ├── BITHockeyManagerDelegate.h │ │ │ ├── BITHockeyUserData.h │ │ │ ├── BITMetricsManager.h │ │ │ ├── BITStoreUpdateManager.h │ │ │ ├── BITStoreUpdateManagerDelegate.h │ │ │ ├── BITUpdateManager.h │ │ │ ├── BITUpdateManagerDelegate.h │ │ │ ├── BITUpdateViewController.h │ │ │ ├── HockeySDK.h │ │ │ ├── HockeySDKEnums.h │ │ │ ├── HockeySDKFeatureConfig.h │ │ │ └── HockeySDKNullability.h │ │ ├── HockeySDK │ │ ├── Info.plist │ │ ├── Modules │ │ │ └── module.modulemap │ │ ├── PrivateHeaders │ │ │ ├── BITChannelPrivate.h │ │ │ ├── BITCrashReportTextFormatterPrivate.h │ │ │ ├── BITHockeyLoggerPrivate.h │ │ │ └── BITUpdateManagerPrivate.h │ │ └── _CodeSignature │ │ │ └── CodeResources │ └── LICENSE │ └── SymUploader │ └── LICENSE-MIT └── package.ts /.gitignore: -------------------------------------------------------------------------------- 1 | # Visual Studio 2015 user specific files 2 | .vs/ 3 | 4 | # Compiled Object files 5 | *.slo 6 | *.lo 7 | *.obj 8 | 9 | # Precompiled Headers 10 | *.gch 11 | *.pch 12 | 13 | # Compiled Dynamic libraries 14 | *.dylib 15 | *.dll 16 | 17 | # Fortran module files 18 | *.mod 19 | 20 | # Compiled Static libraries 21 | *.lai 22 | *.la 23 | *.lib 24 | 25 | # Executables 26 | *.exe 27 | *.out 28 | *.app 29 | *.ipa 30 | 31 | # These project files can be generated by the engine 32 | *.xcodeproj 33 | *.xcworkspace 34 | *.sln 35 | *.suo 36 | *.opensdf 37 | *.sdf 38 | *.VC.db 39 | *.VC.opendb 40 | 41 | # Precompiled Assets 42 | SourceArt/**/*.png 43 | SourceArt/**/*.tga 44 | 45 | # Binary Files 46 | Binaries/* 47 | Plugins/*/Binaries/* 48 | 49 | # Builds 50 | Build/* 51 | 52 | # Whitelist PakBlacklist-.txt files 53 | !Build/*/ 54 | Build/*/** 55 | !Build/*/PakBlacklist*.txt 56 | 57 | # Don't ignore icon files in Build 58 | !Build/**/*.ico 59 | 60 | # Built data for maps 61 | *_BuiltData.uasset 62 | 63 | # Configuration files generated by the Editor 64 | Saved/* 65 | 66 | # Compiled source files for the engine to use 67 | Intermediate/* 68 | Plugins/*/Intermediate/* 69 | 70 | # Cache files for the editor to use 71 | DerivedDataCache/* 72 | 73 | # Ignore auto-generated upload script 74 | Source/Scripts/BugSplat.bat 75 | Source/Scripts/upload-symbols-win64.ps1 76 | Source/Scripts/upload-symbols-mac.sh 77 | Source/Scripts/upload-symbols-linux.sh 78 | 79 | # Mac OS 80 | .DS_Store 81 | 82 | # Symbol Upload temp files 83 | Source/Scripts/tmp 84 | Source/ThirdParty/SymUploader -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "request": "launch", 9 | "name": "Package", 10 | "type": "node", 11 | "program": "${workspaceFolder}/package.ts", 12 | "cwd": "${workspaceFolder}", 13 | "runtimeExecutable": "/usr/local/bin/deno", 14 | "runtimeArgs": [ 15 | "run", 16 | "--inspect-wait", 17 | "--allow-all" 18 | ], 19 | "attachSimplePort": 9229 20 | } 21 | ] 22 | } -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "deno.enable": true, 3 | "deno.lint": true, 4 | "deno.unstable": true 5 | } -------------------------------------------------------------------------------- /BugSplat.uplugin: -------------------------------------------------------------------------------- 1 | { 2 | "FileVersion": 3, 3 | "Version": "1.2", 4 | "VersionName": "1.6.4", 5 | "FriendlyName": "BugSplat", 6 | "Description": "BugSplat provides crash reporting for Unreal projects, and gives invaluable insight into the issues tripping up your users.", 7 | "Category": "Code Plugins", 8 | "CreatedBy": "BugSplat", 9 | "CreatedByURL": "https://www.bugsplat.com", 10 | "DocsURL": "https://docs.bugsplat.com/introduction/getting-started/integrations/game-development/unreal-engine#unreal-engine-plugin", 11 | "MarketplaceURL": "com.epicgames.launcher://ue/marketplace/product/f26128f947f5471fa7d24184545b3d09", 12 | "SupportURL": "https://www.bugsplat.com", 13 | "EnabledByDefault": true, 14 | "CanContainContent": true, 15 | "IsBetaVersion": false, 16 | "Installed": false, 17 | "Modules": [ 18 | { 19 | "Name": "BugSplat", 20 | "Type": "Editor", 21 | "LoadingPhase": "Default" 22 | }, 23 | { 24 | "Name": "BugSplatRuntime", 25 | "Type": "Runtime", 26 | "LoadingPhase": "Default", 27 | "WhitelistPlatforms": [ 28 | "Win64", 29 | "Mac", 30 | "Android", 31 | "IOS", 32 | "Linux" 33 | ] 34 | } 35 | ], 36 | "PreBuildSteps": { 37 | "Win64": [ 38 | "powershell -ExecutionPolicy Bypass -File \"$(PluginDir)\\Source\\Scripts\\pre-build-win64.ps1\" $(TargetName) \"$(PluginDir)\"" 39 | ], 40 | "Mac": [ 41 | "sh \"$(PluginDir)/Source/Scripts/pre-build-mac.sh\" $(TargetName) \"$(PluginDir)\"" 42 | ], 43 | "Linux": [ 44 | "sh \"$(PluginDir)/Source/Scripts/pre-build-linux.sh\" $(TargetName) \"$(PluginDir)\"" 45 | ] 46 | }, 47 | "PostBuildSteps": { 48 | "Win64": [ 49 | "powershell -ExecutionPolicy Bypass -File \"$(PluginDir)\\Source\\Scripts\\post-build-win64.ps1\" $(TargetPlatform) $(TargetName) \"$(ProjectDir)\" \"$(PluginDir)\"" 50 | ], 51 | "Mac": [ 52 | "sh \"$(PluginDir)/Source/Scripts/post-build-mac.sh\" $(TargetPlatform) $(TargetName) \"$(ProjectDir)\" \"$(PluginDir)\"" 53 | ], 54 | "Linux": [ 55 | "sh \"$(PluginDir)/Source/Scripts/post-build-linux.sh\" $(TargetPlatform) $(TargetName) \"$(ProjectDir)\" \"$(PluginDir)\"" 56 | ] 57 | } 58 | } -------------------------------------------------------------------------------- /Config/FilterPlugin.ini: -------------------------------------------------------------------------------- 1 | [FilterPlugin] 2 | ; This section lists additional files which will be packaged along with your plugin. Paths should be listed relative to the root plugin directory, and 3 | ; may include "...", "*", and "?" wildcards to match directories, files, and individual characters respectively. 4 | ; 5 | ; Examples: 6 | ; /README.txt 7 | ; /Extras/... 8 | ; /Binaries/ThirdParty/*.dll 9 | /README.md 10 | -------------------------------------------------------------------------------- /Content/Assets/bug.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BugSplat-Git/bugsplat-unreal/47e80d46f96f92f7b271c952f6ea1e2f4843cea6/Content/Assets/bug.uasset -------------------------------------------------------------------------------- /Content/Assets/grey_button_pressed.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BugSplat-Git/bugsplat-unreal/47e80d46f96f92f7b271c952f6ea1e2f4843cea6/Content/Assets/grey_button_pressed.uasset -------------------------------------------------------------------------------- /Content/Assets/grey_button_up.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BugSplat-Git/bugsplat-unreal/47e80d46f96f92f7b271c952f6ea1e2f4843cea6/Content/Assets/grey_button_up.uasset -------------------------------------------------------------------------------- /Content/Assets/splats-overlap-gradient-bg-text-dark.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BugSplat-Git/bugsplat-unreal/47e80d46f96f92f7b271c952f6ea1e2f4843cea6/Content/Assets/splats-overlap-gradient-bg-text-dark.uasset -------------------------------------------------------------------------------- /Content/Maps/BugSplat_Demo.umap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BugSplat-Git/bugsplat-unreal/47e80d46f96f92f7b271c952f6ea1e2f4843cea6/Content/Maps/BugSplat_Demo.umap -------------------------------------------------------------------------------- /Content/UI/W_BugSplatButton.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BugSplat-Git/bugsplat-unreal/47e80d46f96f92f7b271c952f6ea1e2f4843cea6/Content/UI/W_BugSplatButton.uasset -------------------------------------------------------------------------------- /Content/UI/W_BugSplatDemo.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BugSplat-Git/bugsplat-unreal/47e80d46f96f92f7b271c952f6ea1e2f4843cea6/Content/UI/W_BugSplatDemo.uasset -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) BugSplat - All rights reserved 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![bugsplat-github-banner-basic-outline](https://user-images.githubusercontent.com/20464226/149019306-3186103c-5315-4dad-a499-4fd1df408475.png)](https://bugsplat.com) 2 |
3 | #
BugSplat
4 | ### **
Crash and error reporting built for busy developers.
** 5 |
6 | 7 | Follow @bugsplatco on Twitter 8 | 9 | 10 | Join BugSplat on Discord 11 | 12 |
13 |
14 | 15 | ## 👋 Introduction 16 | 17 | BugSplat's Unreal Editor plugin makes adding crash reporting to your game a breeze! With [BugSplat](https://bugsplat.com), you'll get a crash notification containing a full call stack with function names, line numbers, as well as many other invaluable insights into the issues tripping up your users. 18 | 19 | Before diving into the plugin, please complete the following tasks: 20 | 21 | * [Sign Up](https://app.bugsplat.com/v2/sign-up) as a new BugSplat user 22 | * Complete the [Welcome](https://app.bugsplat.com/v2/welcome) workflow and make a note of your BugSplat database 23 | * Review our [MyUnrealCrasher](https://github.com/BugSplat-Git/my-unreal-crasher) sample application to jump-start your evaluation of BugSplat 24 | 25 | ## 🏗 Installation 26 | 27 | You may choose to add BugSplat through the Unreal Marketplace or add the plugin to your Unreal project manually. 28 | 29 | ### Install from Marketplace 30 | 31 | [Install BugSplat from the Unreal Marketplace](https://www.unrealengine.com/marketplace/en-US/product/bugsplat) 32 | 33 | ### Install Manually 34 | 35 | 1. Navigate to your project folder containing your `[ProjectName].uproject` file. 36 | 2. Create a `Plugins` folder if it does not already exist. 37 | 3. Create a `BugSplat` folder in the `Plugins` folder and copy the contents of this repo into the `BugSplat` folder. 38 | 4. In the Unreal Editor, ensure you can access the BugSplat plugin via `Edit > Project Settings` and scroll to the `BugSplat` section under `Plugins`. 39 | 40 | ## ⚙️ Configuration 41 | 42 | BugSplat's Unreal plugin currently supports adding crash reporting to Windows, macOS, Linux, Android, and iOS games. With a few clicks, the BugSplat plugin can be configured to automatically upload symbol files so crash report stack traces display function names and line numbers. 43 | 44 | To get started, generate a Client ID and Client Secret via the [Integrations](https://app.bugsplat.com/v2/settings/database/integrations) page. 45 | 46 | Next, open the BugSplat plugin menu in the Unreal Editor via `Edit > Project Settings`. Scroll to the `BugSplat` section of `Project Settings` and add values for `Database`, `Application`, `Version`, `Client ID`, and `Client Secret`: 47 | 48 | BugSplat Unreal Plugin Settings 49 | 50 | ### Windows, macOS, and Linux 51 | 52 | BugSplat leverages Unreal's `CrashReportClient` to provide crash reporting for Windows, macOS, and Linux games. Be sure to update your project settings and enable `Include Crash Reporter` and `Include Debug Files in Shipping Builds`: 53 | 54 | BugSplat Unreal Project Settings 55 | 56 | To configure `CrashReportClient` to post to BugSplat, the `DataRouterUrl` value needs to be added to `DefaultEngine.ini`. The `bugsplat-unreal` plugin automatically updates the value for `DataRouterUrl` when the `Update Engine DefaultEngine.ini` option is enabled. Please note the `DataRouterUrl` value is global and is shared across all packaged builds created by the affected engine. To override the `DataRouterUrl` value a package build uses, you may optionally use the `Update Packaged Game INI` button under the `Tools` section. 57 | 58 | In order to get function names and line numbers in crash reports, you'll need to upload your game's `.exe`, `.dll`, and `.pdb` files. To upload debug symbols for reach build, ensure that the `Enable Automatic Symbol Uploads` option is selected. When selected, a script to execute [symbol-upload](https://github.com/BugSplat-Git/symbol-upload) will be added to the `PostBuildSteps` field in `BugSplat.uplugin`. The symbol upload script will run automatically when your game is built. 59 | 60 | #### macOS 61 | 62 | To create a `.dSYM` file for a macOS build invoke `RunUAT.command` with the `-EnableDSym` flag per the example below: 63 | 64 | ```sh 65 | ../../../Engine/Build/BatchFiles/Mac/Build.sh -Project="../../my-unreal-crasher/MyUnrealCrasher.uproject" MyUnrealCrasher Mac Development -NoEditor -EnableDSym -TargetPath="~/Desktop/UnrealEngine" 66 | ``` 67 | 68 | 69 | ### iOS and Android 70 | 71 | Before attempting to use the BugSplat plugin to capture crashes on Mobile, please ensure you've completed the [iOS](https://docs.unrealengine.com/5.0/en-US/setting-up-an-unreal-engine-project-for-ios/) and [Android](https://docs.unrealengine.com/5.0/en-US/android-support-for-unreal-engine/) quickstart guides. 72 | 73 | In order to get function names and line numbers in your iOS crash reports, please make the following changes in the `iOS` section of `Project Settings`. 74 | 75 | | Option | Value | 76 | |--------|-------| 77 | | Generate dSYMs for code debugging and profiling| true | 78 | | Generate dSYMs as a bundle for third-party crash tools | true | 79 | | Support bitcode in shipping | false | 80 | 81 | To enable crash reporting, ensure the `Enable iOS Crash Reporting` and `Enable Android Crash Reporting` options are selected. Also ensure that `Enable Automatic Symbol Uploads` is checked so that your crash reports contain function names and line numbers. 82 | 83 | Note that sometimes iOS applications won't crash while the USB cable is connected. If this happens, disconnect the USB cable and re-run the application to trigger a crash. 84 | 85 | > [!NOTE] 86 | > The Unreal iOS project's build process includes a `Build Phase called Generate dSYM for archive, and strip`, which executes after the Unreal PostBuildSteps. However, this Build Phase must complete before the `dSYM` file (debug symbols) is generated. Due to this timing, BugSplat cannot upload the `dSYM` immediately during the initial build. Instead, BugSplat will upload the `dSYM` during the next incremental build in Xcode. Alternatively, you can follow the [example](https://github.com/BugSplat-Git/bugsplat-apple/blob/main/Symbol_Upload_Examples/Build-Phase-symbol-upload.sh) in our bugsplat-apple repo to configure your a custom Build Phase for symbol uploads. 87 | 88 | 89 | ### Xbox and PlayStation 90 | 91 | BugSplat can provide instructions for implementing Unreal crash reporting on Xbox and PlayStation. Please email us at [support@bugsplat.com](mailto:support@bugsplat.com) for more info. 92 | 93 | ## 🏃 Usage 94 | 95 | Once you've installed the plugin, add the following C++ snippet to your game to generate a sample crash. 96 | 97 | ```cpp 98 | UE_LOG(LogTemp, Fatal, TEXT("BugSplat!")); 99 | ``` 100 | 101 | Run your application and submit a crash report. 102 | 103 | On Desktops, submit a crash report via the Unreal CrashReportClient dialog that appears at crash time. We have developed a handy guide on how you can customize the Unreal CrashReportClient dialog that is available [here](https://www.bugsplat.com/blog/game-dev/customizing-unreal-engine-crash-dialog/). 104 | 105 | On iOS, after a crash occurs, restart the game and tap the `Send Report` option when prompted. On Android, crashes are submitted automatically at crash time. 106 | 107 | Once you've submitted a crash report, navigate to the [Crashes](https://app.bugsplat.com/v2/crashes) page. On the Crashes page, click the link in the ID column. 108 | 109 | If everything is configured correctly, you should see something that resembles the following: 110 | 111 | BugSplat Crash Page 112 | 113 | ## 🧑‍💻 Contributing 114 | 115 | BugSplat ❤️s open source! If you feel that this package can be improved, please open an [Issue](https://github.com/BugSplat-Git/bugsplat-unreal/issues). If you have an awesome new feature you'd like to implement, we'd love to merge your [Pull Request](https://github.com/BugSplat-Git/bugsplat-unreal/pulls). You can also send us an [email](mailto:support@bugsplat.com), join us on [Discord](https://discord.gg/K4KjjRV5ve), or message us via the in-app chat on [bugsplat.com](https://bugsplat.com). 116 | -------------------------------------------------------------------------------- /Resources/Icon128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BugSplat-Git/bugsplat-unreal/47e80d46f96f92f7b271c952f6ea1e2f4843cea6/Resources/Icon128.png -------------------------------------------------------------------------------- /Resources/bs-unreal-plugin-header.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BugSplat-Git/bugsplat-unreal/47e80d46f96f92f7b271c952f6ea1e2f4843cea6/Resources/bs-unreal-plugin-header.png -------------------------------------------------------------------------------- /Resources/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BugSplat-Git/bugsplat-unreal/47e80d46f96f92f7b271c952f6ea1e2f4843cea6/Resources/logo.png -------------------------------------------------------------------------------- /Source/BugSplat/BugSplat.Build.cs: -------------------------------------------------------------------------------- 1 | // Copyright 2023 BugSplat. All Rights Reserved. 2 | 3 | using UnrealBuildTool; 4 | 5 | public class BugSplat : ModuleRules 6 | { 7 | public BugSplat(ReadOnlyTargetRules Target) : base(Target) 8 | { 9 | PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs; 10 | 11 | PublicIncludePaths.AddRange( 12 | new string[] { 13 | // ... add public include paths required here ... 14 | } 15 | ); 16 | 17 | 18 | PrivateIncludePaths.AddRange( 19 | new string[] { 20 | // ... add other private include paths required here ... 21 | } 22 | ); 23 | 24 | 25 | PublicDependencyModuleNames.AddRange( 26 | new string[] 27 | { 28 | "Core", 29 | "Json", 30 | "JsonUtilities" 31 | // ... add other public dependencies that you statically link with here ... 32 | } 33 | ); 34 | 35 | 36 | PrivateDependencyModuleNames.AddRange( 37 | new string[] 38 | { 39 | "Projects", 40 | "InputCore", 41 | "UnrealEd", 42 | "ToolMenus", 43 | "CoreUObject", 44 | "Engine", 45 | "Slate", 46 | "SlateCore", 47 | "BugSplatRuntime", 48 | // ... add private dependencies that you statically link with here ... 49 | } 50 | ); 51 | 52 | 53 | DynamicallyLoadedModuleNames.AddRange( 54 | new string[] 55 | { 56 | // ... add any modules that your module loads dynamically here ... 57 | } 58 | ); 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /Source/BugSplat/Private/BugSplat.cpp: -------------------------------------------------------------------------------- 1 | // Copyright 2023 BugSplat. All Rights Reserved. 2 | 3 | #include "BugSplat.h" 4 | #include "BugSplatCrashReportClient.h" 5 | #include "BugSplatEditorSettingsCustomization.h" 6 | #include "LevelEditor.h" 7 | #include "Widgets/Docking/SDockTab.h" 8 | #include "Widgets/Layout/SBox.h" 9 | #include "Widgets/Text/SRichTextBlock.h" 10 | #include "Widgets/Text/STextBlock.h" 11 | #include "ToolMenus.h" 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include "BugSplatRuntime.h" 17 | #include "Modules/ModuleManager.h" 18 | #include "PropertyEditorModule.h" 19 | 20 | static const FName BugSplatTabName("BugSplat"); 21 | 22 | #define LOCTEXT_NAMESPACE "FBugSplatModule" 23 | 24 | static void OnBrowserLinkClicked(const FSlateHyperlinkRun::FMetadata& Metadata) 25 | { 26 | const FString* UrlPtr = Metadata.Find(TEXT("href")); 27 | if (UrlPtr) 28 | { 29 | FPlatformProcess::LaunchURL(**UrlPtr, nullptr, nullptr); 30 | } 31 | } 32 | 33 | void FBugSplatModule::StartupModule() 34 | { 35 | // This code will execute after your module is loaded into memory; the exact timing is specified in the .uplugin file per-module 36 | 37 | auto& PropertyModule = FModuleManager::LoadModuleChecked("PropertyEditor"); 38 | PropertyModule.RegisterCustomClassLayout( 39 | "BugSplatEditorSettings", 40 | FOnGetDetailCustomizationInstance::CreateStatic(&FBugSplatEditorSettingsCustomization::MakeInstance)); 41 | 42 | PropertyModule.NotifyCustomizationModuleChanged(); 43 | } 44 | 45 | void FBugSplatModule::ShutdownModule() 46 | { 47 | delete BugSplatCrashReportClient; 48 | delete BugSplatSymbols; 49 | 50 | if (FModuleManager::Get().IsModuleLoaded("PropertyEditor")) 51 | { 52 | auto& PropertyModule = FModuleManager::LoadModuleChecked("PropertyEditor"); 53 | PropertyModule.UnregisterCustomClassLayout("BugSplatEditorSettings"); 54 | } 55 | } 56 | 57 | FBugSplatModule& FBugSplatModule::Get() 58 | { 59 | return FModuleManager::LoadModuleChecked("BugSplat"); 60 | } 61 | 62 | void FBugSplatModule::OnUpdateBugSplatSettings() 63 | { 64 | BugSplatCrashReportClient->UpdateEngineSettings(); 65 | BugSplatSymbols->UpdateSymbolUploadsSettings(); 66 | } 67 | 68 | FReply FBugSplatModule::OnUpdateLocalIni() 69 | { 70 | BugSplatCrashReportClient->UpdatePackagedBuildSettings(); 71 | return FReply::Handled(); 72 | } 73 | 74 | #undef LOCTEXT_NAMESPACE 75 | 76 | IMPLEMENT_MODULE(FBugSplatModule, BugSplat) 77 | -------------------------------------------------------------------------------- /Source/BugSplat/Private/BugSplatCrashReportClient.cpp: -------------------------------------------------------------------------------- 1 | // Copyright 2023 BugSplat. All Rights Reserved. 2 | 3 | #include "BugSplatCrashReportClient.h" 4 | #include 5 | #include 6 | #include 7 | 8 | #include "BugSplatEditorSettings.h" 9 | #include "BugSplatRuntime.h" 10 | 11 | FBugSplatCrashReportClient::FBugSplatCrashReportClient() 12 | { 13 | 14 | } 15 | 16 | FString FBugSplatCrashReportClient::CreateBugSplatEndpointUrl(FString Database, FString App, FString Version) 17 | { 18 | FStringFormatOrderedArguments args; 19 | 20 | FString Space = " "; 21 | FString EncodedSpace = "%20"; 22 | args.Add(Database); 23 | args.Add(App.Replace(*Space, *EncodedSpace)); 24 | args.Add(Version.Replace(*Space, *EncodedSpace)); 25 | 26 | return *FString::Format(*BUGSPLAT_ENDPOINT_URL_FORMAT, args); 27 | } 28 | 29 | void FBugSplatCrashReportClient::UpdateCrashReportClientIni(FString Database, FString App, FString Version, FString DefaultEngineIniFilePath) 30 | { 31 | if (!FPaths::FileExists(DefaultEngineIniFilePath)) 32 | { 33 | FMessageDialog::Debugf(FText::FromString("Could not find DefaultEngine.ini!")); 34 | return; 35 | } 36 | 37 | FConfigCacheIni ini(EConfigCacheType::DiskBacked); 38 | 39 | ini.LoadFile(DefaultEngineIniFilePath); 40 | 41 | FString SectionTag = FString(TEXT("CrashReportClient")); 42 | 43 | FString DataRouterUrlConfigTag = FString(TEXT("DataRouterUrl")); 44 | FString DataRouterUrlValue = CreateBugSplatEndpointUrl(Database, App, Version); 45 | 46 | FString CrashReportClientVersionConfigTag = FString(TEXT("CrashReportClientVersion")); 47 | FString CrashReportClientVersionValue = FString(TEXT("1.0")); 48 | 49 | ini.SetString(*SectionTag, *DataRouterUrlConfigTag, *DataRouterUrlValue, DefaultEngineIniFilePath); 50 | ini.SetString(*SectionTag, *CrashReportClientVersionConfigTag, *CrashReportClientVersionValue, DefaultEngineIniFilePath); 51 | } 52 | 53 | void FBugSplatCrashReportClient::UpdateEngineSettings() 54 | { 55 | UBugSplatEditorSettings* RuntimeSettings = FBugSplatRuntimeModule::Get().GetSettings(); 56 | 57 | if (!RuntimeSettings->HasValidCrashReporterSettings()) 58 | { 59 | return; 60 | } 61 | 62 | if (!RuntimeSettings->bUpdateEngineDataRouterUrl) 63 | { 64 | return; 65 | } 66 | 67 | UpdateCrashReportClientIni( 68 | RuntimeSettings->BugSplatDatabase, 69 | RuntimeSettings->BugSplatApp, 70 | RuntimeSettings->BugSplatVersion, 71 | *GLOBAL_CRASH_REPORT_CLIENT_CONFIG_PATH 72 | ); 73 | } 74 | 75 | void FBugSplatCrashReportClient::UpdatePackagedBuildSettings() 76 | { 77 | FString PackagedBuildFolderPath; 78 | 79 | if (!FDesktopPlatformModule::Get()->OpenDirectoryDialog( 80 | FSlateApplication::Get().FindBestParentWindowHandleForDialogs(nullptr), 81 | FString("Packaged Directory"), 82 | FPaths::GetProjectFilePath(), 83 | PackagedBuildFolderPath)) 84 | { 85 | return; 86 | } 87 | 88 | UBugSplatEditorSettings* RuntimeSettings = FBugSplatRuntimeModule::Get().GetSettings(); 89 | 90 | if (!RuntimeSettings->HasValidCrashReporterSettings()) 91 | { 92 | FMessageDialog::Debugf(FText::FromString("Invalid settings, update plugin fields and try again.")); 93 | return; 94 | } 95 | 96 | FString Platforms[] = { 97 | TEXT("Windows"), 98 | TEXT("Linux"), 99 | TEXT("Mac") 100 | }; 101 | bool FoundAnyValidFolders = false; 102 | 103 | for (auto &Platform : Platforms) 104 | { 105 | FString PlatformTarget = GetPackagedBuildPlatformTarget(Platform); 106 | FString PlatformTargetPath = *FPaths::Combine(PackagedBuildFolderPath, PlatformTarget); 107 | 108 | if (!FPaths::DirectoryExists(PlatformTargetPath)) 109 | { 110 | continue; 111 | } 112 | 113 | FoundAnyValidFolders = true; 114 | FString DefaultEngineIniRelativePath = GetPackagedBuildDefaultEngineIniRelativePath(); 115 | FString DefaultEngineIniFolderPath = *FPaths::Combine(PackagedBuildFolderPath, *PlatformTarget, *DefaultEngineIniRelativePath); 116 | FString DefaultEngineIniFilePath = *FPaths::Combine(*DefaultEngineIniFolderPath, *INI_FILE_NAME); 117 | 118 | if (!FPaths::DirectoryExists(DefaultEngineIniFolderPath)) 119 | { 120 | IPlatformFile &PlatformFile = FPlatformFileManager::Get().GetPlatformFile(); 121 | PlatformFile.CreateDirectoryTree(*DefaultEngineIniFolderPath); 122 | 123 | if (!FPaths::DirectoryExists(DefaultEngineIniFolderPath)) 124 | { 125 | FMessageDialog::Debugf(FText::FromString("Failed to create " + DefaultEngineIniFolderPath)); 126 | return; 127 | } 128 | 129 | CreateEmptyTextFile(DefaultEngineIniFilePath); 130 | 131 | if (!FPaths::FileExists(DefaultEngineIniFilePath)) 132 | { 133 | FMessageDialog::Debugf(FText::FromString("Failed to create " + DefaultEngineIniFilePath)); 134 | return; 135 | } 136 | } 137 | 138 | UpdateCrashReportClientIni( 139 | RuntimeSettings->BugSplatDatabase, 140 | RuntimeSettings->BugSplatApp, 141 | RuntimeSettings->BugSplatVersion, 142 | DefaultEngineIniFilePath 143 | ); 144 | } 145 | 146 | if (!FoundAnyValidFolders) 147 | { 148 | FMessageDialog::Debugf(FText::FromString("Could not find any packaged build directories to update. Please specify the root directory of a valid packaged build.")); 149 | return; 150 | } 151 | 152 | FMessageDialog::Debugf(FText::FromString("Packaged build settings updated successfully!")); 153 | } 154 | 155 | void FBugSplatCrashReportClient::CreateEmptyTextFile(FString FullPath) 156 | { 157 | FString Empty = FString(""); 158 | FFileHelper::SaveStringToFile(Empty, *FullPath); 159 | } 160 | 161 | FString FBugSplatCrashReportClient::GetPackagedBuildPlatformTarget(FString Platform) 162 | { 163 | return ENGINE_MAJOR_VERSION >= 5 ? Platform : Platform + TEXT("NoEditor"); 164 | } 165 | 166 | FString FBugSplatCrashReportClient::GetPackagedBuildDefaultEngineIniRelativePath() 167 | { 168 | if (ENGINE_MAJOR_VERSION == 5) 169 | { 170 | return PACKAGED_BUILD_CONFIG_PATH_5; 171 | } 172 | else if (ENGINE_MAJOR_VERSION == 4 && ENGINE_MINOR_VERSION >= 26) 173 | { 174 | return PACKAGED_BUILD_CONFIG_PATH_4_26_TO_5; 175 | } 176 | 177 | return PACKAGED_BUILD_CONFIG_PATH_4_25_AND_OLDER; 178 | } 179 | -------------------------------------------------------------------------------- /Source/BugSplat/Private/BugSplatEditorSettingsCustomization.cpp: -------------------------------------------------------------------------------- 1 | // Copyright 2023 BugSplat. All Rights Reserved. 2 | 3 | #include "BugSplatEditorSettingsCustomization.h" 4 | #include "BugSplat.h" 5 | 6 | #include "DetailCategoryBuilder.h" 7 | #include "DetailLayoutBuilder.h" 8 | #include "DetailWidgetRow.h" 9 | 10 | #include "Widgets/Input/SButton.h" 11 | #include "Widgets/Text/SRichTextBlock.h" 12 | 13 | static void OnDocumentationLinkClicked(const FSlateHyperlinkRun::FMetadata& Metadata) 14 | { 15 | const FString* UrlPtr = Metadata.Find(TEXT("href")); 16 | if (UrlPtr) 17 | { 18 | FPlatformProcess::LaunchURL(**UrlPtr, nullptr, nullptr); 19 | } 20 | } 21 | 22 | TSharedRef FBugSplatEditorSettingsCustomization::MakeInstance() 23 | { 24 | return MakeShareable(new FBugSplatEditorSettingsCustomization); 25 | } 26 | 27 | void FBugSplatEditorSettingsCustomization::CustomizeDetails(IDetailLayoutBuilder& DetailBuilder) 28 | { 29 | IDetailCategoryBuilder& AboutCategory = DetailBuilder.EditCategory(TEXT("About")); 30 | IDetailCategoryBuilder& ToolsCategory = DetailBuilder.EditCategory(TEXT("Tools")); 31 | 32 | FSimpleDelegate UpdateBugSplatSettings = FSimpleDelegate::CreateRaw(&FBugSplatModule::Get(), &FBugSplatModule::OnUpdateBugSplatSettings); 33 | DetailBuilder.GetProperty("BugSplatDatabase").Get().SetOnPropertyValueChanged(UpdateBugSplatSettings); 34 | DetailBuilder.GetProperty("BugSplatApp").Get().SetOnPropertyValueChanged(UpdateBugSplatSettings); 35 | DetailBuilder.GetProperty("BugSplatVersion").Get().SetOnPropertyValueChanged(UpdateBugSplatSettings); 36 | DetailBuilder.GetProperty("BugSplatClientId").Get().SetOnPropertyValueChanged(UpdateBugSplatSettings); 37 | DetailBuilder.GetProperty("BugSplatSecret").Get().SetOnPropertyValueChanged(UpdateBugSplatSettings); 38 | DetailBuilder.GetProperty("bUploadDebugSymbols").Get().SetOnPropertyValueChanged(UpdateBugSplatSettings); 39 | 40 | AboutCategory.AddCustomRow(FText::FromString(TEXT("About")), false) 41 | .WholeRowWidget 42 | [ 43 | SNew(SVerticalBox) 44 | + SVerticalBox::Slot() 45 | .VAlign(VAlign_Top) 46 | .Padding(FMargin(0, 10, 0, 10)) 47 | .AutoHeight() 48 | [ 49 | SNew(STextBlock) 50 | .AutoWrapText(true) 51 | .Text(FText::FromString("This plugin enables uploading of crash reports and debug symbols to BugSplat for Desktop and Mobile platforms.\n\nTo configure crash reporting and symbol uploads, start by filling in the Database, Application, Version, Client ID, and Client Secret fields below. When \"Update Engine DataRouterUrl\" is enabled BugSplat will automatically update DataRouterUrl to point CrashReportClient uploads to BugSplat for Desktop crash reporting. Ensure \"Enable automatic symbol uploads\" is enabled or upload symbols yourself to ensure that crash reports contain function name and line number information.\n\nTo add crash reporting for Android and iOS games, simply click the appropriate checkboxes below.\n\nPlease note!\n\nEnabling \"Update Engine DataRouterUrl\" will change the engine's DefaultEngine.ini file. This is a global change that will affect all projects that are built with this instance of the engine. If you don't want to update the engine's configuration file you can use the \"Update Packaged Game INI\" to configure the crash reporter after your build has completed.")) 52 | ] 53 | + SVerticalBox::Slot() 54 | .VAlign(VAlign_Top) 55 | .Padding(FMargin(0, 10, 0, 10)) 56 | [ 57 | SNew(SRichTextBlock) 58 | .Text(FText::FromString(TEXT("View BugSplat's Unreal Engine Docs->"))) 59 | .AutoWrapText(true) 60 | .DecoratorStyleSet(&FCoreStyle::Get()) 61 | + SRichTextBlock::HyperlinkDecorator(TEXT("browser"), FSlateHyperlinkRun::FOnClick::CreateStatic(&OnDocumentationLinkClicked)) 62 | ] 63 | ]; 64 | 65 | ToolsCategory.AddCustomRow(FText::FromString(TEXT("Tools")), false) 66 | .WholeRowWidget 67 | [ 68 | SNew(SVerticalBox) 69 | + SVerticalBox::Slot() 70 | .VAlign(VAlign_Top) 71 | .Padding(FMargin(0, 10, 0, 10)) 72 | .AutoHeight() 73 | [ 74 | SNew(STextBlock) 75 | .AutoWrapText(true) 76 | .Text(FText::FromString("The following buttons are provided for convenience and clicking them is not required.")) 77 | ] 78 | + SVerticalBox::Slot() 79 | .Padding(FMargin(0, 10, 5, 10)) 80 | .AutoHeight() 81 | [ 82 | SNew(SHorizontalBox) 83 | + SHorizontalBox::Slot() 84 | .AutoWidth() 85 | .Padding(FMargin(0, 0, 5, 0)) 86 | [ 87 | SNew(SButton) 88 | .HAlign(HAlign_Center) 89 | .VAlign(VAlign_Center) 90 | .ContentPadding(FMargin(8, 2)) 91 | .OnClicked_Raw(&FBugSplatModule::Get(), &FBugSplatModule::OnUpdateLocalIni) 92 | .Text(FText::FromString("Update Packaged Game INI")) 93 | .ToolTipText(FText::FromString("Useful if you have disabled \"Update Engine DataRouterUrl\" or would like to overwrite the configuration of a packaged game manually.")) 94 | ] 95 | ] 96 | ]; 97 | } 98 | 99 | 100 | -------------------------------------------------------------------------------- /Source/BugSplat/Private/BugSplatSymbols.cpp: -------------------------------------------------------------------------------- 1 | // Copyright 2023 BugSplat. All Rights Reserved. 2 | 3 | #include "BugSplatSymbols.h" 4 | #include 5 | #include 6 | #include 7 | 8 | #include "BugSplatEditorSettings.h" 9 | #include "BugSplatRuntime.h" 10 | 11 | FBugSplatSymbols::FBugSplatSymbols() 12 | { 13 | 14 | } 15 | 16 | 17 | // TODO BG Linux uploads 18 | 19 | void FBugSplatSymbols::UpdateSymbolUploadsSettings() 20 | { 21 | FString SymbolUploadScript = TEXT("echo \"BugSplat [INFO]: Symbol uploads not configured, skipping...\""); 22 | 23 | UBugSplatEditorSettings* RuntimeSettings = FBugSplatRuntimeModule::Get().GetSettings(); 24 | 25 | if (RuntimeSettings->HasValidSymbolUploadSettings() && RuntimeSettings->bUploadDebugSymbols) 26 | { 27 | SymbolUploadScript = CreateSymbolUploadScript( 28 | RuntimeSettings->BugSplatDatabase, 29 | RuntimeSettings->BugSplatApp, 30 | RuntimeSettings->BugSplatVersion, 31 | RuntimeSettings->BugSplatClientId, 32 | RuntimeSettings->BugSplatClientSecret 33 | ); 34 | } 35 | 36 | WriteSymbolUploadScript(SymbolUploadScript); 37 | } 38 | 39 | FString FBugSplatSymbols::CreateSymbolUploadScript(FString Database, FString App, FString Version, FString ClientId, FString ClientSecret) 40 | { 41 | #if PLATFORM_WINDOWS 42 | FString SetCurrentPlatfrom = TEXT("$targetPlatform = $args[0]\n$targetName = $args[1]\n"); 43 | FString TargetPlatformNullGuard = TEXT("if (-not $targetPlatform) {\n Write-Host 'BugSplat [ERROR]: Symbol upload invocation missing target platform...'\n exit 1\n}\n"); 44 | FString EditorPlatformGuard = TEXT("$isWindowsTarget = $false\nif ($targetPlatform -eq 'Win64' -or $targetPlatform -eq 'XSX' -or $targetPlatform -eq 'XB1') {\n $isWindowsTarget = $true\n}\nif (-not $isWindowsTarget) {\n Write-Host 'BugSplat [INFO]: Non-Windows build detected, skipping Windows symbol uploads...'\n exit 0\n}\n"); 45 | 46 | FString PostBuildStepsConsoleCommandFormat = 47 | FString( 48 | "{0}\n" // Set Platform 49 | "{1}\n" // Target Platform Null Guard 50 | "{2}\n" // Editor Platform Guard 51 | "& \"{3}\" " // Uploader Path 52 | "-i {4} " // Client ID 53 | "-s {5} " // Client Secret 54 | "-b {6} " // Database 55 | "-a \"{7}\" " // Application 56 | "-v \"{8}\" " // Version 57 | "-d \"{9}/$targetPlatform\" " // Output Directory 58 | "-f \"{10}\" " // File Pattern 59 | ); 60 | 61 | FStringFormatOrderedArguments args; 62 | args.Add(SetCurrentPlatfrom); 63 | args.Add(TargetPlatformNullGuard); 64 | args.Add(EditorPlatformGuard); 65 | args.Add(BUGSPLAT_SYMBOL_UPLOADER_PATH); 66 | args.Add(ClientId); 67 | args.Add(ClientSecret); 68 | args.Add(Database); 69 | args.Add(App); 70 | args.Add(Version); 71 | args.Add(FPaths::Combine(FPaths::ConvertRelativePathToFull(FPaths::ProjectDir()), FString("Binaries"))); 72 | args.Add(FString("**/*.{pdb,dll,exe}")); 73 | 74 | return FString::Format(*PostBuildStepsConsoleCommandFormat, args); 75 | #elif PLATFORM_MAC 76 | FString TargetPlatformCheck = TEXT("if [ -z \"$1\" ]; then\n echo \"BugSplat [ERROR]: Symbol upload invocation missing target platform...\"\n exit 1\nfi\n"); 77 | FString PlatformGuard = TEXT("if [ \"$1\" != \"Mac\" ]; then\n echo \"BugSplat [INFO]: Non-Mac build detected, skipping Mac symbol uploads...\"\n exit 0\nfi\n"); 78 | 79 | FString PostBuildStepsConsoleCommandFormat = 80 | FString( 81 | "#!/bin/bash\n" 82 | "{0}\n" // Target Platform Check 83 | "{1}\n" // Platform Guard 84 | "\"{2}\" " // Uploader Path 85 | "-i {3} " // Client ID 86 | "-s {4} " // Client Secret 87 | "-b {5} " // Database 88 | "-a \"{6}\" " // Application 89 | "-v \"{7}\" " // Version 90 | "-d \"{8}/$1\" " // Output Directory 91 | "-f \"{9}\" " // File Pattern 92 | ); 93 | 94 | FStringFormatOrderedArguments args; 95 | args.Add(TargetPlatformCheck); 96 | args.Add(PlatformGuard); 97 | args.Add(BUGSPLAT_SYMBOL_UPLOADER_PATH); 98 | args.Add(ClientId); 99 | args.Add(ClientSecret); 100 | args.Add(Database); 101 | args.Add(App); 102 | args.Add(Version); 103 | args.Add(FPaths::Combine(FPaths::ConvertRelativePathToFull(FPaths::ProjectDir()), FString("Binaries"))); 104 | args.Add(FString("**/*.{app,dSYM}")); 105 | 106 | return FString::Format(*PostBuildStepsConsoleCommandFormat, args); 107 | #elif PLATFORM_LINUX 108 | FString TargetPlatformCheck = TEXT("if [ -z \"$1\" ]; then\n echo \"BugSplat [ERROR]: Symbol upload invocation missing target platform...\"\n exit 1\nfi\n"); 109 | FString PlatformGuard = TEXT("if [ \"$1\" != \"Linux\" ]; then\n echo \"BugSplat [INFO]: Non-Linux build detected, skipping Linux symbol uploads...\"\n exit 0\nfi\n"); 110 | 111 | FString PostBuildStepsConsoleCommandFormat = 112 | FString( 113 | "#!/bin/bash\n" 114 | "{0}\n" // Target Platform Check 115 | "{1}\n" // Platform Guard 116 | "\"{2}\" " // Uploader Path 117 | "-i {3} " // Client ID 118 | "-s {4} " // Client Secret 119 | "-b {5} " // Database 120 | "-a \"{6}\" " // Application 121 | "-v \"{7}\" " // Version 122 | "-d \"{8}/$1\" " // Output Directory 123 | "-f \"{9}\" " // File Pattern 124 | ); 125 | 126 | FStringFormatOrderedArguments args; 127 | args.Add(TargetPlatformCheck); 128 | args.Add(PlatformGuard); 129 | args.Add(BUGSPLAT_SYMBOL_UPLOADER_PATH); 130 | args.Add(ClientId); 131 | args.Add(ClientSecret); 132 | args.Add(Database); 133 | args.Add(App); 134 | args.Add(Version); 135 | args.Add(FPaths::Combine(FPaths::ConvertRelativePathToFull(FPaths::ProjectDir()), FString("Binaries"))); 136 | args.Add(FString("**/*.sym")); 137 | 138 | return FString::Format(*PostBuildStepsConsoleCommandFormat, args); 139 | #else 140 | return TEXT("echo \"BugSplat [INFO]: Symbol uploads not supported on this platform\""); 141 | #endif 142 | } 143 | 144 | void FBugSplatSymbols::WriteSymbolUploadScript(FString Contents) 145 | { 146 | FFileHelper::SaveStringToFile(Contents, *BUGSPLAT_SYMBOL_UPLOAD_SCRIPT_PATH); 147 | } -------------------------------------------------------------------------------- /Source/BugSplat/Public/BugSplat.h: -------------------------------------------------------------------------------- 1 | // Copyright 2023 BugSplat. All Rights Reserved. 2 | 3 | #pragma once 4 | 5 | #include "CoreMinimal.h" 6 | #include "Modules/ModuleManager.h" 7 | #include 8 | #include "BugSplatCrashReportClient.h" 9 | #include "BugSplatSymbols.h" 10 | 11 | class FBugSplatModule : public IModuleInterface 12 | { 13 | public: 14 | 15 | /** IModuleInterface implementation */ 16 | virtual void StartupModule() override; 17 | virtual void ShutdownModule() override; 18 | 19 | static FBugSplatModule& Get(); 20 | 21 | /** This function will be bound to Command (by default it will bring up plugin window) */ 22 | void PluginButtonClicked(); 23 | 24 | void OnUpdateBugSplatSettings(); 25 | FReply OnUpdateLocalIni(); 26 | 27 | private: 28 | TSharedPtr PluginCommands; 29 | FBugSplatCrashReportClient* BugSplatCrashReportClient; 30 | FBugSplatSymbols* BugSplatSymbols; 31 | }; 32 | -------------------------------------------------------------------------------- /Source/BugSplat/Public/BugSplatCrashReportClient.h: -------------------------------------------------------------------------------- 1 | // Copyright 2023 BugSplat. All Rights Reserved. 2 | 3 | #pragma once 4 | 5 | #include "CoreMinimal.h" 6 | #include 7 | 8 | static const FString BUGSPLAT_ENDPOINT_URL_FORMAT = FString("https://{0}.bugsplat.com/post/ue4/{1}/{2}"); 9 | 10 | static const FString GLOBAL_CRASH_REPORT_CLIENT_CONFIG_PATH = *FPaths::Combine(FPaths::EngineDir(), FString("Programs/CrashReportClient/Config/DefaultEngine.ini")); 11 | 12 | static const FString PACKAGED_BUILD_CONFIG_PATH_5 = FString("Engine\\Restricted\\NoRedist\\Programs\\CrashReportClient\\Config"); 13 | static const FString PACKAGED_BUILD_CONFIG_PATH_4_26_TO_5 = FString("Engine\\Restricted\\NoRedist\\Programs\\CrashReportClient\\Config"); 14 | static const FString PACKAGED_BUILD_CONFIG_PATH_4_25_AND_OLDER = FString("Engine\\Programs\\CrashReportClient\\Config\\NoRedist"); 15 | 16 | static const FString INI_FILE_NAME = FString("DefaultEngine.ini"); 17 | 18 | class FBugSplatCrashReportClient 19 | { 20 | public: 21 | FBugSplatCrashReportClient(); 22 | 23 | void UpdatePackagedBuildSettings(); 24 | void UpdateEngineSettings(); 25 | 26 | private: 27 | FString CreateBugSplatEndpointUrl(FString Database, FString App, FString Version); 28 | void CreateEmptyTextFile(FString FullPath); 29 | 30 | FString GetPackagedBuildPlatformTarget(FString Platform); 31 | FString GetPackagedBuildDefaultEngineIniRelativePath(); 32 | 33 | void UpdateCrashReportClientIni(FString Database, FString App, FString Version, FString DefaultEngineIniFilePath); 34 | }; 35 | -------------------------------------------------------------------------------- /Source/BugSplat/Public/BugSplatEditorSettingsCustomization.h: -------------------------------------------------------------------------------- 1 | // Copyright 2023 BugSplat. All Rights Reserved. 2 | 3 | #pragma once 4 | 5 | #include "IDetailCustomization.h" 6 | #include "Input/Reply.h" 7 | 8 | class SErrorText; 9 | class IPropertyHandle; 10 | 11 | class FBugSplatEditorSettingsCustomization : public IDetailCustomization 12 | { 13 | public: 14 | static TSharedRef MakeInstance(); 15 | 16 | // IDetailCustomization interface 17 | virtual void CustomizeDetails(IDetailLayoutBuilder& DetailBuilder) override; 18 | 19 | private: 20 | TSharedPtr DatabaseHandle; 21 | }; -------------------------------------------------------------------------------- /Source/BugSplat/Public/BugSplatSymbols.h: -------------------------------------------------------------------------------- 1 | // Copyright 2023 BugSplat. All Rights Reserved. 2 | 3 | #pragma once 4 | 5 | #include "CoreMinimal.h" 6 | #include 7 | #include "Interfaces/IPluginManager.h" 8 | 9 | static const FString PLUGIN_BASE_DIR = FPaths::ConvertRelativePathToFull(IPluginManager::Get().FindPlugin(TEXT("BugSplat"))->GetBaseDir()); 10 | 11 | #if PLATFORM_MAC 12 | static const FString BUGSPLAT_SYMBOL_UPLOADER_PATH = *FPaths::Combine(PLUGIN_BASE_DIR, FString("/Source/ThirdParty/SymUploader/symbol-upload-macos")); 13 | static const FString BUGSPLAT_SYMBOL_UPLOAD_SCRIPT_PATH = *FPaths::Combine(FPaths::ProjectDir(), FString("Plugins/BugSplat/Source/Scripts/upload-symbols-mac.sh")); 14 | #elif PLATFORM_LINUX 15 | static const FString BUGSPLAT_SYMBOL_UPLOADER_PATH = *FPaths::Combine(PLUGIN_BASE_DIR, FString("/Source/ThirdParty/SymUploader/symbol-upload-linux")); 16 | static const FString BUGSPLAT_SYMBOL_UPLOAD_SCRIPT_PATH = *FPaths::Combine(FPaths::ProjectDir(), FString("Plugins/BugSplat/Source/Scripts/upload-symbols-linux.sh")); 17 | #else 18 | static const FString BUGSPLAT_SYMBOL_UPLOADER_PATH = *FPaths::Combine(PLUGIN_BASE_DIR, FString("/Source/ThirdParty/SymUploader/symbol-upload-windows.exe")); 19 | static const FString BUGSPLAT_SYMBOL_UPLOAD_SCRIPT_PATH = *FPaths::Combine(FPaths::ProjectDir(), FString("Plugins/BugSplat/Source/Scripts/upload-symbols-win64.ps1")); 20 | #endif 21 | 22 | class FBugSplatSymbols 23 | { 24 | public: 25 | FBugSplatSymbols(); 26 | 27 | void UpdateSymbolUploadsSettings(); 28 | FString CreateSymbolUploadScript(FString Database, FString App, FString Version, FString ClientId, FString ClientSecret); 29 | 30 | private: 31 | void WriteSymbolUploadScript(FString contents); 32 | }; 33 | -------------------------------------------------------------------------------- /Source/BugSplatRuntime/BugSplatRuntime.Build.cs: -------------------------------------------------------------------------------- 1 | // Copyright 2023 BugSplat. All Rights Reserved. 2 | 3 | using System.IO; 4 | using UnrealBuildTool; 5 | 6 | #if UE_5_0_OR_LATER 7 | using EpicGames.Core; 8 | #else 9 | using Tools.DotNETCommon; 10 | #endif 11 | 12 | public class BugSplatRuntime : ModuleRules 13 | { 14 | public BugSplatRuntime(ReadOnlyTargetRules Target) : base(Target) 15 | { 16 | PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs; 17 | 18 | PublicIncludePaths.AddRange( 19 | new string[] { 20 | // ... add public include paths required here ... 21 | } 22 | ); 23 | 24 | 25 | PrivateIncludePaths.AddRange( 26 | new string[] { 27 | // ... add other private include paths required here ... 28 | } 29 | ); 30 | 31 | 32 | PublicDependencyModuleNames.AddRange( 33 | new string[] 34 | { 35 | "Core", 36 | "Json", 37 | "JsonUtilities" 38 | // ... add other public dependencies that you statically link with here ... 39 | } 40 | ); 41 | 42 | 43 | PrivateDependencyModuleNames.AddRange( 44 | new string[] 45 | { 46 | "CoreUObject", 47 | "Engine", 48 | "Slate", 49 | "SlateCore", 50 | "Projects", 51 | "Json" 52 | // ... add private dependencies that you statically link with here ... 53 | } 54 | ); 55 | 56 | 57 | DynamicallyLoadedModuleNames.AddRange( 58 | new string[] 59 | { 60 | // ... add any modules that your module loads dynamically here ... 61 | } 62 | ); 63 | 64 | if (Target.Platform == UnrealTargetPlatform.IOS) 65 | { 66 | // Path to the framework directory 67 | string FrameworkPath = Path.Combine(ModuleDirectory, "../ThirdParty/IOS"); 68 | 69 | // Add the framework (unzipped from .embeddedframework.zip by UPL) 70 | PublicAdditionalFrameworks.Add(new Framework("BugSplat", Path.Combine(FrameworkPath, "BugSplat.embeddedframework.zip"), "", true)); 71 | PublicAdditionalFrameworks.Add(new Framework("HockeySDK", Path.Combine(FrameworkPath, "HockeySDK.embeddedframework.zip"), "", true)); 72 | 73 | // Add the framework's Headers directory to the include path 74 | PublicIncludePaths.Add(Path.Combine(FrameworkPath, "BugSplat.framework/Headers")); 75 | 76 | // Dependencies 77 | PrivateDependencyModuleNames.AddRange(new string[] { "Launch" }); 78 | 79 | // UPL path 80 | string PluginPath = Utils.MakePathRelativeTo(ModuleDirectory, Target.RelativeEnginePath); 81 | AdditionalPropertiesForReceipt.Add("IOSPlugin", Path.Combine(PluginPath, "BugSplat_IOS_UPL.xml")); 82 | } 83 | 84 | if (Target.Platform == UnrealTargetPlatform.Android) 85 | { 86 | PublicDependencyModuleNames.AddRange(new string[] { "Launch" }); 87 | string PluginPath = Utils.MakePathRelativeTo(ModuleDirectory, Target.RelativeEnginePath); 88 | 89 | AdditionalPropertiesForReceipt.Add("AndroidPlugin", Path.Combine(PluginPath, "BugSplat_Android_UPL.xml")); 90 | 91 | PublicDefinitions.Add("DOXYGEN=0"); 92 | } 93 | } 94 | } 95 | -------------------------------------------------------------------------------- /Source/BugSplatRuntime/BugSplat_Android_UPL.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | android { 39 | compileOptions { 40 | targetCompatibility JavaVersion.VERSION_1_8 41 | sourceCompatibility JavaVersion.VERSION_1_8 42 | } 43 | } 44 | 45 | dependencies { 46 | implementation fileTree(dir: 'libs', include: ['*.aar', '*.jar']) 47 | } 48 | 49 | repositories { 50 | mavenCentral() 51 | } 52 | 53 | 54 | 55 | 56 | 57 | 58 | import org.apache.tools.ant.taskdefs.condition.Os 59 | 60 | def checkExecResult(failText, standardOutput) { 61 | def output = standardOutput.toString() 62 | if (output.contains(failText)) { 63 | throw new GradleException('"' + failText + '" found in output: ' + output) 64 | } 65 | } 66 | 67 | def getUploaderExecName() { 68 | if (Os.isFamily(Os.FAMILY_WINDOWS)) { 69 | return 'symbol-upload-windows.exe' 70 | } 71 | if (Os.isFamily(Os.FAMILY_MAC)) { 72 | return 'symbol-upload-macos' 73 | } 74 | if (Os.isFamily(Os.FAMILY_UNIX)) { 75 | return 'symbol-upload-linux' 76 | } 77 | return '' 78 | } 79 | 80 | def deleteFiles(deleteDirPath, fileType) { 81 | delete fileTree(dir: deleteDirPath, include: fileType) 82 | } 83 | 84 | def uploaderExec = '' + getUploaderExecName() 85 | def baseArtifactsDir = '' 86 | def bugsplatDatabase = '' 87 | def bugsplatApp = '' 88 | def bugsplatVersion = '-android' 89 | def bugsplatClientId = '' 90 | def bugsplatClientSecret = '' 91 | def architecture = '' 92 | 93 | task cleanUpSymbols() { 94 | doLast { 95 | deleteFiles(baseArtifactsDir, '*.sym') 96 | } 97 | } 98 | 99 | task uploadSymbols(type: Exec) { 100 | standardOutput = new ByteArrayOutputStream() 101 | 102 | commandLine uploaderExec, '-b', bugsplatDatabase, '-a', bugsplatApp, '-v', bugsplatVersion, 103 | '-f', '**/' + architecture + '/**/*.so', '-d', baseArtifactsDir, 104 | '-i', bugsplatClientId, '-s', bugsplatClientSecret, '-m' 105 | 106 | doLast { 107 | checkExecResult('Error', standardOutput) 108 | } 109 | 110 | finalizedBy cleanUpSymbols 111 | } 112 | 113 | tasks.whenTaskAdded { task -> 114 | if ( 115 | task.name == 'ue4CompleteDebug' || 116 | task.name == 'ue4CompleteRelease' || 117 | task.name == 'ueCompleteDebug' || 118 | task.name == 'ueCompleteRelease' 119 | ) { 120 | task.finalizedBy 'uploadSymbols' 121 | } 122 | } 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | -keep class com.bugsplat.android.BugSplat { *; } 131 | -keepclassmembers class com.bugsplat.android.BugSplat { *; } 132 | 133 | 134 | -------------------------------------------------------------------------------- /Source/BugSplatRuntime/BugSplat_IOS_UPL.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /Source/BugSplatRuntime/Private/BugSplatEditorSettings.cpp: -------------------------------------------------------------------------------- 1 | // Copyright 2023 BugSplat. All Rights Reserved. 2 | 3 | #include "BugSplatEditorSettings.h" 4 | 5 | UBugSplatEditorSettings::UBugSplatEditorSettings(const FObjectInitializer& ObjectInitializer) 6 | : Super(ObjectInitializer) 7 | { 8 | BugSplatDatabase = TEXT(""); 9 | BugSplatApp = TEXT(""); 10 | BugSplatVersion = TEXT(""); 11 | BugSplatClientId = TEXT(""); 12 | BugSplatClientSecret = TEXT(""); 13 | bUpdateEngineDataRouterUrl = true; 14 | bUploadDebugSymbols = false; 15 | bEnableCrashReportingIos = true; 16 | bEnableCrashReportingAndroid = true; 17 | } 18 | 19 | bool UBugSplatEditorSettings::HasValidCrashReporterSettings() const 20 | { 21 | return !BugSplatDatabase.IsEmpty() && !BugSplatApp.IsEmpty() && !BugSplatVersion.IsEmpty(); 22 | } 23 | 24 | bool UBugSplatEditorSettings::HasValidSymbolUploadSettings() const 25 | { 26 | return !BugSplatDatabase.IsEmpty() && !BugSplatApp.IsEmpty() && !BugSplatVersion.IsEmpty() && !BugSplatClientId.IsEmpty() && !BugSplatClientSecret.IsEmpty(); 27 | } 28 | 29 | #if WITH_EDITOR 30 | bool UBugSplatEditorSettings::CanEditChange(const FProperty* InProperty) const 31 | { 32 | const bool ParentVal = Super::CanEditChange(InProperty); 33 | 34 | if (InProperty->GetFName() == GET_MEMBER_NAME_CHECKED(UBugSplatEditorSettings, bUploadDebugSymbols)) 35 | { 36 | return ParentVal && HasValidSymbolUploadSettings(); 37 | } 38 | 39 | return ParentVal; 40 | } 41 | #endif -------------------------------------------------------------------------------- /Source/BugSplatRuntime/Private/BugSplatUtils.cpp: -------------------------------------------------------------------------------- 1 | // Copyright BugSplat. All Rights Reserved. 2 | 3 | #include "BugSplatUtils.h" 4 | 5 | void UBugSplatUtils::GenerateCrash() 6 | { 7 | UE_LOG(LogTemp, Log, TEXT("BugSplat: GenerateCrash")); 8 | volatile char *ptr = (char*)0xC0FFEEC0; 9 | *ptr += 1; 10 | } 11 | 12 | void UBugSplatUtils::GenerateAssert() 13 | { 14 | UE_LOG(LogTemp, Log, TEXT("BugSplat: GenerateAssert")); 15 | char *ptr = nullptr; 16 | check(ptr != nullptr); 17 | } 18 | 19 | void UBugSplatUtils::GenerateEnsure() 20 | { 21 | UE_LOG(LogTemp, Log, TEXT("BugSplat: GenerateEnsure")); 22 | char* ptr = nullptr; 23 | ensure(ptr != nullptr); 24 | } -------------------------------------------------------------------------------- /Source/BugSplatRuntime/Public/BugSplatEditorSettings.h: -------------------------------------------------------------------------------- 1 | // Copyright 2023 BugSplat. All Rights Reserved. 2 | 3 | #pragma once 4 | 5 | #include "CoreMinimal.h" 6 | #include "BugSplatEditorSettings.generated.h" 7 | 8 | UCLASS(Config = Engine, defaultconfig) 9 | class BUGSPLATRUNTIME_API UBugSplatEditorSettings : public UObject 10 | { 11 | GENERATED_UCLASS_BODY() 12 | 13 | public: 14 | #if WITH_EDITOR 15 | virtual bool CanEditChange(const FProperty* InProperty) const override; 16 | #endif 17 | 18 | bool HasValidCrashReporterSettings(void) const; 19 | bool HasValidSymbolUploadSettings(void) const; 20 | 21 | UPROPERTY(Config, EditAnywhere, Category = "Settings", Meta = (DisplayName = "Database", ToolTip = "Database name")) 22 | FString BugSplatDatabase; 23 | 24 | UPROPERTY(Config, EditAnywhere, Category = "Settings", Meta = (DisplayName = "Application", ToolTip = "Application name")) 25 | FString BugSplatApp; 26 | 27 | UPROPERTY(Config, EditAnywhere, Category = "Settings", Meta = (DisplayName = "Version", ToolTip = "Application version number")) 28 | FString BugSplatVersion; 29 | 30 | UPROPERTY(Config, EditAnywhere, Category = "Settings", Meta = (DisplayName = "Client Id", ToolTip = "OAuth Client ID (required for debug symbol uploads)")) 31 | FString BugSplatClientId; 32 | 33 | UPROPERTY(Config, EditAnywhere, Category = "Settings", Meta = (DisplayName = "Client Secret", ToolTip = "OAuth Client Secret (required for debug symbol uploads)")) 34 | FString BugSplatClientSecret; 35 | 36 | UPROPERTY(Config, EditAnywhere, Category = "Settings", 37 | Meta = (DisplayName = "Update Engine DataRouterUrl", ToolTip = "Automatically update engine's DefaultEngine.ini when Database, Application, or Version chages")) 38 | bool bUpdateEngineDataRouterUrl; 39 | 40 | UPROPERTY(Config, EditAnywhere, Category = "Settings", 41 | Meta = (DisplayName = "Enable Automatic Symbol Uploads", ToolTip = "Flag indicating whether to upload debug symbols automatically")) 42 | bool bUploadDebugSymbols; 43 | 44 | UPROPERTY(Config, EditAnywhere, Category = "Settings", 45 | Meta = (DisplayName = "Enable Android Crash Reporting", ToolTip = "Flag indicating whether to capture crashes on Android")) 46 | bool bEnableCrashReportingAndroid; 47 | 48 | UPROPERTY(Config, EditAnywhere, Category = "Settings", 49 | Meta = (DisplayName = "Enable iOS Crash Reporting", ToolTip = "Flag indicating whether to capture crashes on iOS")) 50 | bool bEnableCrashReportingIos; 51 | }; -------------------------------------------------------------------------------- /Source/BugSplatRuntime/Public/BugSplatRuntime.h: -------------------------------------------------------------------------------- 1 | // Copyright 2023 BugSplat. All Rights Reserved. 2 | 3 | #pragma once 4 | 5 | #include "CoreMinimal.h" 6 | #include "Modules/ModuleManager.h" 7 | 8 | class UBugSplatEditorSettings; 9 | 10 | class BUGSPLATRUNTIME_API FBugSplatRuntimeModule : public IModuleInterface 11 | { 12 | public: 13 | 14 | /** IModuleInterface implementation */ 15 | virtual void StartupModule() override; 16 | virtual void ShutdownModule() override; 17 | 18 | static FBugSplatRuntimeModule& Get(); 19 | 20 | UBugSplatEditorSettings* GetSettings() const; 21 | 22 | /** Gets a map of crash attributes to include in crash reports */ 23 | TMap GetCrashAttributes() const; 24 | 25 | private: 26 | void SetupCrashReportingIos(); 27 | void SetupCrashReportingAndroid(); 28 | 29 | UBugSplatEditorSettings* BugSplatEditorSettings; 30 | }; 31 | -------------------------------------------------------------------------------- /Source/BugSplatRuntime/Public/BugSplatUtils.h: -------------------------------------------------------------------------------- 1 | // Copyright 2023 BugSplat. All Rights Reserved. 2 | 3 | #pragma once 4 | 5 | #include "Kismet/BlueprintFunctionLibrary.h" 6 | 7 | #include "BugSplatUtils.generated.h" 8 | 9 | UCLASS() 10 | class BUGSPLATRUNTIME_API UBugSplatUtils : public UBlueprintFunctionLibrary 11 | { 12 | GENERATED_BODY() 13 | 14 | public: 15 | UFUNCTION(BlueprintCallable, Category = "BugSplat") 16 | static void GenerateCrash(); 17 | 18 | UFUNCTION(BlueprintCallable, Category = "BugSplat") 19 | static void GenerateAssert(); 20 | 21 | UFUNCTION(BlueprintCallable, Category = "BugSplat") 22 | static void GenerateEnsure(); 23 | }; -------------------------------------------------------------------------------- /Source/Scripts/.bugsplat.conf: -------------------------------------------------------------------------------- 1 | BUGSPLAT_DATABASE="database" 2 | BUGSPLAT_CLIENT_ID="clientId" 3 | BUGSPLAT_CLIENT_SECRET="clientSecret" -------------------------------------------------------------------------------- /Source/Scripts/post-build-linux.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # Copyright (C) BugSplat. All Rights Reserved. 3 | 4 | export targetPlatform=$1 5 | export targetName=$2 6 | export projectPath=$3 7 | export pluginPath=$4 8 | 9 | export binariesPath=$projectPath/Binaries/Linux 10 | export configPath=$projectPath/Config 11 | export scriptsPath=$pluginPath/Source/Scripts 12 | 13 | export uploaderFolderPath=$pluginPath/Source/ThirdParty/SymUploader 14 | export uploaderPath=$uploaderFolderPath/symbol-upload-linux 15 | 16 | echo "BugSplat [INFO]: Input target platform: $targetPlatform" 17 | echo "BugSplat [INFO]: Input target name: $targetName" 18 | echo "BugSplat [INFO]: Input binaries path: $binariesPath" 19 | echo "BugSplat [INFO]: Input config path: $configPath" 20 | echo "BugSplat [INFO]: Input scripts path: $scriptsPath" 21 | echo "BugSplat [INFO]: Symbol uploader path: $uploaderPath" 22 | 23 | if echo "$targetName" | grep -q "Editor"; then 24 | echo "BugSplat [INFO]: Editor build detected, skipping symbol upload..." 25 | exit 26 | fi 27 | 28 | if [ "$targetPlatform" != "Linux" ]; then 29 | echo "BugSplat [WARN]: Unexpected platform ${targetPlatform}, skipping symbol upload..." 30 | exit 31 | fi 32 | 33 | if [ -f "$scriptsPath/upload-symbols-linux.sh" ]; then 34 | echo "BugSplat [INFO]: Running upload-symbols-linux.sh" 35 | sh "$scriptsPath/upload-symbols-linux.sh" "$targetPlatform" "$targetName" 36 | else 37 | echo "BugSplat [WARN]: Symbol uploads not configured via plugin - skipping..." 38 | fi 39 | -------------------------------------------------------------------------------- /Source/Scripts/post-build-mac.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # Copyright (C) BugSplat. All Rights Reserved. 3 | 4 | export targetPlatform=$1 5 | export targetName=$2 6 | export projectPath=$3 7 | export pluginPath=$4 8 | 9 | export binariesPath=$projectPath/Binaries/IOS 10 | export configPath=$projectPath/Config 11 | export scriptsPath=$pluginPath/Source/Scripts 12 | 13 | export uploaderFolderPath=$pluginPath/Source/ThirdParty/SymUploader 14 | export uploaderPath=$uploaderFolderPath/symbol-upload-macos 15 | 16 | echo "BugSplat [INFO]: Input target platform: $targetPlatform" 17 | echo "BugSplat [INFO]: Input target name: $targetName" 18 | echo "BugSplat [INFO]: Input binaries path: $binariesPath" 19 | echo "BugSplat [INFO]: Input config path: $configPath" 20 | echo "BugSplat [INFO]: Input scripts path: $scriptsPath" 21 | echo "BugSplat [INFO]: Symbol uploader path: $uploaderPath" 22 | 23 | if [[ "$targetName" == *"Editor"* ]]; then 24 | echo "BugSplat [INFO]: Editor build detected, skipping symbol upload..." 25 | exit 26 | fi 27 | 28 | if [ "$targetPlatform" != "IOS" ] && [ "$targetPlatform" != "Mac" ]; then 29 | echo "BugSplat [WARN]: Unexpected platform ${targetPlatform}, skipping symbol upload..." 30 | exit 31 | fi 32 | 33 | if [ "$targetPlatform" == "Mac" ] && [ -f "$scriptsPath/upload-symbols-mac.sh" ]; then 34 | echo "BugSplat [INFO]: Running upload-symbols-mac.sh" 35 | sh "$scriptsPath/upload-symbols-mac.sh" "$targetPlatform" "$targetName" 36 | exit 37 | elif [ "$targetPlatform" == "Mac" ]; then 38 | echo "BugSplat [WARN]: Symbol uploads not configured via plugin - skipping..." 39 | exit 40 | fi 41 | 42 | echo "BugSplat [INFO]: Start debug symbols upload for iOS" 43 | 44 | export reportCrashes=$(awk -F "=" '/bEnableCrashReportingIos/ {print $2}' ${configPath}/DefaultEngine.ini) 45 | 46 | # By default crash reporting for iOS is enabled and hence not included in DefaultEngine.ini 47 | if [ ! -z "$reportCrashes" ]; then 48 | if [ $reportCrashes != "True" ]; then 49 | echo "BugSplat [INFO]: Crash reporting is disabled in plugin settings. Terminating..." 50 | exit 51 | fi 52 | fi 53 | 54 | export uploadSymbols=$(awk -F "=" '/bUploadDebugSymbols/ {print $2}' ${configPath}/DefaultEngine.ini) 55 | 56 | if [ ! -z "$uploadSymbols" ]; then 57 | if [ $uploadSymbols != "True" ]; then 58 | echo "BugSplat [INFO]: Automatic symbols upload is disabled in plugin settings. Terminating..." 59 | exit 60 | fi 61 | fi 62 | 63 | # Get app info directly from the app bundle 64 | export appPath="$binariesPath/$targetName.app" 65 | export dsymFileSpec="$targetName.app.dSYM" 66 | 67 | echo "BugSplat [INFO]: Checking app path: $appPath" 68 | 69 | # Check if Info.plist exists 70 | if [ ! -f "${appPath}/Info.plist" ]; then 71 | echo "BugSplat [WARN]: Info.plist not found at ${appPath}/Info.plist" 72 | 73 | # Use fallback values 74 | export appMarketingVersion="1.0" 75 | export appBundleVersion="" 76 | export appExecutable="$targetName" 77 | 78 | echo "BugSplat [INFO]: Using fallback values - Version: $appMarketingVersion, Executable: $appExecutable" 79 | else 80 | # Read version information directly from Info.plist 81 | export appMarketingVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "${appPath}/Info.plist" 2>/dev/null) 82 | export appBundleVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${appPath}/Info.plist" 2>/dev/null) 83 | export appExecutable=$(/usr/libexec/PlistBuddy -c "Print CFBundleExecutable" "${appPath}/Info.plist" 2>/dev/null) 84 | 85 | # Check if values were successfully retrieved 86 | if [ -z "$appMarketingVersion" ]; then 87 | echo "BugSplat [WARN]: CFBundleShortVersionString not found, using default" 88 | appMarketingVersion="1.0" 89 | fi 90 | 91 | if [ -z "$appExecutable" ]; then 92 | echo "BugSplat [WARN]: CFBundleExecutable not found, using target name" 93 | appExecutable="$targetName" 94 | fi 95 | fi 96 | 97 | # Format version string 98 | export appVersion="${appMarketingVersion}" 99 | if [ -n "${appBundleVersion}" ]; then 100 | appVersion="${appVersion} (${appBundleVersion})" 101 | fi 102 | 103 | # Get BugSplat credentials from config 104 | export bugSplatDatabase=$(awk -F "=" '/BugSplatDatabase/ {print $2}' ${configPath}/DefaultEngine.ini) 105 | export bugSplatClientId=$(awk -F "=" '/BugSplatClientId/ {print $2}' ${configPath}/DefaultEngine.ini) 106 | export bugSplatClientSecret=$(awk -F "=" '/BugSplatClientSecret/ {print $2}' ${configPath}/DefaultEngine.ini) 107 | 108 | # Validate credentials 109 | if [ -z "$bugSplatDatabase" ] || [ -z "$bugSplatClientId" ] || [ -z "$bugSplatClientSecret" ]; then 110 | echo "BugSplat [ERROR]: Missing BugSplat credentials in DefaultEngine.ini" 111 | exit 1 112 | fi 113 | 114 | echo "BugSplat [INFO]: Uploading symbols directly..." 115 | 116 | # Directly invoke the uploader with the required parameters 117 | $uploaderPath -b $bugSplatDatabase -a $appExecutable -v "$appVersion" -d "$binariesPath" -f "$dsymFileSpec" -i $bugSplatClientId -s "$bugSplatClientSecret" 118 | 119 | echo "BugSplat [INFO]: Symbol upload completed" 120 | -------------------------------------------------------------------------------- /Source/Scripts/post-build-win64.ps1: -------------------------------------------------------------------------------- 1 | # Copyright (C) BugSplat. All Rights Reserved. 2 | 3 | $targetPlatform = $args[0] 4 | $targetName = $args[1] 5 | $projectDir = $args[2] 6 | $pluginPath = $args[3] 7 | 8 | $uploadScriptPath = Join-Path $pluginPath "Source\Scripts\upload-symbols-win64.ps1" 9 | $symbolUploaderFolderPath = Join-Path $pluginPath "Source\ThirdParty\SymUploader" 10 | $symbolUploaderPath = Join-Path $symbolUploaderFolderPath "symbol-upload-windows.exe" 11 | 12 | Write-Host "BugSplat [INFO]: Post-build step invoked with parameters: $targetPlatform, $targetName" 13 | 14 | if ($targetName -like '*Editor*') { 15 | Write-Host 'BugSplat [INFO]: Skipping symbol upload for Editor build...' 16 | exit 0 17 | } 18 | 19 | if (-not (Test-Path $uploadScriptPath)) { 20 | Write-Host "BugSplat [WARN]: Symbol uploads not configured via plugin - skipping..." 21 | exit 22 | } 23 | 24 | Write-Host "BugSplat [INFO]: Invoking symbol upload script at $uploadScriptPath" 25 | 26 | & "$uploadScriptPath" $targetPlatform $targetName 27 | -------------------------------------------------------------------------------- /Source/Scripts/pre-build-linux.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # Copyright (C) BugSplat. All Rights Reserved. 3 | 4 | export targetName=$1 5 | export pluginPath=$2 6 | 7 | export uploaderFolderPath=$pluginPath/Source/ThirdParty/SymUploader 8 | export uploaderPath=$uploaderFolderPath/symbol-upload-linux 9 | 10 | echo "BugSplat [INFO]: Input target name: $targetName" 11 | echo "BugSplat [INFO]: Symbol uploader path: $uploaderPath" 12 | 13 | if echo "$targetName" | grep -q "Editor"; then 14 | echo "BugSplat [INFO]: Editor build detected, skipping pre-build step..." 15 | exit 16 | fi 17 | 18 | if ! command -v curl > /dev/null 2>&1; then 19 | echo "BugSplat [ERROR]: 'curl' is not installed. This script requires curl to download the symbol uploader. Please install curl and try again." 20 | exit 1 21 | fi 22 | 23 | if [ ! -f "$uploaderPath" ]; then 24 | echo "BugSplat [INFO]: File $uploaderPath does not exist - downloading..." 25 | mkdir -p $uploaderFolderPath 26 | curl -sL "https://app.bugsplat.com/download/symbol-upload-linux" -o $uploaderPath 27 | chmod +x $uploaderPath 28 | fi 29 | -------------------------------------------------------------------------------- /Source/Scripts/pre-build-mac.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # Copyright (C) BugSplat. All Rights Reserved. 3 | 4 | export targetName=$1 5 | export pluginPath=$2 6 | 7 | export uploaderFolderPath=$pluginPath/Source/ThirdParty/SymUploader 8 | export uploaderPath=$uploaderFolderPath/symbol-upload-macos 9 | 10 | echo "BugSplat [INFO]: Input target name: $targetName" 11 | echo "BugSplat [INFO]: Symbol uploader path: $uploaderPath" 12 | 13 | if [[ "$targetName" == *"Editor"* ]]; then 14 | echo "BugSplat [INFO]: Editor build detected, skipping pre-build step..." 15 | exit 16 | fi 17 | 18 | if [ ! -f "$uploaderPath" ]; then 19 | echo "BugSplat [INFO]: File $uploaderPath does not exist - downloading..." 20 | mkdir -p $uploaderFolderPath 21 | curl -sL "https://app.bugsplat.com/download/symbol-upload-macos" -o $uploaderPath 22 | chmod +x $uploaderPath 23 | fi 24 | -------------------------------------------------------------------------------- /Source/Scripts/pre-build-win64.ps1: -------------------------------------------------------------------------------- 1 | # Copyright (C) BugSplat. All Rights Reserved. 2 | 3 | $targetName = $args[0] 4 | $pluginPath = $args[1] 5 | $symbolUploaderFolderPath = Join-Path $pluginPath "Source\ThirdParty\SymUploader" 6 | $symbolUploaderPath = Join-Path $symbolUploaderFolderPath "symbol-upload-windows.exe" 7 | 8 | Write-Host "BugSplat [INFO]: Pre-build step invoked with parameters: $targetName" 9 | 10 | if ($targetName -like '*Editor*') { 11 | Write-Host 'BugSplat [INFO]: Skipping pre-build step for Editor build...' 12 | exit 0 13 | } 14 | 15 | if (-not (Test-Path $symbolUploaderPath)) { 16 | Write-Host "BugSplat [INFO]: File $symbolUploaderPath not found - downloading..." 17 | New-Item -ItemType Directory -Force -Path $symbolUploaderFolderPath | Out-Null 18 | Invoke-WebRequest -Uri "https://app.bugsplat.com/download/symbol-upload-windows.exe" -OutFile $symbolUploaderPath 19 | } 20 | 21 | Write-Host "BugSplat [INFO]: Pre-build step completed successfully" 22 | -------------------------------------------------------------------------------- /Source/Scripts/upload-symbols-ios.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 3 | # (Above line comes out when placing in Xcode scheme) 4 | # Copyright (C) BugSplat. All Rights Reserved. 5 | 6 | OPT="value" 7 | opts=":hd:a:v:i:s:p:" 8 | 9 | cmd(){ echo `basename $0`; } 10 | 11 | usage(){ 12 | echo "\ 13 | `cmd` [OPTION...] 14 | -h optional Print this help message 15 | -d required BugSplat database name 16 | -a required Application name 17 | -v required Application version 18 | -i required BugSplat client ID 19 | -s required BugSplat client secret 20 | -p required Path to dSYM file or directory 21 | -u required Path to symbol uploader executable 22 | " | column -t -s ";" 23 | } 24 | 25 | error() { 26 | echo "`cmd`: invalid option -- '$1'"; 27 | echo "Try '`cmd` -h' for more information."; 28 | exit 1; 29 | } 30 | 31 | if [ $# -eq 0 ]; then 32 | usage; 33 | exit 1 34 | fi 35 | 36 | while getopts ":d:a:v:i:s:p:u:h" opt; do 37 | case ${opt} in 38 | d ) 39 | BUGSPLAT_DATABASE=$OPTARG 40 | ;; 41 | a ) 42 | PRODUCT_NAME=$OPTARG 43 | ;; 44 | v ) 45 | APP_VERSION=$OPTARG 46 | ;; 47 | i ) 48 | BUGSPLAT_CLIENT_ID=$OPTARG 49 | ;; 50 | s ) 51 | BUGSPLAT_CLIENT_SECRET=$OPTARG 52 | ;; 53 | p ) 54 | DSYM_PATH=$OPTARG 55 | ;; 56 | u ) 57 | UPLOADER=$OPTARG 58 | ;; 59 | h ) 60 | usage 61 | exit 0 62 | ;; 63 | \? ) 64 | error 65 | ;; 66 | : ) 67 | echo "Option: $OPTARG requires an argument" 1>&2 68 | usage 69 | exit 1 70 | ;; 71 | esac 72 | done 73 | shift $((OPTIND -1)) 74 | 75 | # Validate required parameters 76 | if [ -z "$BUGSPLAT_DATABASE" ] || [ -z "$PRODUCT_NAME" ] || [ -z "$APP_VERSION" ] || 77 | [ -z "$BUGSPLAT_CLIENT_ID" ] || [ -z "$BUGSPLAT_CLIENT_SECRET" ] || [ -z "$DSYM_PATH" ] || [ -z "$UPLOADER" ]; then 78 | echo "Missing required parameters" 79 | usage 80 | exit 1 81 | fi 82 | 83 | echo "Uploading symbols to BugSplat..." 84 | echo "Database: $BUGSPLAT_DATABASE" 85 | echo "Application: $PRODUCT_NAME" 86 | echo "Version: $APP_VERSION" 87 | echo "dSYM Path: $DSYM_PATH" 88 | 89 | # Directly invoke the uploader with the provided parameters 90 | $UPLOADER -b $BUGSPLAT_DATABASE -a $PRODUCT_NAME -v "$APP_VERSION" -f "$DSYM_PATH" -i $BUGSPLAT_CLIENT_ID -s "$BUGSPLAT_CLIENT_SECRET" 91 | 92 | echo "Symbol upload complete" -------------------------------------------------------------------------------- /Source/ThirdParty/Android/LICENSE: -------------------------------------------------------------------------------- 1 | 2 | Apache License 3 | Version 2.0, January 2004 4 | http://www.apache.org/licenses/ 5 | 6 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 7 | 8 | 1. Definitions. 9 | 10 | "License" shall mean the terms and conditions for use, reproduction, 11 | and distribution as defined by Sections 1 through 9 of this document. 12 | 13 | "Licensor" shall mean the copyright owner or entity authorized by 14 | the copyright owner that is granting the License. 15 | 16 | "Legal Entity" shall mean the union of the acting entity and all 17 | other entities that control, are controlled by, or are under common 18 | control with that entity. For the purposes of this definition, 19 | "control" means (i) the power, direct or indirect, to cause the 20 | direction or management of such entity, whether by contract or 21 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 22 | outstanding shares, or (iii) beneficial ownership of such entity. 23 | 24 | "You" (or "Your") shall mean an individual or Legal Entity 25 | exercising permissions granted by this License. 26 | 27 | "Source" form shall mean the preferred form for making modifications, 28 | including but not limited to software source code, documentation 29 | source, and configuration files. 30 | 31 | "Object" form shall mean any form resulting from mechanical 32 | transformation or translation of a Source form, including but 33 | not limited to compiled object code, generated documentation, 34 | and conversions to other media types. 35 | 36 | "Work" shall mean the work of authorship, whether in Source or 37 | Object form, made available under the License, as indicated by a 38 | copyright notice that is included in or attached to the work 39 | (an example is provided in the Appendix below). 40 | 41 | "Derivative Works" shall mean any work, whether in Source or Object 42 | form, that is based on (or derived from) the Work and for which the 43 | editorial revisions, annotations, elaborations, or other modifications 44 | represent, as a whole, an original work of authorship. For the purposes 45 | of this License, Derivative Works shall not include works that remain 46 | separable from, or merely link (or bind by name) to the interfaces of, 47 | the Work and Derivative Works thereof. 48 | 49 | "Contribution" shall mean any work of authorship, including 50 | the original version of the Work and any modifications or additions 51 | to that Work or Derivative Works thereof, that is intentionally 52 | submitted to Licensor for inclusion in the Work by the copyright owner 53 | or by an individual or Legal Entity authorized to submit on behalf of 54 | the copyright owner. For the purposes of this definition, "submitted" 55 | means any form of electronic, verbal, or written communication sent 56 | to the Licensor or its representatives, including but not limited to 57 | communication on electronic mailing lists, source code control systems, 58 | and issue tracking systems that are managed by, or on behalf of, the 59 | Licensor for the purpose of discussing and improving the Work, but 60 | excluding communication that is conspicuously marked or otherwise 61 | designated in writing by the copyright owner as "Not a Contribution." 62 | 63 | "Contributor" shall mean Licensor and any individual or Legal Entity 64 | on behalf of whom a Contribution has been received by Licensor and 65 | subsequently incorporated within the Work. 66 | 67 | 2. Grant of Copyright License. Subject to the terms and conditions of 68 | this License, each Contributor hereby grants to You a perpetual, 69 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 70 | copyright license to reproduce, prepare Derivative Works of, 71 | publicly display, publicly perform, sublicense, and distribute the 72 | Work and such Derivative Works in Source or Object form. 73 | 74 | 3. Grant of Patent License. Subject to the terms and conditions of 75 | this License, each Contributor hereby grants to You a perpetual, 76 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 77 | (except as stated in this section) patent license to make, have made, 78 | use, offer to sell, sell, import, and otherwise transfer the Work, 79 | where such license applies only to those patent claims licensable 80 | by such Contributor that are necessarily infringed by their 81 | Contribution(s) alone or by combination of their Contribution(s) 82 | with the Work to which such Contribution(s) was submitted. If You 83 | institute patent litigation against any entity (including a 84 | cross-claim or counterclaim in a lawsuit) alleging that the Work 85 | or a Contribution incorporated within the Work constitutes direct 86 | or contributory patent infringement, then any patent licenses 87 | granted to You under this License for that Work shall terminate 88 | as of the date such litigation is filed. 89 | 90 | 4. Redistribution. You may reproduce and distribute copies of the 91 | Work or Derivative Works thereof in any medium, with or without 92 | modifications, and in Source or Object form, provided that You 93 | meet the following conditions: 94 | 95 | (a) You must give any other recipients of the Work or 96 | Derivative Works a copy of this License; and 97 | 98 | (b) You must cause any modified files to carry prominent notices 99 | stating that You changed the files; and 100 | 101 | (c) You must retain, in the Source form of any Derivative Works 102 | that You distribute, all copyright, patent, trademark, and 103 | attribution notices from the Source form of the Work, 104 | excluding those notices that do not pertain to any part of 105 | the Derivative Works; and 106 | 107 | (d) If the Work includes a "NOTICE" text file as part of its 108 | distribution, then any Derivative Works that You distribute must 109 | include a readable copy of the attribution notices contained 110 | within such NOTICE file, excluding those notices that do not 111 | pertain to any part of the Derivative Works, in at least one 112 | of the following places: within a NOTICE text file distributed 113 | as part of the Derivative Works; within the Source form or 114 | documentation, if provided along with the Derivative Works; or, 115 | within a display generated by the Derivative Works, if and 116 | wherever such third-party notices normally appear. The contents 117 | of the NOTICE file are for informational purposes only and 118 | do not modify the License. You may add Your own attribution 119 | notices within Derivative Works that You distribute, alongside 120 | or as an addendum to the NOTICE text from the Work, provided 121 | that such additional attribution notices cannot be construed 122 | as modifying the License. 123 | 124 | You may add Your own copyright statement to Your modifications and 125 | may provide additional or different license terms and conditions 126 | for use, reproduction, or distribution of Your modifications, or 127 | for any such Derivative Works as a whole, provided Your use, 128 | reproduction, and distribution of the Work otherwise complies with 129 | the conditions stated in this License. 130 | 131 | 5. Submission of Contributions. Unless You explicitly state otherwise, 132 | any Contribution intentionally submitted for inclusion in the Work 133 | by You to the Licensor shall be under the terms and conditions of 134 | this License, without any additional terms or conditions. 135 | Notwithstanding the above, nothing herein shall supersede or modify 136 | the terms of any separate license agreement you may have executed 137 | with Licensor regarding such Contributions. 138 | 139 | 6. Trademarks. This License does not grant permission to use the trade 140 | names, trademarks, service marks, or product names of the Licensor, 141 | except as required for reasonable and customary use in describing the 142 | origin of the Work and reproducing the content of the NOTICE file. 143 | 144 | 7. Disclaimer of Warranty. Unless required by applicable law or 145 | agreed to in writing, Licensor provides the Work (and each 146 | Contributor provides its Contributions) on an "AS IS" BASIS, 147 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 148 | implied, including, without limitation, any warranties or conditions 149 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 150 | PARTICULAR PURPOSE. You are solely responsible for determining the 151 | appropriateness of using or redistributing the Work and assume any 152 | risks associated with Your exercise of permissions under this License. 153 | 154 | 8. Limitation of Liability. In no event and under no legal theory, 155 | whether in tort (including negligence), contract, or otherwise, 156 | unless required by applicable law (such as deliberate and grossly 157 | negligent acts) or agreed to in writing, shall any Contributor be 158 | liable to You for damages, including any direct, indirect, special, 159 | incidental, or consequential damages of any character arising as a 160 | result of this License or out of the use or inability to use the 161 | Work (including but not limited to damages for loss of goodwill, 162 | work stoppage, computer failure or malfunction, or any and all 163 | other commercial damages or losses), even if such Contributor 164 | has been advised of the possibility of such damages. 165 | 166 | 9. Accepting Warranty or Additional Liability. While redistributing 167 | the Work or Derivative Works thereof, You may choose to offer, 168 | and charge a fee for, acceptance of support, warranty, indemnity, 169 | or other liability obligations and/or rights consistent with this 170 | License. However, in accepting such obligations, You may act only 171 | on Your own behalf and on Your sole responsibility, not on behalf 172 | of any other Contributor, and only if You agree to indemnify, 173 | defend, and hold each Contributor harmless for any liability 174 | incurred by, or claims asserted against, such Contributor by reason 175 | of your accepting any such warranty or additional liability. 176 | 177 | END OF TERMS AND CONDITIONS 178 | 179 | APPENDIX: How to apply the Apache License to your work. 180 | 181 | To apply the Apache License to your work, attach the following 182 | boilerplate notice, with the fields enclosed by brackets "[]" 183 | replaced with your own identifying information. (Don't include 184 | the brackets!) The text should be enclosed in the appropriate 185 | comment syntax for the file format. We also recommend that a 186 | file or class name and description of purpose be included on the 187 | same "printed page" as the copyright notice for easier 188 | identification within third-party archives. 189 | 190 | Copyright [yyyy] [name of copyright owner] 191 | 192 | Licensed under the Apache License, Version 2.0 (the "License"); 193 | you may not use this file except in compliance with the License. 194 | You may obtain a copy of the License at 195 | 196 | http://www.apache.org/licenses/LICENSE-2.0 197 | 198 | Unless required by applicable law or agreed to in writing, software 199 | distributed under the License is distributed on an "AS IS" BASIS, 200 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 201 | See the License for the specific language governing permissions and 202 | limitations under the License. 203 | -------------------------------------------------------------------------------- /Source/ThirdParty/Android/bugsplat-android-release.aar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BugSplat-Git/bugsplat-unreal/47e80d46f96f92f7b271c952f6ea1e2f4843cea6/Source/ThirdParty/Android/bugsplat-android-release.aar -------------------------------------------------------------------------------- /Source/ThirdParty/IOS/BugSplat.embeddedframework.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BugSplat-Git/bugsplat-unreal/47e80d46f96f92f7b271c952f6ea1e2f4843cea6/Source/ThirdParty/IOS/BugSplat.embeddedframework.zip -------------------------------------------------------------------------------- /Source/ThirdParty/IOS/BugSplat.framework/Bugsplat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BugSplat-Git/bugsplat-unreal/47e80d46f96f92f7b271c952f6ea1e2f4843cea6/Source/ThirdParty/IOS/BugSplat.framework/Bugsplat -------------------------------------------------------------------------------- /Source/ThirdParty/IOS/BugSplat.framework/Headers/BugSplatDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // BugSplatDelegate.h 3 | // 4 | // Copyright © BugSplat, LLC. All rights reserved. 5 | // 6 | 7 | #if TARGET_OS_OSX 8 | #import 9 | #else 10 | #import 11 | #endif 12 | 13 | NS_ASSUME_NONNULL_BEGIN 14 | 15 | @class BugSplat; 16 | @class BugSplatAttachment; 17 | 18 | @protocol BugSplatDelegate 19 | 20 | @optional 21 | 22 | // MARK: - BugSplatDelegate (MacOS, iOS) 23 | 24 | /** Return any log string based data the crash report being processed should contain 25 | * 26 | * @param bugSplat The `BugSplat` instance invoking this delegate 27 | */ 28 | - (NSString *)applicationLogForBugSplat:(BugSplat *)bugSplat; 29 | 30 | /** Invoked right before sending crash reports will start 31 | 32 | @param bugSplat The `BugSplat` instance invoking this delegate 33 | */ 34 | - (void)bugSplatWillSendCrashReport:(BugSplat *)bugSplat; 35 | 36 | /** Invoked after sending crash reports failed 37 | 38 | @param bugSplat The `BugSplat` instance invoking this delegate 39 | @param error The error returned from the NSURLSession call 40 | */ 41 | - (void)bugSplat:(BugSplat *)bugSplat didFailWithError:(NSError *)error; 42 | 43 | /** Invoked after sending crash reports succeeded 44 | 45 | @param bugSplat The `BugSplat` instance invoking this delegate 46 | */ 47 | - (void)bugSplatDidFinishSendingCrashReport:(BugSplat *)bugSplat; 48 | 49 | /** Invoked before the user is asked to send a crash report, so you can do additional actions. 50 | E.g. to make sure not to ask the user for an app rating :) 51 | 52 | @param bugSplat The `BugSplat` instance invoking this delegate 53 | */ 54 | -(void)bugSplatWillShowSubmitCrashReportAlert:(BugSplat *)bugSplat; 55 | 56 | /** Invoked after the user did choose _NOT_ to send a crash in the alert 57 | 58 | @param bugSplat The `BugSplat` instance invoking this delegate 59 | */ 60 | -(void)bugSplatWillCancelSendingCrashReport:(BugSplat *)bugSplat; 61 | 62 | /** Return a BugSplatAttachment object providing an NSData object the crash report being processed should contain 63 | NOTE: For iOS, if this method returns a non-nil BugSplatAttachment, any attributes added via setAttribute:value: to BugSplat will NOT be included in the Crash Report. 64 | 65 | Example implementation: 66 | 67 | NSData *data = [NSData dataWithContentsOfURL:@"mydatafile"]; 68 | 69 | BugSplatAttachment *attachment = [[BugSplatAttachment alloc] initWithFilename:@"myfile.data" 70 | attachmentData:data 71 | contentType:@"application/octet-stream"]; 72 | @param bugSplat The `BugSplat` instance invoking this delegate 73 | */ 74 | - (BugSplatAttachment *)attachmentForBugSplat:(BugSplat *)bugSplat API_AVAILABLE(ios(13.0)); 75 | 76 | // MARK: - BugSplatDelegate (MacOS) 77 | #if TARGET_OS_OSX 78 | 79 | /** Return any string based data the crash report being processed should contain 80 | * 81 | * @param bugSplat The `BugSplat` instance invoking this delegate 82 | * @param signal The system crash signal 83 | * @param exceptionName The exception name. Only provided if crash is the result of an uncaught exception 84 | * @param exceptionReason The exception reason. Only provided if crash is the result of an uncaught exception 85 | */ 86 | - (NSString *)applicationKeyForBugSplat:(BugSplat *)bugSplat signal:(NSString *)signal exceptionName:(NSString *)exceptionName exceptionReason:(NSString *)exceptionReason API_AVAILABLE(macosx(10.13)); 87 | 88 | /** Return a collection of BugsplatAttachment objects providing an NSData object the crash report being processed should contain 89 | 90 | Example implementation: 91 | 92 | NSData *data = [NSData dataWithContentsOfURL:@"mydatafile"]; 93 | 94 | BugsplatAttachment *attachment = [[BugsplatAttachment alloc] initWithFilename:@"myfile.data" 95 | attachmentData:data 96 | contentType:@"application/octet-stream"]; 97 | 98 | @param bugSplat The `BugSplat` instance invoking this delegate 99 | */ 100 | - (NSArray *)attachmentsForBugSplat:(BugSplat *)bugSplat API_AVAILABLE(macosx(10.13)); 101 | 102 | // MARK: - BugSplatDelegate (iOS) 103 | #else 104 | 105 | /** Invoked after the user did choose to send crashes always in the alert 106 | 107 | @param bugSplat The `BugSplat` instance invoking this delegate 108 | */ 109 | -(void)bugSplatWillSendCrashReportsAlways:(BugSplat *)bugSplat API_AVAILABLE(ios(13.0)); 110 | 111 | #endif 112 | 113 | @end 114 | 115 | NS_ASSUME_NONNULL_END 116 | -------------------------------------------------------------------------------- /Source/ThirdParty/IOS/BugSplat.framework/Headers/Bugsplat.h: -------------------------------------------------------------------------------- 1 | // 2 | // BugSplat.h 3 | // 4 | // Copyright © BugSplat, LLC. All rights reserved. 5 | // 6 | 7 | #import 8 | 9 | //! Project version number for BugSplat. 10 | FOUNDATION_EXPORT double BugSplatVersionNumber; 11 | 12 | //! Project version string for BugSplat. 13 | FOUNDATION_EXPORT const unsigned char BugSplatVersionString[]; 14 | 15 | // In this header, you should import all the public headers of your framework using statements like #import 16 | 17 | #if TARGET_OS_OSX 18 | #import 19 | #import 20 | #else 21 | #import 22 | #import 23 | #endif 24 | 25 | NS_ASSUME_NONNULL_BEGIN 26 | 27 | /// App's Info.plist String entry which is a customer specific BugSplat database name where crash reports will be uploaded. 28 | /// e.g: "fred" (which will reference the https://fred.bugsplat.com/ database) 29 | #define kBugSplatDatabase @"BugSplatDatabase" 30 | 31 | 32 | @protocol BugSplatDelegate; 33 | 34 | @interface BugSplat : NSObject 35 | 36 | /*! 37 | * BugSplat singleton initializer/accessor 38 | * 39 | * @return shared instance of BugSplat 40 | */ 41 | + (instancetype)shared; 42 | 43 | /*! 44 | * Configures and starts crash reporting service 45 | */ 46 | - (void)start; 47 | 48 | /** 49 | * Set the delegate 50 | * 51 | * Defines the class that implements the optional protocol `BugSplatDelegate`. 52 | * 53 | * @see BugSplatDelegate 54 | */ 55 | @property (weak, nonatomic, nullable) id delegate; 56 | 57 | /** 58 | * The database name BugSplat will use to construct the BugSplatDatabase URL where crash reports will be submitted. 59 | * 60 | * NOTES: 61 | * By default, the BugSplat database name is pulled from the App's Info.plist. 62 | * 63 | * When a third party library or plugin developer is leveraging BugSplat, but the App developer incorporating 64 | * the plugin is not using BugSplat, programmatically setting this property would be appropriate. 65 | * 66 | * Only one BugSplat database can be specified within an App including any third party libraries and plugins. 67 | * This means if the Info.plist contains a BugSplat database, attempting to change this property will have no effect. 68 | * 69 | * Additionally, if the Info.plist does not contain a BugSplat database key and value, the first call to 70 | * set this property will set the BugSplat database name. Any subsequent calls to set this property will have no effect. 71 | * 72 | * Finally, with the above considerations, if programmatic change of this property is desired, it must be set before calling 73 | * BugSplat `start` method or it will have no effect. 74 | */ 75 | @property (nonatomic, copy, nullable) NSString *bugSplatDatabase; 76 | 77 | /** 78 | * The userID that will be used when a crash report is submitted. 79 | * 80 | * The value can be set programmatically at any time and will be stored in NSUserDefaults. 81 | * To delete the value from NSUserDefaults, set the value to `nil`. 82 | * 83 | * This property is optional. 84 | * 85 | * @warning When returning a non nil value, crash reports are not anonymous any more 86 | * and the crash alerts will not show the word "anonymous"! 87 | * 88 | * @warning If setting this property programmatically, it needs to be set before calling `start` 89 | * if the userID should be included in a possible crash from the last app session. 90 | * 91 | * @see userName 92 | * @see userEmail 93 | */ 94 | @property (nonatomic, copy, nullable) NSString *userID; 95 | 96 | /** 97 | * The user name that will be used when a crash report is submitted. 98 | * 99 | * The value can be set programmatically at any time and will be stored in NSUserDefaults. 100 | * To delete the value from NSUserDefaults, set the value to `nil`. 101 | * 102 | * This property is optional. 103 | * 104 | * @warning When returning a non nil value, crash reports are not anonymous any more 105 | * and the crash alerts will not show the word "anonymous"! 106 | * 107 | * @warning If setting this property programmatically, it needs to be set before calling `start` 108 | * if the userName should be included in a possible crash from the last app session. 109 | * 110 | * @see userID 111 | * @see userEmail 112 | */ 113 | @property (nonatomic, copy, nullable) NSString *userName; 114 | 115 | /** 116 | * The user email address that will be used when a crash report is submitted. 117 | * 118 | * The value can be set programmatically at any time and will be stored in NSUserDefaults. 119 | * To delete the value from NSUserDefaults, set the value to `nil`. 120 | * 121 | * This property is optional. 122 | * 123 | * @warning When returning a non nil value, crash reports are not anonymous any more 124 | * and the crash alerts will not show the word "anonymous"! 125 | * 126 | * @warning If setting this property programmatically, it needs to be set before calling `start` 127 | * if the userEmail should be included in a possible crash from the last app session. 128 | * 129 | * @see userID 130 | * @see userName 131 | */ 132 | @property (nonatomic, copy, nullable) NSString *userEmail; 133 | 134 | /*! 135 | * Submit crash reports without asking the user 136 | * 137 | * _YES_: The crash report will be submitted without asking the user 138 | * _NO_: The user will be asked if the crash report can be submitted (default) 139 | * 140 | * Default: iOS: _YES_, macOS: _NO_ 141 | */ 142 | @property (nonatomic, assign) BOOL autoSubmitCrashReport; 143 | 144 | /** 145 | * Add an attribute and value to a dictionary of attributes that will potentially be included in a crash report. 146 | * If the attribute is an invalid XML entity name, or the attribute+value pair cannot be set, 147 | * the method will return NO, otherwise it will return YES. 148 | * 149 | * Attributes and values represent app supplied keys and values to associate with a crash report, should the app crash during this session. 150 | * Attributes and values will be bundled up in a BugSplatAttachment as NSData, with a filename of CrashContext.xml, MIME type of "application/xml" and encoding of "UTF-8". 151 | * 152 | * IMPORTANT: For iOS, only one BugSplatAttachment is currently supported. 153 | * If BugSplatDelegate's method `- (BugSplatAttachment *)attachmentForBugSplat:(BugSplat *)bugSplat` returns a non-nil BugSplatAttachment, 154 | * BugSplat will send that BugSplatAttachment, not the BugSplatAttachment that would otherwise be created due to adding attributes and values using this method. 155 | * 156 | * NOTES: 157 | * 158 | * This method may be called multiple times, once per attribute+value pair. 159 | * This method may be called at any time during the app session prior to a crash. 160 | * Attributes are persisted to NSUserDefaults within a NSDictionary, so attribute names must be unique. 161 | * If the attribute does not exist, it will be added to attributes dictionary. 162 | * If attribute already exists, the value will be replaced in the dictionary. 163 | * If attribute already exists, and the value is nil, the attribute will be removed from the dictionary. 164 | * 165 | * When this method is called, the following preprocessing occurs: 166 | * 1. attribute will be checked for XML entity name rules. If validation fails, method returns NO. 167 | * 168 | * 2. values will then be processed by an XML escaping routine which looks for escapable characters ",',&,<, and > 169 | * See: https://stackoverflow.com/questions/1091945/what-characters-do-i-need-to-escape-in-xml-documents 170 | * Any XML comment blocks or CDATA blocks found will disable XML escaping within the block. 171 | * 172 | * 3. After processing both attribute and value for XML escape characters, the attribute+value pair will be 173 | * persisted to NSUserDefaults within a NSDictionary. 174 | * 175 | * 4. If the attribute or value cannot be set, the method will return NO, otherwise it will return YES. 176 | * 177 | * If a crash occurs, attributes and values will be bundled up in a BugSplatAttachment as NSData, with a filename of CrashContext.xml, MIME type of "application/xml" 178 | * and encoding of "UTF-8". The attachment will be included with the crash data (except as noted above regarding iOS BugSplatAttachment limitation). 179 | * 180 | * Attributes and their values are only valid for the lifetime of the app session and only used in a crash report if the crash occurs during that app session. 181 | * Any attributes set in the prior app session will be bundled up in a BugSplatAttachment as NSData, with a filename of CrashContext.xml, 182 | * MIME type of "application/xml" and encoding of "UTF-8". The attachment will be added to the crash report when it is processed during the next launch of the app. 183 | * If the app terminates normally, any attributes persisted during the prior `normal` app session will be erased during the next app launch. 184 | * 185 | */ 186 | - (BOOL)setValue:(nullable NSString *)value forAttribute:(NSString *)attribute NS_SWIFT_NAME(set(_:for:)); 187 | 188 | // macOS specific API 189 | #if TARGET_OS_OSX 190 | /*! 191 | * Provide custom banner image for crash reporter. 192 | * Can set directly in code or provide an image named bugsplat-logo in main bundle. Can be in asset catalog. 193 | */ 194 | @property (nonatomic, strong, nullable) NSImage *bannerImage; 195 | 196 | /** 197 | * Defines if the crash report UI should ask for name and email 198 | * 199 | * Default: _YES_ 200 | */ 201 | @property (nonatomic, assign) BOOL askUserDetails; 202 | 203 | /** 204 | * If the user enters their name or email on a Bug Crash Alert Form, persist their data to NSUserDefaults. 205 | * After this occurs, userName and userEmail properties will contain the values the user entered. 206 | * When the Bug Crash Alert Form is presented again, it will be pre-populated with user name and email. 207 | * To erase their user name or email, set the property value to nil programmatically. 208 | * 209 | * This property defaults to NO. 210 | * This property is optional. 211 | * 212 | * @warning If setting this property to YES, it needs to be set before calling `start`. 213 | * 214 | * @see userName 215 | * @see userEmail 216 | */ 217 | @property (nonatomic, assign) BOOL persistUserDetails; 218 | 219 | /** 220 | * Defines if crash reports should be considered "expired" after a certain amount of time (in seconds). 221 | * If expired crash dialogue is not displayed but reports are still uploaded. 222 | * 223 | * Default: -1 // No expiration 224 | */ 225 | @property (nonatomic, assign) NSTimeInterval expirationTimeInterval; 226 | 227 | /** 228 | * Option to present crash reporter dialogue modally 229 | * 230 | * *Default*: NO 231 | */ 232 | @property (nonatomic, assign) BOOL presentModally; 233 | 234 | #endif 235 | 236 | @end 237 | 238 | NS_ASSUME_NONNULL_END 239 | -------------------------------------------------------------------------------- /Source/ThirdParty/IOS/BugSplat.framework/Headers/BugsplatAttachment.h: -------------------------------------------------------------------------------- 1 | // 2 | // BugSplatAttachment.h 3 | // 4 | // Copyright © BugSplat, LLC. All rights reserved. 5 | // 6 | 7 | #import 8 | 9 | @interface BugSplatAttachment : NSObject 10 | 11 | /** 12 | The filename the attachment should get 13 | */ 14 | @property (nonatomic, readonly, strong, nonnull) NSString *filename; 15 | 16 | /** 17 | The attachment data as NSData object 18 | */ 19 | @property (nonatomic, readonly, strong, nonnull) NSData *attachmentData; 20 | 21 | /** 22 | The content type of your data as MIME type 23 | */ 24 | @property (nonatomic, readonly, strong, nonnull) NSString *contentType; 25 | 26 | /** 27 | Create an BugSplatAttachment instance with a given filename and NSData object 28 | 29 | @param filename The filename the attachment should get. If nil will get a automatically generated filename 30 | @param attachmentData The attachment data as NSData. The instance will be ignore if this is set to nil! 31 | @param contentType The content type of your data as MIME type. If nil will be set to "application/octet-stream" 32 | 33 | @return An instsance of BugSplatAttachment 34 | */ 35 | - (nonnull instancetype)initWithFilename:(nonnull NSString *)filename attachmentData:(nonnull NSData *)attachmentData contentType:(nonnull NSString *)contentType; 36 | 37 | @end 38 | -------------------------------------------------------------------------------- /Source/ThirdParty/IOS/BugSplat.framework/Info.plist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BugSplat-Git/bugsplat-unreal/47e80d46f96f92f7b271c952f6ea1e2f4843cea6/Source/ThirdParty/IOS/BugSplat.framework/Info.plist -------------------------------------------------------------------------------- /Source/ThirdParty/IOS/BugSplat.framework/Modules/module.modulemap: -------------------------------------------------------------------------------- 1 | framework module BugSplat { 2 | umbrella header "BugSplat.h" 3 | export * 4 | 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Source/ThirdParty/IOS/BugSplat.framework/PrivacyInfo.xcprivacy: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | NSPrivacyAccessedAPITypes 6 | 7 | 8 | NSPrivacyAccessedAPIType 9 | NSPrivacyAccessedAPICategoryUserDefaults 10 | NSPrivacyAccessedAPITypeReasons 11 | 12 | CA92.1 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /Source/ThirdParty/IOS/BugSplat.framework/_CodeSignature/CodeResources: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | files 6 | 7 | Headers/BugSplat.h 8 | 9 | hZff29fndPmw09OYNjGjdtB3LsI= 10 | 11 | Headers/BugSplatAttachment.h 12 | 13 | qI7fH7fP8u40COEg2aBlJ2uSGEA= 14 | 15 | Headers/BugSplatDelegate.h 16 | 17 | dhB1djClZynE9Mb9vH7/KTYJMbU= 18 | 19 | Info.plist 20 | 21 | oKOLycxVrrJAELnC9x2Jm+sOCvA= 22 | 23 | Modules/module.modulemap 24 | 25 | qT3+tUofH44u+SVFziOy75Xn8wk= 26 | 27 | PrivacyInfo.xcprivacy 28 | 29 | 6PyG/Sn5jh81qqGDYJ701GSxHBw= 30 | 31 | 32 | files2 33 | 34 | Headers/BugSplat.h 35 | 36 | hash2 37 | 38 | kGrMW/INqVGLpDxI2xucyHU/tch9bCHSzFXs0nIrd6w= 39 | 40 | 41 | Headers/BugSplatAttachment.h 42 | 43 | hash2 44 | 45 | pmENhJ6JfLbIbOLcCGdAOwOTsdNCBd2zPOjeZJK7Agg= 46 | 47 | 48 | Headers/BugSplatDelegate.h 49 | 50 | hash2 51 | 52 | DnUigxuxAm82osqyC4I4PIbD7cX8NkMNy5mTJnO3Vkg= 53 | 54 | 55 | Modules/module.modulemap 56 | 57 | hash2 58 | 59 | xFLWmqgZRVx23krYWxZGXES6elQur6ZuCbbYYaYEgDA= 60 | 61 | 62 | PrivacyInfo.xcprivacy 63 | 64 | hash2 65 | 66 | 3I1+H5p9p/M4HzB0a1kgbuYs4iW2n+O8u2YjT4RZvjU= 67 | 68 | 69 | 70 | rules 71 | 72 | ^.* 73 | 74 | ^.*\.lproj/ 75 | 76 | optional 77 | 78 | weight 79 | 1000 80 | 81 | ^.*\.lproj/locversion.plist$ 82 | 83 | omit 84 | 85 | weight 86 | 1100 87 | 88 | ^Base\.lproj/ 89 | 90 | weight 91 | 1010 92 | 93 | ^version.plist$ 94 | 95 | 96 | rules2 97 | 98 | .*\.dSYM($|/) 99 | 100 | weight 101 | 11 102 | 103 | ^(.*/)?\.DS_Store$ 104 | 105 | omit 106 | 107 | weight 108 | 2000 109 | 110 | ^.* 111 | 112 | ^.*\.lproj/ 113 | 114 | optional 115 | 116 | weight 117 | 1000 118 | 119 | ^.*\.lproj/locversion.plist$ 120 | 121 | omit 122 | 123 | weight 124 | 1100 125 | 126 | ^Base\.lproj/ 127 | 128 | weight 129 | 1010 130 | 131 | ^Info\.plist$ 132 | 133 | omit 134 | 135 | weight 136 | 20 137 | 138 | ^PkgInfo$ 139 | 140 | omit 141 | 142 | weight 143 | 20 144 | 145 | ^embedded\.provisionprofile$ 146 | 147 | weight 148 | 20 149 | 150 | ^version\.plist$ 151 | 152 | weight 153 | 20 154 | 155 | 156 | 157 | 158 | -------------------------------------------------------------------------------- /Source/ThirdParty/IOS/HockeySDK.embeddedframework.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BugSplat-Git/bugsplat-unreal/47e80d46f96f92f7b271c952f6ea1e2f4843cea6/Source/ThirdParty/IOS/HockeySDK.embeddedframework.zip -------------------------------------------------------------------------------- /Source/ThirdParty/IOS/HockeySDK.framework/Headers/BITCrashAttachment.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Author: Andreas Linde 3 | * 4 | * Copyright (c) 2014 HockeyApp, Bit Stadium GmbH. 5 | * All rights reserved. 6 | * 7 | * Permission is hereby granted, free of charge, to any person 8 | * obtaining a copy of this software and associated documentation 9 | * files (the "Software"), to deal in the Software without 10 | * restriction, including without limitation the rights to use, 11 | * copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | * copies of the Software, and to permit persons to whom the 13 | * Software is furnished to do so, subject to the following 14 | * conditions: 15 | * 16 | * The above copyright notice and this permission notice shall be 17 | * included in all copies or substantial portions of the Software. 18 | * 19 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 21 | * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 23 | * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 24 | * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 26 | * OTHER DEALINGS IN THE SOFTWARE. 27 | */ 28 | 29 | #import "BITHockeyAttachment.h" 30 | 31 | /** 32 | Deprecated: Provides support to add binary attachments to crash reports 33 | 34 | This class is not needed any longer and exists for compatibility purposes with 35 | HockeySDK-iOS 3.5.5. 36 | 37 | It is a subclass of `BITHockeyAttachment` which only provides an initializer 38 | that is compatible with the one of HockeySDK-iOS 3.5.5. 39 | 40 | This is used by `[BITCrashManagerDelegate attachmentForCrashManager:]` 41 | 42 | @see BITHockeyAttachment 43 | */ 44 | @interface BITCrashAttachment : BITHockeyAttachment 45 | 46 | /** 47 | Create an BITCrashAttachment instance with a given filename and NSData object 48 | 49 | @param filename The filename the attachment should get 50 | @param crashAttachmentData The attachment data as NSData 51 | @param contentType The content type of your data as MIME type 52 | 53 | @return An instance of BITCrashAttachment 54 | */ 55 | - (instancetype)initWithFilename:(NSString *)filename 56 | crashAttachmentData:(NSData *)crashAttachmentData 57 | contentType:(NSString *)contentType; 58 | 59 | @end 60 | -------------------------------------------------------------------------------- /Source/ThirdParty/IOS/HockeySDK.framework/Headers/BITCrashDetails.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Author: Andreas Linde 3 | * 4 | * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. 5 | * All rights reserved. 6 | * 7 | * Permission is hereby granted, free of charge, to any person 8 | * obtaining a copy of this software and associated documentation 9 | * files (the "Software"), to deal in the Software without 10 | * restriction, including without limitation the rights to use, 11 | * copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | * copies of the Software, and to permit persons to whom the 13 | * Software is furnished to do so, subject to the following 14 | * conditions: 15 | * 16 | * The above copyright notice and this permission notice shall be 17 | * included in all copies or substantial portions of the Software. 18 | * 19 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 21 | * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 23 | * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 24 | * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 26 | * OTHER DEALINGS IN THE SOFTWARE. 27 | */ 28 | 29 | #import 30 | 31 | /** 32 | * Provides details about the crash that occurred in the previous app session 33 | */ 34 | @interface BITCrashDetails : NSObject 35 | 36 | /** 37 | * UUID for the crash report 38 | */ 39 | @property (nonatomic, readonly, copy) NSString *incidentIdentifier; 40 | 41 | /** 42 | * UUID for the app installation on the device 43 | */ 44 | @property (nonatomic, readonly, copy) NSString *reporterKey; 45 | 46 | /** 47 | * Signal that caused the crash 48 | */ 49 | @property (nonatomic, readonly, copy) NSString *signal; 50 | 51 | /** 52 | * Exception name that triggered the crash, nil if the crash was not caused by an exception 53 | */ 54 | @property (nonatomic, readonly, copy) NSString *exceptionName; 55 | 56 | /** 57 | * Exception reason, nil if the crash was not caused by an exception 58 | */ 59 | @property (nonatomic, readonly, copy) NSString *exceptionReason; 60 | 61 | /** 62 | * Date and time the app started, nil if unknown 63 | */ 64 | @property (nonatomic, readonly, strong) NSDate *appStartTime; 65 | 66 | /** 67 | * Date and time the crash occurred, nil if unknown 68 | */ 69 | @property (nonatomic, readonly, strong) NSDate *crashTime; 70 | 71 | /** 72 | * Operation System version string the app was running on when it crashed. 73 | */ 74 | @property (nonatomic, readonly, copy) NSString *osVersion; 75 | 76 | /** 77 | * Operation System build string the app was running on when it crashed 78 | * 79 | * This may be unavailable. 80 | */ 81 | @property (nonatomic, readonly, copy) NSString *osBuild; 82 | 83 | /** 84 | * CFBundleShortVersionString value of the app that crashed 85 | * 86 | * Can be `nil` if the crash was captured with an older version of the SDK 87 | * or if the app doesn't set the value. 88 | */ 89 | @property (nonatomic, readonly, copy) NSString *appVersion; 90 | 91 | /** 92 | * CFBundleVersion value of the app that crashed 93 | */ 94 | @property (nonatomic, readonly, copy) NSString *appBuild; 95 | 96 | /** 97 | * Identifier of the app process that crashed 98 | */ 99 | @property (nonatomic, readonly, assign) NSUInteger appProcessIdentifier; 100 | 101 | /** 102 | Indicates if the app was killed while being in foreground from the iOS 103 | 104 | If `[BITCrashManager enableAppNotTerminatingCleanlyDetection]` is enabled, use this on startup 105 | to check if the app starts the first time after it was killed by iOS in the previous session. 106 | 107 | This can happen if it consumed too much memory or the watchdog killed the app because it 108 | took too long to startup or blocks the main thread for too long, or other reasons. See Apple 109 | documentation: https://developer.apple.com/library/ios/qa/qa1693/_index.html 110 | 111 | See `[BITCrashManager enableAppNotTerminatingCleanlyDetection]` for more details about which kind of kills can be detected. 112 | 113 | @warning This property only has a correct value, once `[BITHockeyManager startManager]` was 114 | invoked! In addition, it is automatically disabled while a debugger session is active! 115 | 116 | @see `[BITCrashManager enableAppNotTerminatingCleanlyDetection]` 117 | @see `[BITCrashManager didReceiveMemoryWarningInLastSession]` 118 | 119 | @return YES if the details represent an app kill instead of a crash 120 | */ 121 | - (BOOL)isAppKill; 122 | 123 | @end 124 | -------------------------------------------------------------------------------- /Source/ThirdParty/IOS/HockeySDK.framework/Headers/BITCrashManagerDelegate.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Author: Andreas Linde 3 | * 4 | * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. 5 | * All rights reserved. 6 | * 7 | * Permission is hereby granted, free of charge, to any person 8 | * obtaining a copy of this software and associated documentation 9 | * files (the "Software"), to deal in the Software without 10 | * restriction, including without limitation the rights to use, 11 | * copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | * copies of the Software, and to permit persons to whom the 13 | * Software is furnished to do so, subject to the following 14 | * conditions: 15 | * 16 | * The above copyright notice and this permission notice shall be 17 | * included in all copies or substantial portions of the Software. 18 | * 19 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 21 | * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 23 | * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 24 | * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 26 | * OTHER DEALINGS IN THE SOFTWARE. 27 | */ 28 | 29 | #import 30 | 31 | @class BITCrashManager; 32 | @class BITHockeyAttachment; 33 | 34 | /** 35 | The `BITCrashManagerDelegate` formal protocol defines methods further configuring 36 | the behaviour of `BITCrashManager`. 37 | */ 38 | 39 | @protocol BITCrashManagerDelegate 40 | 41 | @optional 42 | 43 | 44 | ///----------------------------------------------------------------------------- 45 | /// @name Additional meta data 46 | ///----------------------------------------------------------------------------- 47 | 48 | /** Return any log string based data the crash report being processed should contain 49 | 50 | @param crashManager The `BITCrashManager` instance invoking this delegate 51 | @see attachmentForCrashManager: 52 | @see BITHockeyManagerDelegate userNameForHockeyManager:componentManager: 53 | @see BITHockeyManagerDelegate userEmailForHockeyManager:componentManager: 54 | */ 55 | -(NSString *)applicationLogForCrashManager:(BITCrashManager *)crashManager; 56 | 57 | 58 | /** Return a BITHockeyAttachment object providing an NSData object the crash report 59 | being processed should contain 60 | 61 | Please limit your attachments to reasonable files to avoid high traffic costs for your users. 62 | 63 | Example implementation: 64 | 65 | - (BITHockeyAttachment *)attachmentForCrashManager:(BITCrashManager *)crashManager { 66 | NSData *data = [NSData dataWithContentsOfURL:@"mydatafile"]; 67 | 68 | BITHockeyAttachment *attachment = [[BITHockeyAttachment alloc] initWithFilename:@"myfile.data" 69 | hockeyAttachmentData:data 70 | contentType:@"'application/octet-stream"]; 71 | return attachment; 72 | } 73 | 74 | @param crashManager The `BITCrashManager` instance invoking this delegate 75 | @see BITHockeyAttachment 76 | @see applicationLogForCrashManager: 77 | @see BITHockeyManagerDelegate userNameForHockeyManager:componentManager: 78 | @see BITHockeyManagerDelegate userEmailForHockeyManager:componentManager: 79 | */ 80 | -(BITHockeyAttachment *)attachmentForCrashManager:(BITCrashManager *)crashManager; 81 | 82 | 83 | 84 | ///----------------------------------------------------------------------------- 85 | /// @name Alert 86 | ///----------------------------------------------------------------------------- 87 | 88 | /** Invoked before the user is asked to send a crash report, so you can do additional actions. 89 | E.g. to make sure not to ask the user for an app rating :) 90 | 91 | @param crashManager The `BITCrashManager` instance invoking this delegate 92 | */ 93 | -(void)crashManagerWillShowSubmitCrashReportAlert:(BITCrashManager *)crashManager; 94 | 95 | 96 | /** Invoked after the user did choose _NOT_ to send a crash in the alert 97 | 98 | @param crashManager The `BITCrashManager` instance invoking this delegate 99 | */ 100 | -(void)crashManagerWillCancelSendingCrashReport:(BITCrashManager *)crashManager; 101 | 102 | 103 | /** Invoked after the user did choose to send crashes always in the alert 104 | 105 | @param crashManager The `BITCrashManager` instance invoking this delegate 106 | */ 107 | -(void)crashManagerWillSendCrashReportsAlways:(BITCrashManager *)crashManager; 108 | 109 | 110 | ///----------------------------------------------------------------------------- 111 | /// @name Networking 112 | ///----------------------------------------------------------------------------- 113 | 114 | /** Invoked right before sending crash reports will start 115 | 116 | @param crashManager The `BITCrashManager` instance invoking this delegate 117 | */ 118 | - (void)crashManagerWillSendCrashReport:(BITCrashManager *)crashManager; 119 | 120 | /** Invoked after sending crash reports failed 121 | 122 | @param crashManager The `BITCrashManager` instance invoking this delegate 123 | @param error The error returned from the NSURLSession call or `kBITCrashErrorDomain` 124 | with reason of type `BITCrashErrorReason`. 125 | */ 126 | - (void)crashManager:(BITCrashManager *)crashManager didFailWithError:(NSError *)error; 127 | 128 | /** Invoked after sending crash reports succeeded 129 | 130 | @param crashManager The `BITCrashManager` instance invoking this delegate 131 | */ 132 | - (void)crashManagerDidFinishSendingCrashReport:(BITCrashManager *)crashManager; 133 | 134 | ///----------------------------------------------------------------------------- 135 | /// @name Experimental 136 | ///----------------------------------------------------------------------------- 137 | 138 | /** Define if a report should be considered as a crash report 139 | 140 | Due to the risk, that these reports may be false positives, this delegates allows the 141 | developer to influence which reports detected by the heuristic should actually be reported. 142 | 143 | The developer can use the following property to get more information about the crash scenario: 144 | - `[BITCrashManager didReceiveMemoryWarningInLastSession]`: Did the app receive a low memory warning 145 | 146 | This allows only reports to be considered where at least one low memory warning notification was 147 | received by the app to reduce to possibility of having false positives. 148 | 149 | @param crashManager The `BITCrashManager` instance invoking this delegate 150 | @return `YES` if the heuristic based detected report should be reported, otherwise `NO` 151 | @see `[BITCrashManager didReceiveMemoryWarningInLastSession]` 152 | */ 153 | -(BOOL)considerAppNotTerminatedCleanlyReportForCrashManager:(BITCrashManager *)crashManager; 154 | 155 | @end 156 | -------------------------------------------------------------------------------- /Source/ThirdParty/IOS/HockeySDK.framework/Headers/BITCrashMetaData.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Author: Andreas Linde 3 | * 4 | * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. 5 | * All rights reserved. 6 | * 7 | * Permission is hereby granted, free of charge, to any person 8 | * obtaining a copy of this software and associated documentation 9 | * files (the "Software"), to deal in the Software without 10 | * restriction, including without limitation the rights to use, 11 | * copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | * copies of the Software, and to permit persons to whom the 13 | * Software is furnished to do so, subject to the following 14 | * conditions: 15 | * 16 | * The above copyright notice and this permission notice shall be 17 | * included in all copies or substantial portions of the Software. 18 | * 19 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 21 | * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 23 | * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 24 | * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 26 | * OTHER DEALINGS IN THE SOFTWARE. 27 | */ 28 | 29 | #import 30 | 31 | 32 | /** 33 | * This class provides properties that can be attached to a crash report via a custom alert view flow 34 | */ 35 | @interface BITCrashMetaData : NSObject 36 | 37 | /** 38 | * User provided description that should be attached to the crash report as plain text 39 | */ 40 | @property (nonatomic, copy) NSString *userProvidedDescription; 41 | 42 | /** 43 | * User name that should be attached to the crash report 44 | */ 45 | @property (nonatomic, copy) NSString *userName; 46 | 47 | /** 48 | * User email that should be attached to the crash report 49 | */ 50 | @property (nonatomic, copy) NSString *userEmail; 51 | 52 | /** 53 | * User ID that should be attached to the crash report 54 | */ 55 | @property (nonatomic, copy) NSString *userID; 56 | 57 | @end 58 | -------------------------------------------------------------------------------- /Source/ThirdParty/IOS/HockeySDK.framework/Headers/BITFeedbackActivity.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Author: Andreas Linde 3 | * 4 | * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. 5 | * All rights reserved. 6 | * 7 | * Permission is hereby granted, free of charge, to any person 8 | * obtaining a copy of this software and associated documentation 9 | * files (the "Software"), to deal in the Software without 10 | * restriction, including without limitation the rights to use, 11 | * copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | * copies of the Software, and to permit persons to whom the 13 | * Software is furnished to do so, subject to the following 14 | * conditions: 15 | * 16 | * The above copyright notice and this permission notice shall be 17 | * included in all copies or substantial portions of the Software. 18 | * 19 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 21 | * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 23 | * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 24 | * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 26 | * OTHER DEALINGS IN THE SOFTWARE. 27 | */ 28 | 29 | #import 30 | 31 | #import "BITFeedbackComposeViewControllerDelegate.h" 32 | 33 | /** 34 | UIActivity subclass allowing to use the feedback interface to share content with the developer 35 | 36 | This activity can be added into an UIActivityViewController and it will use the activity data 37 | objects to prefill the content of `BITFeedbackComposeViewController`. 38 | 39 | This can be useful if you present some data that users can not only share but also 40 | report back to the developer because they have some problems, e.g. webcams not working 41 | any more. 42 | 43 | The activity provide a default title and image that can be further customized 44 | via `customActivityImage` and `customActivityTitle`. 45 | 46 | */ 47 | 48 | @interface BITFeedbackActivity : UIActivity 49 | 50 | ///----------------------------------------------------------------------------- 51 | /// @name BITFeedbackActivity customisation 52 | ///----------------------------------------------------------------------------- 53 | 54 | 55 | /** 56 | Define the image shown when using `BITFeedbackActivity` 57 | 58 | If not set a default icon is being used. 59 | 60 | @see customActivityTitle 61 | */ 62 | @property (nonatomic, strong) UIImage *customActivityImage; 63 | 64 | 65 | /** 66 | Define the title shown when using `BITFeedbackActivity` 67 | 68 | If not set, a default string is shown by using the apps name 69 | and adding the localized string "Feedback" to it. 70 | 71 | @see customActivityImage 72 | */ 73 | @property (nonatomic, copy) NSString *customActivityTitle; 74 | 75 | @end 76 | -------------------------------------------------------------------------------- /Source/ThirdParty/IOS/HockeySDK.framework/Headers/BITFeedbackComposeViewController.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Author: Andreas Linde 3 | * 4 | * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. 5 | * All rights reserved. 6 | * 7 | * Permission is hereby granted, free of charge, to any person 8 | * obtaining a copy of this software and associated documentation 9 | * files (the "Software"), to deal in the Software without 10 | * restriction, including without limitation the rights to use, 11 | * copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | * copies of the Software, and to permit persons to whom the 13 | * Software is furnished to do so, subject to the following 14 | * conditions: 15 | * 16 | * The above copyright notice and this permission notice shall be 17 | * included in all copies or substantial portions of the Software. 18 | * 19 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 21 | * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 23 | * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 24 | * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 26 | * OTHER DEALINGS IN THE SOFTWARE. 27 | */ 28 | 29 | 30 | #import 31 | 32 | #import "BITFeedbackComposeViewControllerDelegate.h" 33 | 34 | /** 35 | View controller allowing the user to write and send new feedback 36 | 37 | To add this view controller to your own app and push it onto a navigation stack, 38 | don't create the instance yourself, but use the following code to get a correct instance: 39 | 40 | [[BITHockeyManager sharedHockeyManager].feedbackManager feedbackComposeViewController] 41 | 42 | To show it modally, use the following code instead: 43 | 44 | [[BITHockeyManager sharedHockeyManager].feedbackManager showFeedbackComposeView] 45 | 46 | */ 47 | 48 | @interface BITFeedbackComposeViewController : UIViewController 49 | 50 | 51 | ///----------------------------------------------------------------------------- 52 | /// @name Delegate 53 | ///----------------------------------------------------------------------------- 54 | 55 | 56 | /** 57 | Sets the `BITFeedbackComposeViewControllerDelegate` delegate. 58 | 59 | The delegate is automatically set by using `[BITHockeyManager setDelegate:]`. You 60 | should not need to set this delegate individually. 61 | 62 | @see [BITHockeyManager setDelegate:] 63 | */ 64 | @property (nonatomic, weak) id delegate; 65 | 66 | 67 | ///----------------------------------------------------------------------------- 68 | /// @name Presetting content 69 | ///----------------------------------------------------------------------------- 70 | 71 | 72 | /** 73 | Don't show the option to add images from the photo library 74 | 75 | This is helpful if your application is landscape only, since the system UI for 76 | selecting an image from the photo library is portrait only 77 | */ 78 | @property (nonatomic) BOOL hideImageAttachmentButton; 79 | 80 | /** 81 | An array of data objects that should be used to prefill the compose view content 82 | 83 | The following data object classes are currently supported: 84 | - NSString 85 | - NSURL 86 | - UIImage 87 | - NSData 88 | - `BITHockeyAttachment` 89 | 90 | These are automatically concatenated to one text string, while any images and NSData 91 | objects are added as attachments to the feedback. 92 | 93 | @param items Array of data objects to prefill the feedback text message. 94 | */ 95 | - (void)prepareWithItems:(NSArray *)items; 96 | 97 | @end 98 | -------------------------------------------------------------------------------- /Source/ThirdParty/IOS/HockeySDK.framework/Headers/BITFeedbackComposeViewControllerDelegate.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Author: Andreas Linde 3 | * 4 | * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. 5 | * All rights reserved. 6 | * 7 | * Permission is hereby granted, free of charge, to any person 8 | * obtaining a copy of this software and associated documentation 9 | * files (the "Software"), to deal in the Software without 10 | * restriction, including without limitation the rights to use, 11 | * copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | * copies of the Software, and to permit persons to whom the 13 | * Software is furnished to do so, subject to the following 14 | * conditions: 15 | * 16 | * The above copyright notice and this permission notice shall be 17 | * included in all copies or substantial portions of the Software. 18 | * 19 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 21 | * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 23 | * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 24 | * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 26 | * OTHER DEALINGS IN THE SOFTWARE. 27 | */ 28 | 29 | #import 30 | 31 | #import "HockeySDKNullability.h" 32 | NS_ASSUME_NONNULL_BEGIN 33 | 34 | /** 35 | * The users action when composing a message 36 | */ 37 | typedef NS_ENUM(NSUInteger, BITFeedbackComposeResult) { 38 | /** 39 | * user hit cancel 40 | */ 41 | BITFeedbackComposeResultCancelled, 42 | /** 43 | * user hit submit 44 | */ 45 | BITFeedbackComposeResultSubmitted, 46 | }; 47 | 48 | @class BITFeedbackComposeViewController; 49 | 50 | /** 51 | * The `BITFeedbackComposeViewControllerDelegate` formal protocol defines methods further configuring 52 | * the behaviour of `BITFeedbackComposeViewController`. 53 | */ 54 | 55 | @protocol BITFeedbackComposeViewControllerDelegate 56 | 57 | @optional 58 | 59 | ///----------------------------------------------------------------------------- 60 | /// @name View Controller Management 61 | ///----------------------------------------------------------------------------- 62 | 63 | /** 64 | * Invoked once the compose screen is finished via send or cancel 65 | * 66 | * If this is implemented, it's the responsibility of this method to dismiss the presented 67 | * `BITFeedbackComposeViewController` 68 | * 69 | * @param composeViewController The `BITFeedbackComposeViewController` instance invoking this delegate 70 | * @param composeResult The user action the lead to closing the compose view 71 | */ 72 | - (void)feedbackComposeViewController:(BITFeedbackComposeViewController *)composeViewController 73 | didFinishWithResult:(BITFeedbackComposeResult) composeResult; 74 | @end 75 | 76 | NS_ASSUME_NONNULL_END 77 | -------------------------------------------------------------------------------- /Source/ThirdParty/IOS/HockeySDK.framework/Headers/BITFeedbackListViewController.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Author: Andreas Linde 3 | * 4 | * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. 5 | * All rights reserved. 6 | * 7 | * Permission is hereby granted, free of charge, to any person 8 | * obtaining a copy of this software and associated documentation 9 | * files (the "Software"), to deal in the Software without 10 | * restriction, including without limitation the rights to use, 11 | * copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | * copies of the Software, and to permit persons to whom the 13 | * Software is furnished to do so, subject to the following 14 | * conditions: 15 | * 16 | * The above copyright notice and this permission notice shall be 17 | * included in all copies or substantial portions of the Software. 18 | * 19 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 21 | * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 23 | * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 24 | * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 26 | * OTHER DEALINGS IN THE SOFTWARE. 27 | */ 28 | 29 | 30 | #import 31 | #import 32 | 33 | #import "BITHockeyBaseViewController.h" 34 | 35 | /** 36 | View controller providing a default interface to manage feedback 37 | 38 | The message list interface contains options to locally delete single messages 39 | by swiping over them, or deleting all messages. This will not delete the messages 40 | on the server though! 41 | 42 | It is also integrates actions to invoke the user interface to compose a new messages, 43 | reload the list content from the server and changing the users name or email if these 44 | are allowed to be set. 45 | 46 | To add this view controller to your own app and push it onto a navigation stack, 47 | don't create the instance yourself, but use the following code to get a correct instance: 48 | 49 | [[BITHockeyManager sharedHockeyManager].feedbackManager feedbackListViewController:NO] 50 | 51 | To show it modally, use the following code instead: 52 | 53 | [[BITHockeyManager sharedHockeyManager].feedbackManager feedbackListViewController:YES] 54 | 55 | This ensures that the presentation on iOS 6 and iOS 7 will use the current design on each OS Version. 56 | */ 57 | 58 | @interface BITFeedbackListViewController : BITHockeyBaseViewController { 59 | } 60 | 61 | @end 62 | -------------------------------------------------------------------------------- /Source/ThirdParty/IOS/HockeySDK.framework/Headers/BITFeedbackManagerDelegate.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Authors: Stephan Diederich, Benjamin Scholtysik 3 | * 4 | * Copyright (c) 2013-2016 HockeyApp, Bit Stadium GmbH. 5 | * All rights reserved. 6 | * 7 | * Permission is hereby granted, free of charge, to any person 8 | * obtaining a copy of this software and associated documentation 9 | * files (the "Software"), to deal in the Software without 10 | * restriction, including without limitation the rights to use, 11 | * copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | * copies of the Software, and to permit persons to whom the 13 | * Software is furnished to do so, subject to the following 14 | * conditions: 15 | * 16 | * The above copyright notice and this permission notice shall be 17 | * included in all copies or substantial portions of the Software. 18 | * 19 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 21 | * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 23 | * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 24 | * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 26 | * OTHER DEALINGS IN THE SOFTWARE. 27 | */ 28 | 29 | #import 30 | #import "BITFeedbackComposeViewControllerDelegate.h" 31 | 32 | #import "HockeySDKNullability.h" 33 | NS_ASSUME_NONNULL_BEGIN 34 | 35 | @class BITFeedbackManager; 36 | 37 | /** 38 | * Delegate protocol which is notified about changes in the feedbackManager 39 | * @TODO 40 | * * move shouldShowUpdateAlert from feedbackManager here 41 | */ 42 | @protocol BITFeedbackManagerDelegate 43 | 44 | @optional 45 | 46 | /** 47 | * Can be implemented to control wether the feedback manager should automatically 48 | * fetch for new messages on app startup or when becoming active. 49 | * 50 | * By default the SDK fetches on app startup or when the app is becoming active again 51 | * if there are already messages existing or pending on the device. 52 | * 53 | * You could disable it e.g. depending on available mobile network/WLAN connection 54 | * or let it fetch less frequently. 55 | * 56 | * @param feedbackManager The feedbackManager which did detect the new messages 57 | */ 58 | - (BOOL)allowAutomaticFetchingForNewFeedbackForManager:(BITFeedbackManager *)feedbackManager; 59 | 60 | 61 | /** 62 | * can be implemented to know when new feedback from the server arrived 63 | * 64 | * @param feedbackManager The feedbackManager which did detect the new messages 65 | */ 66 | - (void)feedbackManagerDidReceiveNewFeedback:(BITFeedbackManager *)feedbackManager; 67 | 68 | 69 | /** 70 | * This optional method can be implemented to provide items to prefill 71 | * the FeedbackComposeMessage user interface with the given items. 72 | * 73 | * If the user sends the feedback message, these items will be attached to that message. 74 | * 75 | * All NSString-Content in the array will be concatenated and result in the message, 76 | * while all UIImage and NSData-instances will be turned into attachments. 77 | * 78 | * @param feedbackManager The BITFeedbackManager instance that will handle sending the feedback. 79 | * 80 | * @return An array containing the items to be attached to the feedback message 81 | * @see `[BITFeedbackComposeViewController prepareWithItems:] 82 | */ 83 | - (nullable NSArray *)preparedItemsForFeedbackManager:(BITFeedbackManager *)feedbackManager; 84 | 85 | /** 86 | * Indicates if a new thread should be created for each new feedback message 87 | * 88 | * Setting it to `YES` will force a new thread whenever a new message is sent as 89 | * opposed to the default resume thread behaviour. 90 | * 91 | * @return A BOOL indicating if each feedback message should be sent as a new thread. 92 | */ 93 | - (BOOL)forceNewFeedbackThreadForFeedbackManager:(BITFeedbackManager *)feedbackManager; 94 | 95 | @end 96 | 97 | NS_ASSUME_NONNULL_END 98 | -------------------------------------------------------------------------------- /Source/ThirdParty/IOS/HockeySDK.framework/Headers/BITHockeyAttachment.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Author: Andreas Linde 3 | * 4 | * Copyright (c) 2014 HockeyApp, Bit Stadium GmbH. 5 | * All rights reserved. 6 | * 7 | * Permission is hereby granted, free of charge, to any person 8 | * obtaining a copy of this software and associated documentation 9 | * files (the "Software"), to deal in the Software without 10 | * restriction, including without limitation the rights to use, 11 | * copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | * copies of the Software, and to permit persons to whom the 13 | * Software is furnished to do so, subject to the following 14 | * conditions: 15 | * 16 | * The above copyright notice and this permission notice shall be 17 | * included in all copies or substantial portions of the Software. 18 | * 19 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 21 | * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 23 | * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 24 | * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 26 | * OTHER DEALINGS IN THE SOFTWARE. 27 | */ 28 | 29 | #import 30 | 31 | /** 32 | Provides support to add binary attachments to crash reports and feedback messages 33 | 34 | This is used by `[BITCrashManagerDelegate attachmentForCrashManager:]`, 35 | `[BITFeedbackComposeViewController prepareWithItems:]` and 36 | `[BITFeedbackManager showFeedbackComposeViewWithPreparedItems:]` 37 | */ 38 | @interface BITHockeyAttachment : NSObject 39 | 40 | /** 41 | The filename the attachment should get 42 | */ 43 | @property (nonatomic, readonly, copy) NSString *filename; 44 | 45 | /** 46 | The attachment data as NSData object 47 | */ 48 | @property (nonatomic, readonly, strong) NSData *hockeyAttachmentData; 49 | 50 | /** 51 | The content type of your data as MIME type 52 | */ 53 | @property (nonatomic, readonly, copy) NSString *contentType; 54 | 55 | /** 56 | Create an BITHockeyAttachment instance with a given filename and NSData object 57 | 58 | @param filename The filename the attachment should get. If nil will get a automatically generated filename 59 | @param hockeyAttachmentData The attachment data as NSData. The instance will be ignore if this is set to nil! 60 | @param contentType The content type of your data as MIME type. If nil will be set to "application/octet-stream" 61 | 62 | @return An instance of BITHockeyAttachment. 63 | */ 64 | - (instancetype)initWithFilename:(NSString *)filename 65 | hockeyAttachmentData:(NSData *)hockeyAttachmentData 66 | contentType:(NSString *)contentType; 67 | 68 | @end 69 | -------------------------------------------------------------------------------- /Source/ThirdParty/IOS/HockeySDK.framework/Headers/BITHockeyBaseManager.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Author: Andreas Linde 3 | * 4 | * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. 5 | * All rights reserved. 6 | * 7 | * Permission is hereby granted, free of charge, to any person 8 | * obtaining a copy of this software and associated documentation 9 | * files (the "Software"), to deal in the Software without 10 | * restriction, including without limitation the rights to use, 11 | * copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | * copies of the Software, and to permit persons to whom the 13 | * Software is furnished to do so, subject to the following 14 | * conditions: 15 | * 16 | * The above copyright notice and this permission notice shall be 17 | * included in all copies or substantial portions of the Software. 18 | * 19 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 21 | * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 23 | * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 24 | * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 26 | * OTHER DEALINGS IN THE SOFTWARE. 27 | */ 28 | 29 | #import 30 | #import 31 | 32 | 33 | /** 34 | The internal superclass for all component managers 35 | 36 | */ 37 | 38 | @interface BITHockeyBaseManager : NSObject 39 | 40 | ///----------------------------------------------------------------------------- 41 | /// @name Modules 42 | ///----------------------------------------------------------------------------- 43 | 44 | 45 | /** 46 | Defines the server URL to send data to or request data from 47 | 48 | By default this is set to the HockeyApp servers and there rarely should be a 49 | need to modify that. 50 | */ 51 | @property (nonatomic, copy) NSString *serverURL; 52 | 53 | 54 | ///----------------------------------------------------------------------------- 55 | /// @name User Interface 56 | ///----------------------------------------------------------------------------- 57 | 58 | /** 59 | The UIBarStyle of the update user interface navigation bar. 60 | 61 | Default is UIBarStyleBlackOpaque 62 | @see navigationBarTintColor 63 | */ 64 | @property (nonatomic, assign) UIBarStyle barStyle; 65 | 66 | /** 67 | The navigationbar tint color of the update user interface navigation bar. 68 | 69 | The navigationBarTintColor is used by default, you can either overwrite it `navigationBarTintColor` 70 | or define another `barStyle` instead. 71 | 72 | Default is RGB(25, 25, 25) 73 | @see barStyle 74 | */ 75 | @property (nonatomic, strong) UIColor *navigationBarTintColor; 76 | 77 | /** 78 | The UIModalPresentationStyle for showing the update user interface when invoked 79 | with the update alert. 80 | */ 81 | @property (nonatomic, assign) UIModalPresentationStyle modalPresentationStyle; 82 | 83 | 84 | @end 85 | -------------------------------------------------------------------------------- /Source/ThirdParty/IOS/HockeySDK.framework/Headers/BITHockeyBaseViewController.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Author: Andreas Linde 3 | * 4 | * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. 5 | * All rights reserved. 6 | * 7 | * Permission is hereby granted, free of charge, to any person 8 | * obtaining a copy of this software and associated documentation 9 | * files (the "Software"), to deal in the Software without 10 | * restriction, including without limitation the rights to use, 11 | * copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | * copies of the Software, and to permit persons to whom the 13 | * Software is furnished to do so, subject to the following 14 | * conditions: 15 | * 16 | * The above copyright notice and this permission notice shall be 17 | * included in all copies or substantial portions of the Software. 18 | * 19 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 21 | * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 23 | * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 24 | * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 26 | * OTHER DEALINGS IN THE SOFTWARE. 27 | */ 28 | 29 | #import 30 | 31 | @interface BITHockeyBaseViewController : UITableViewController 32 | 33 | @property (nonatomic, readwrite) BOOL modalAnimated; 34 | 35 | - (instancetype)initWithModalStyle:(BOOL)modal; 36 | - (instancetype)initWithStyle:(UITableViewStyle)style modal:(BOOL)modal; 37 | 38 | @end 39 | -------------------------------------------------------------------------------- /Source/ThirdParty/IOS/HockeySDK.framework/Headers/BITHockeyLogger.h: -------------------------------------------------------------------------------- 1 | // Adapted from 0xced’s post at http://stackoverflow.com/questions/34732814/how-should-i-handle-logs-in-an-objective-c-library/34732815#34732815 2 | 3 | #import 4 | #import "HockeySDKEnums.h" 5 | 6 | #define BITHockeyLog(_level, _message) [BITHockeyLogger logMessage:_message level:_level file:__FILE__ function:__PRETTY_FUNCTION__ line:__LINE__] 7 | 8 | #define BITHockeyLogError(format, ...) BITHockeyLog(BITLogLevelError, (^{ return [NSString stringWithFormat:(format), ##__VA_ARGS__]; })) 9 | #define BITHockeyLogWarning(format, ...) BITHockeyLog(BITLogLevelWarning, (^{ return [NSString stringWithFormat:(format), ##__VA_ARGS__]; })) 10 | #define BITHockeyLogDebug(format, ...) BITHockeyLog(BITLogLevelDebug, (^{ return [NSString stringWithFormat:(format), ##__VA_ARGS__]; })) 11 | #define BITHockeyLogVerbose(format, ...) BITHockeyLog(BITLogLevelVerbose, (^{ return [NSString stringWithFormat:(format), ##__VA_ARGS__]; })) 12 | 13 | @interface BITHockeyLogger : NSObject 14 | 15 | + (BITLogLevel)currentLogLevel; 16 | + (void)setCurrentLogLevel:(BITLogLevel)currentLogLevel; 17 | + (void)setLogHandler:(BITLogHandler)logHandler; 18 | 19 | + (void)logMessage:(BITLogMessageProvider)messageProvider level:(BITLogLevel)loglevel file:(const char *)file function:(const char *)function line:(uint)line; 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /Source/ThirdParty/IOS/HockeySDK.framework/Headers/BITHockeyManagerDelegate.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Author: Andreas Linde 3 | * 4 | * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. 5 | * All rights reserved. 6 | * 7 | * Permission is hereby granted, free of charge, to any person 8 | * obtaining a copy of this software and associated documentation 9 | * files (the "Software"), to deal in the Software without 10 | * restriction, including without limitation the rights to use, 11 | * copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | * copies of the Software, and to permit persons to whom the 13 | * Software is furnished to do so, subject to the following 14 | * conditions: 15 | * 16 | * The above copyright notice and this permission notice shall be 17 | * included in all copies or substantial portions of the Software. 18 | * 19 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 21 | * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 23 | * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 24 | * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 26 | * OTHER DEALINGS IN THE SOFTWARE. 27 | */ 28 | 29 | #import 30 | #import "HockeySDKFeatureConfig.h" 31 | 32 | #if HOCKEYSDK_FEATURE_CRASH_REPORTER 33 | #import "BITCrashManagerDelegate.h" 34 | #endif 35 | 36 | #if HOCKEYSDK_FEATURE_UPDATES 37 | #import "BITUpdateManagerDelegate.h" 38 | #endif 39 | 40 | #if HOCKEYSDK_FEATURE_FEEDBACK 41 | #import "BITFeedbackManagerDelegate.h" 42 | #endif 43 | 44 | #if HOCKEYSDK_FEATURE_STORE_UPDATES 45 | #import "BITStoreUpdateManagerDelegate.h" 46 | #endif 47 | 48 | #if HOCKEYSDK_FEATURE_AUTHENTICATOR 49 | #import "BITAuthenticator.h" 50 | #endif 51 | 52 | #import "BITHockeyUserData.h" 53 | 54 | @class BITHockeyManager; 55 | @class BITHockeyBaseManager; 56 | 57 | /** 58 | The `BITHockeyManagerDelegate` formal protocol defines methods further configuring 59 | the behaviour of `BITHockeyManager`, as well as the delegate of the modules it manages. 60 | */ 61 | 62 | @protocol BITHockeyManagerDelegate 79 | 80 | @optional 81 | 82 | 83 | ///----------------------------------------------------------------------------- 84 | /// @name App Identifier usage 85 | ///----------------------------------------------------------------------------- 86 | 87 | /** 88 | Implement to force the usage of the live identifier 89 | 90 | This is useful if you are e.g. distributing an enterprise app inside your company 91 | and want to use the `liveIdentifier` for that even though it is not running from 92 | the App Store. 93 | 94 | Example: 95 | 96 | - (BOOL)shouldUseLiveIdentifierForHockeyManager:(BITHockeyManager *)hockeyManager { 97 | #ifdef (CONFIGURATION_AppStore) 98 | return YES; 99 | #endif 100 | return NO; 101 | } 102 | 103 | @param hockeyManager BITHockeyManager instance 104 | */ 105 | - (BOOL)shouldUseLiveIdentifierForHockeyManager:(BITHockeyManager *)hockeyManager; 106 | 107 | 108 | ///----------------------------------------------------------------------------- 109 | /// @name UI presentation 110 | ///----------------------------------------------------------------------------- 111 | 112 | 113 | // optional parent view controller for the feedback screen when invoked via the alert view, default is the root UIWindow instance 114 | /** 115 | Return a custom parent view controller for presenting modal sheets 116 | 117 | By default the SDK is using the root UIWindow instance to present any required 118 | view controllers. Overwrite this if this doesn't result in a satisfying 119 | behavior or if you want to define any other parent view controller. 120 | 121 | @param hockeyManager The `BITHockeyManager` HockeyManager instance invoking this delegate 122 | @param componentManager The `BITHockeyBaseManager` component instance invoking this delegate, can be `BITCrashManager` or `BITFeedbackManager` 123 | */ 124 | - (UIViewController *)viewControllerForHockeyManager:(BITHockeyManager *)hockeyManager componentManager:(BITHockeyBaseManager *)componentManager; 125 | 126 | 127 | ///----------------------------------------------------------------------------- 128 | /// @name Additional meta data 129 | ///----------------------------------------------------------------------------- 130 | 131 | 132 | /** Return the userid that should used in the SDK components 133 | 134 | Right now this is used by the `BITCrashManager` to attach to a crash report. 135 | `BITFeedbackManager` uses it too for assigning the user to a discussion thread. 136 | 137 | In addition, if this returns not nil for `BITFeedbackManager` the user will 138 | not be asked for any user details by the component, including userName or userEmail. 139 | 140 | You can find out the component requesting the userID like this: 141 | 142 | - (NSString *)userIDForHockeyManager:(BITHockeyManager *)hockeyManager componentManager:(BITHockeyBaseManager *)componentManager { 143 | if (componentManager == hockeyManager.feedbackManager) { 144 | return UserIDForFeedback; 145 | } else if (componentManager == hockeyManager.crashManager) { 146 | return UserIDForCrashReports; 147 | } else { 148 | return nil; 149 | } 150 | } 151 | 152 | For crash reports, this delegate is invoked on the startup after the crash! 153 | 154 | @warning When returning a non nil value for the `BITCrashManager` component, crash reports 155 | are not anonymous any more and the crash alerts will not show the word "anonymous"! 156 | 157 | @param hockeyManager The `BITHockeyManager` HockeyManager instance invoking this delegate 158 | @param componentManager The `BITHockeyBaseManager` component instance invoking this delegate, can be `BITCrashManager` or `BITFeedbackManager` 159 | @see userNameForHockeyManager:componentManager: 160 | @see userEmailForHockeyManager:componentManager: 161 | @see [BITHockeyManager userID] 162 | */ 163 | - (NSString *)userIDForHockeyManager:(BITHockeyManager *)hockeyManager componentManager:(BITHockeyBaseManager *)componentManager; 164 | 165 | 166 | /** Return the user name that should used in the SDK components 167 | 168 | Right now this is used by the `BITCrashManager` to attach to a crash report. 169 | `BITFeedbackManager` uses it too for assigning the user to a discussion thread. 170 | 171 | In addition, if this returns not nil for `BITFeedbackManager` the user will 172 | not be asked for any user details by the component, including userName or userEmail. 173 | 174 | You can find out the component requesting the user name like this: 175 | 176 | - (NSString *)userNameForHockeyManager:(BITHockeyManager *)hockeyManager componentManager:(BITHockeyBaseManager *)componentManager { 177 | if (componentManager == hockeyManager.feedbackManager) { 178 | return UserNameForFeedback; 179 | } else if (componentManager == hockeyManager.crashManager) { 180 | return UserNameForCrashReports; 181 | } else { 182 | return nil; 183 | } 184 | } 185 | 186 | For crash reports, this delegate is invoked on the startup after the crash! 187 | 188 | @warning When returning a non nil value for the `BITCrashManager` component, crash reports 189 | are not anonymous any more and the crash alerts will not show the word "anonymous"! 190 | 191 | @param hockeyManager The `BITHockeyManager` HockeyManager instance invoking this delegate 192 | @param componentManager The `BITHockeyBaseManager` component instance invoking this delegate, can be `BITCrashManager` or `BITFeedbackManager` 193 | @see userIDForHockeyManager:componentManager: 194 | @see userEmailForHockeyManager:componentManager: 195 | @see [BITHockeyManager userName] 196 | */ 197 | - (NSString *)userNameForHockeyManager:(BITHockeyManager *)hockeyManager componentManager:(BITHockeyBaseManager *)componentManager; 198 | 199 | 200 | /** Return the users email address that should used in the SDK components 201 | 202 | Right now this is used by the `BITCrashManager` to attach to a crash report. 203 | `BITFeedbackManager` uses it too for assigning the user to a discussion thread. 204 | 205 | In addition, if this returns not nil for `BITFeedbackManager` the user will 206 | not be asked for any user details by the component, including userName or userEmail. 207 | 208 | You can find out the component requesting the user email like this: 209 | 210 | - (NSString *)userEmailForHockeyManager:(BITHockeyManager *)hockeyManager componentManager:(BITHockeyBaseManager *)componentManager { 211 | if (componentManager == hockeyManager.feedbackManager) { 212 | return UserEmailForFeedback; 213 | } else if (componentManager == hockeyManager.crashManager) { 214 | return UserEmailForCrashReports; 215 | } else { 216 | return nil; 217 | } 218 | } 219 | 220 | For crash reports, this delegate is invoked on the startup after the crash! 221 | 222 | @warning When returning a non nil value for the `BITCrashManager` component, crash reports 223 | are not anonymous any more and the crash alerts will not show the word "anonymous"! 224 | 225 | @param hockeyManager The `BITHockeyManager` HockeyManager instance invoking this delegate 226 | @param componentManager The `BITHockeyBaseManager` component instance invoking this delegate, can be `BITCrashManager` or `BITFeedbackManager` 227 | @see userIDForHockeyManager:componentManager: 228 | @see userNameForHockeyManager:componentManager: 229 | @see [BITHockeyManager userEmail] 230 | */ 231 | - (NSString *)userEmailForHockeyManager:(BITHockeyManager *)hockeyManager componentManager:(BITHockeyBaseManager *)componentManager; 232 | 233 | 234 | /** Called after user manually submits meta data when prompted, for a crash report or Feedback form. 235 | Delegate should evaluate userProvidedData to determine if userID, userName and userEmail should be persisted. 236 | If user choose "always send" this delegate will not be called again. 237 | 238 | @param userProvidedData The BITHockeyUserData filled in with any user provided data: possibly userID, userName, userEmail, userProvidedText. 239 | @param hockeyManager The `BITHockeyManager` HockeyManager instance invoking this delegate 240 | @param componentManager The `BITHockeyBaseManager` component instance invoking this delegate, can be `BITCrashManager` or `BITFeedbackManager` 241 | */ 242 | - (void)userProvidedData:(BITHockeyUserData *)userProvidedData hockeyManager:(BITHockeyManager *)hockeyManager componentManager:(BITHockeyBaseManager *)componentManager; 243 | 244 | @end 245 | -------------------------------------------------------------------------------- /Source/ThirdParty/IOS/HockeySDK.framework/Headers/BITHockeyUserData.h: -------------------------------------------------------------------------------- 1 | // 2 | // BITHockeyUserData.h 3 | // HockeySDK 4 | // 5 | 6 | #import 7 | 8 | 9 | @interface BITHockeyUserData : NSObject 10 | 11 | /** 12 | * User provided userName 13 | */ 14 | @property (nonatomic, copy, nullable) NSString *userName; 15 | 16 | /** 17 | * User provide userEmail 18 | */ 19 | @property (nonatomic, copy, nullable) NSString *userEmail; 20 | 21 | /** 22 | * User provided description text 23 | */ 24 | @property (nonatomic, copy, nullable) NSString *userProvidedText; 25 | 26 | @end 27 | -------------------------------------------------------------------------------- /Source/ThirdParty/IOS/HockeySDK.framework/Headers/BITMetricsManager.h: -------------------------------------------------------------------------------- 1 | #import "HockeySDKFeatureConfig.h" 2 | 3 | #if HOCKEYSDK_FEATURE_METRICS 4 | 5 | #import 6 | #import "BITHockeyBaseManager.h" 7 | 8 | #import "HockeySDKNullability.h" 9 | NS_ASSUME_NONNULL_BEGIN 10 | 11 | /** 12 | The metrics module. 13 | 14 | This is the HockeySDK module that handles users, sessions and events tracking. 15 | 16 | Unless disabled, this module automatically tracks users and session of your app to give you 17 | better insights about how your app is being used. 18 | Users are tracked in a completely anonymous way without collecting any personally identifiable 19 | information. 20 | 21 | Before starting to track events, ask yourself the questions that you want to get answers to. 22 | For instance, you might be interested in business, performance/quality or user experience aspects. 23 | Name your events in a meaningful way and keep in mind that you will use these names 24 | when searching for events in the HockeyApp web portal. 25 | 26 | It is your reponsibility to not collect personal information as part of the events tracking or get 27 | prior consent from your users as necessary. 28 | */ 29 | @interface BITMetricsManager : BITHockeyBaseManager 30 | 31 | /** 32 | * A property indicating whether the BITMetricsManager instance is disabled. 33 | */ 34 | @property (nonatomic, assign) BOOL disabled; 35 | 36 | /** 37 | * This method allows to track an event that happened in your app. 38 | * Remember to choose meaningful event names to have the best experience when diagnosing your app 39 | * in the HockeyApp web portal. 40 | * 41 | * @param eventName The event's name as a string. 42 | */ 43 | - (void)trackEventWithName:(nonnull NSString *)eventName; 44 | 45 | /** 46 | * This method allows to track an event that happened in your app. 47 | * Remember to choose meaningful event names to have the best experience when diagnosing your app 48 | * in the web portal. 49 | * 50 | * @param eventName the name of the event, which should be tracked. 51 | * @param properties key value pairs with additional info about the event. 52 | * @param measurements key value pairs, which contain custom metrics. 53 | */ 54 | - (void)trackEventWithName:(nonnull NSString *)eventName properties:(nullable NSDictionary *)properties measurements:(nullable NSDictionary *)measurements; 55 | 56 | @end 57 | 58 | NS_ASSUME_NONNULL_END 59 | 60 | #endif /* HOCKEYSDK_FEATURE_METRICS */ 61 | -------------------------------------------------------------------------------- /Source/ThirdParty/IOS/HockeySDK.framework/Headers/BITStoreUpdateManager.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Author: Andreas Linde 3 | * 4 | * Copyright (c) 2013-2014 HockeyApp, Bit Stadium GmbH. 5 | * All rights reserved. 6 | * 7 | * Permission is hereby granted, free of charge, to any person 8 | * obtaining a copy of this software and associated documentation 9 | * files (the "Software"), to deal in the Software without 10 | * restriction, including without limitation the rights to use, 11 | * copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | * copies of the Software, and to permit persons to whom the 13 | * Software is furnished to do so, subject to the following 14 | * conditions: 15 | * 16 | * The above copyright notice and this permission notice shall be 17 | * included in all copies or substantial portions of the Software. 18 | * 19 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 21 | * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 23 | * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 24 | * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 26 | * OTHER DEALINGS IN THE SOFTWARE. 27 | */ 28 | 29 | 30 | #import 31 | #import "BITHockeyBaseManager.h" 32 | 33 | 34 | /** 35 | * Defines the update check intervals 36 | */ 37 | typedef NS_ENUM(NSInteger, BITStoreUpdateSetting) { 38 | /** 39 | * Check every day 40 | */ 41 | BITStoreUpdateCheckDaily = 0, 42 | /** 43 | * Check every week 44 | */ 45 | BITStoreUpdateCheckWeekly = 1, 46 | /** 47 | * Check manually 48 | */ 49 | BITStoreUpdateCheckManually = 2 50 | }; 51 | 52 | @protocol BITStoreUpdateManagerDelegate; 53 | 54 | /** 55 | The store update manager module. 56 | 57 | This is the HockeySDK module for handling app updates when having your app released in the App Store. 58 | By default the module uses the current users locale to define the app store to check for updates. You 59 | can modify this using the `countryCode` property. See the property documentation for details on its usage. 60 | 61 | When an update is detected, this module will show an alert asking the user if he/she wants to update or 62 | ignore this version. If update was chosen, it will open the apps page in the app store app. 63 | 64 | You need to enable this module using `[BITHockeyManager enableStoreUpdateManager]` if you want to use this 65 | feature. By default this module is disabled! 66 | 67 | When this module is enabled and **NOT** running in an App Store build/environment, it won't do any checks! 68 | 69 | The `BITStoreUpdateManagerDelegate` protocol informs the app about new detected app versions. 70 | 71 | @warning This module can **NOT** check if the current device and OS version match the minimum requirements of 72 | the new app version! 73 | 74 | */ 75 | 76 | @interface BITStoreUpdateManager : BITHockeyBaseManager 77 | 78 | ///----------------------------------------------------------------------------- 79 | /// @name Update Checking 80 | ///----------------------------------------------------------------------------- 81 | 82 | /** 83 | When to check for new updates. 84 | 85 | Defines when a the SDK should check if there is a new update available on the 86 | server. This must be assigned one of the following, see `BITStoreUpdateSetting`: 87 | 88 | - `BITStoreUpdateCheckDaily`: Once a day 89 | - `BITStoreUpdateCheckWeekly`: Once a week 90 | - `BITStoreUpdateCheckManually`: Manually 91 | 92 | **Default**: BITStoreUpdateCheckWeekly 93 | 94 | @warning When setting this to `BITStoreUpdateCheckManually` you need to either 95 | invoke the update checking process yourself with `checkForUpdate` somehow, e.g. by 96 | proving an update check button for the user or integrating the Update View into your 97 | user interface. 98 | @see BITStoreUpdateSetting 99 | @see countryCode 100 | @see checkForUpdateOnLaunch 101 | @see checkForUpdate 102 | */ 103 | @property (nonatomic, assign) BITStoreUpdateSetting updateSetting; 104 | 105 | 106 | /** 107 | Defines the store country the app is always available in, otherwise uses the users locale 108 | 109 | If this value is not defined, then it uses the device country if the current locale. 110 | 111 | If you are pre-defining a country and are releasing a new version on a specific date, 112 | it can happen that users get an alert but the update is not yet available in their country! 113 | 114 | But if a user downloaded the app from another appstore than the locale is set and the app is not 115 | available in the locales app store, then the user will never receive an update notification! 116 | 117 | More information about possible country codes is available here: http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2 118 | 119 | @see updateSetting 120 | @see checkForUpdateOnLaunch 121 | @see checkForUpdate 122 | */ 123 | @property (nonatomic, copy) NSString *countryCode; 124 | 125 | 126 | /** 127 | Flag that determines whether the automatic update checks should be done. 128 | 129 | If this is enabled the update checks will be performed automatically depending on the 130 | `updateSetting` property. If this is disabled the `updateSetting` property will have 131 | no effect, and checking for updates is totally up to be done by yourself. 132 | 133 | *Default*: _YES_ 134 | 135 | @warning When setting this to `NO` you need to invoke update checks yourself! 136 | @see updateSetting 137 | @see countryCode 138 | @see checkForUpdate 139 | */ 140 | @property (nonatomic, assign, getter=isCheckingForUpdateOnLaunch) BOOL checkForUpdateOnLaunch; 141 | 142 | 143 | ///----------------------------------------------------------------------------- 144 | /// @name User Interface 145 | ///----------------------------------------------------------------------------- 146 | 147 | 148 | /** 149 | Flag that determines if the integrated update alert should be used 150 | 151 | If enabled, the integrated UIAlert based update notification will be used to inform 152 | the user about a new update being available in the App Store. 153 | 154 | If disabled, you need to implement the `BITStoreUpdateManagerDelegate` protocol with 155 | the method `[BITStoreUpdateManagerDelegate detectedUpdateFromStoreUpdateManager:newVersion:storeURL:]` 156 | to be notified about new version and proceed yourself. 157 | The manager will consider this identical to an `Ignore` user action using the alert 158 | and not inform about this particular version any more, unless the app is updated 159 | and this very same version shows up at a later time again as a new version. 160 | 161 | *Default*: _YES_ 162 | 163 | @warning If the HockeySDKResources bundle is missing in the application package, then the internal 164 | update alert is also disabled and be treated identical to manually disabling this 165 | property. 166 | @see updateSetting 167 | */ 168 | @property (nonatomic, assign, getter=isUpdateUIEnabled) BOOL updateUIEnabled; 169 | 170 | ///----------------------------------------------------------------------------- 171 | /// @name Manual update checking 172 | ///----------------------------------------------------------------------------- 173 | 174 | /** 175 | Check for an update 176 | 177 | Call this to trigger a check if there is a new update available on the HockeyApp servers. 178 | 179 | @see updateSetting 180 | @see countryCode 181 | @see checkForUpdateOnLaunch 182 | */ 183 | - (void)checkForUpdate; 184 | 185 | 186 | @end 187 | -------------------------------------------------------------------------------- /Source/ThirdParty/IOS/HockeySDK.framework/Headers/BITStoreUpdateManagerDelegate.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Author: Andreas Linde 3 | * 4 | * Copyright (c) 2013-2014 HockeyApp, Bit Stadium GmbH. 5 | * All rights reserved. 6 | * 7 | * Permission is hereby granted, free of charge, to any person 8 | * obtaining a copy of this software and associated documentation 9 | * files (the "Software"), to deal in the Software without 10 | * restriction, including without limitation the rights to use, 11 | * copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | * copies of the Software, and to permit persons to whom the 13 | * Software is furnished to do so, subject to the following 14 | * conditions: 15 | * 16 | * The above copyright notice and this permission notice shall be 17 | * included in all copies or substantial portions of the Software. 18 | * 19 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 21 | * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 23 | * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 24 | * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 26 | * OTHER DEALINGS IN THE SOFTWARE. 27 | */ 28 | 29 | #import 30 | 31 | @class BITStoreUpdateManager; 32 | 33 | /** 34 | The `BITStoreUpdateManagerDelegate` formal protocol defines methods for 35 | more interaction with `BITStoreUpdateManager`. 36 | */ 37 | 38 | @protocol BITStoreUpdateManagerDelegate 39 | 40 | @optional 41 | 42 | 43 | ///----------------------------------------------------------------------------- 44 | /// @name Update information 45 | ///----------------------------------------------------------------------------- 46 | 47 | /** Informs which new version has been reported to be available 48 | 49 | @warning If this is invoked with a simulated new version, the storeURL could be _NIL_ if the current builds 50 | bundle identifier is different to the bundle identifier used in the app store build. 51 | @param storeUpdateManager The `BITStoreUpdateManager` instance invoking this delegate 52 | @param newVersion The new version string reported by the App Store 53 | @param storeURL The App Store URL for this app that could be invoked to let them perform the update. 54 | */ 55 | -(void)detectedUpdateFromStoreUpdateManager:(BITStoreUpdateManager *)storeUpdateManager newVersion:(NSString *)newVersion storeURL:(NSURL *)storeURL; 56 | 57 | 58 | 59 | @end 60 | -------------------------------------------------------------------------------- /Source/ThirdParty/IOS/HockeySDK.framework/Headers/BITUpdateManager.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Author: Andreas Linde 3 | * Peter Steinberger 4 | * 5 | * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. 6 | * Copyright (c) 2011 Andreas Linde. 7 | * All rights reserved. 8 | * 9 | * Permission is hereby granted, free of charge, to any person 10 | * obtaining a copy of this software and associated documentation 11 | * files (the "Software"), to deal in the Software without 12 | * restriction, including without limitation the rights to use, 13 | * copy, modify, merge, publish, distribute, sublicense, and/or sell 14 | * copies of the Software, and to permit persons to whom the 15 | * Software is furnished to do so, subject to the following 16 | * conditions: 17 | * 18 | * The above copyright notice and this permission notice shall be 19 | * included in all copies or substantial portions of the Software. 20 | * 21 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 22 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 23 | * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 24 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 25 | * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 26 | * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 27 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 28 | * OTHER DEALINGS IN THE SOFTWARE. 29 | */ 30 | 31 | 32 | #import "BITHockeyBaseManager.h" 33 | 34 | 35 | /** 36 | * Update check interval 37 | */ 38 | typedef NS_ENUM (NSUInteger, BITUpdateSetting) { 39 | /** 40 | * On every startup or or when the app comes to the foreground 41 | */ 42 | BITUpdateCheckStartup = 0, 43 | /** 44 | * Once a day 45 | */ 46 | BITUpdateCheckDaily = 1, 47 | /** 48 | * Manually 49 | */ 50 | BITUpdateCheckManually = 2 51 | }; 52 | 53 | @protocol BITUpdateManagerDelegate; 54 | 55 | @class BITAppVersionMetaInfo; 56 | @class BITUpdateViewController; 57 | 58 | /** 59 | The update manager module. 60 | 61 | This is the HockeySDK module for handling app updates when using Ad-Hoc or Enterprise provisioning profiles. 62 | This module handles version updates, presents update and version information in an App Store like user interface, 63 | collects usage information and provides additional authorization options when using Ad-Hoc provisioning profiles. 64 | 65 | By default, this module automatically disables itself when running in an App Store build! 66 | 67 | The protocol `BITUpdateManagerDelegate` provides delegates to inform about events and adjust a few behaviors. 68 | 69 | To use the server side restriction feature, to provide updates only to specific users, you need to setup the 70 | `BITAuthenticator` class. This allows the update request to tell the server which user is using the app on the 71 | current device and then let the server decide which updates the device may see. 72 | 73 | */ 74 | 75 | @interface BITUpdateManager : BITHockeyBaseManager 76 | 77 | ///----------------------------------------------------------------------------- 78 | /// @name Update Checking 79 | ///----------------------------------------------------------------------------- 80 | 81 | // see HockeyUpdateSetting-enum. Will be saved in user defaults. 82 | // default value: HockeyUpdateCheckStartup 83 | /** 84 | When to check for new updates. 85 | 86 | Defines when the SDK should check if there is a new update available on the 87 | server. This must be assigned one of the following, see `BITUpdateSetting`: 88 | 89 | - `BITUpdateCheckStartup`: On every startup or or when the app comes to the foreground 90 | - `BITUpdateCheckDaily`: Once a day 91 | - `BITUpdateCheckManually`: Manually 92 | 93 | When running the app from the App Store, this setting is ignored. 94 | 95 | **Default**: BITUpdateCheckStartup 96 | 97 | @warning When setting this to `BITUpdateCheckManually` you need to either 98 | invoke the update checking process yourself with `checkForUpdate` somehow, e.g. by 99 | proving an update check button for the user or integrating the Update View into your 100 | user interface. 101 | @see BITUpdateSetting 102 | @see checkForUpdateOnLaunch 103 | @see checkForUpdate 104 | */ 105 | @property (nonatomic, assign) BITUpdateSetting updateSetting; 106 | 107 | 108 | /** 109 | Flag that determines whether the automatic update checks should be done. 110 | 111 | If this is enabled the update checks will be performed automatically depending on the 112 | `updateSetting` property. If this is disabled the `updateSetting` property will have 113 | no effect, and checking for updates is totally up to be done by yourself. 114 | 115 | When running the app from the App Store, this setting is ignored. 116 | 117 | *Default*: _YES_ 118 | 119 | @warning When setting this to `NO` you need to invoke update checks yourself! 120 | @see updateSetting 121 | @see checkForUpdate 122 | */ 123 | @property (nonatomic, assign, getter=isCheckForUpdateOnLaunch) BOOL checkForUpdateOnLaunch; 124 | 125 | 126 | // manually start an update check 127 | /** 128 | Check for an update 129 | 130 | Call this to trigger a check if there is a new update available on the HockeyApp servers. 131 | 132 | When running the app from the App Store, this method call is ignored. 133 | 134 | @see updateSetting 135 | @see checkForUpdateOnLaunch 136 | */ 137 | - (void)checkForUpdate; 138 | 139 | 140 | ///----------------------------------------------------------------------------- 141 | /// @name Update Notification 142 | ///----------------------------------------------------------------------------- 143 | 144 | /** 145 | Flag that determines if update alerts should be repeatedly shown 146 | 147 | If enabled the update alert shows on every startup and whenever the app becomes active, 148 | until the update is installed. 149 | If disabled the update alert is only shown once ever and it is up to you to provide an 150 | alternate way for the user to navigate to the update UI or update in another way. 151 | 152 | When running the app from the App Store, this setting is ignored. 153 | 154 | *Default*: _YES_ 155 | */ 156 | @property (nonatomic, assign) BOOL alwaysShowUpdateReminder; 157 | 158 | 159 | /** 160 | Flag that determines if the update alert should show a direct install option 161 | 162 | If enabled the update alert shows an additional option which allows to invoke the update 163 | installation process directly instead of viewing the update UI first. 164 | By default the alert only shows a `Show` and `Ignore` option. 165 | 166 | When running the app from the App Store, this setting is ignored. 167 | 168 | *Default*: _NO_ 169 | */ 170 | @property (nonatomic, assign, getter=isShowingDirectInstallOption) BOOL showDirectInstallOption; 171 | 172 | 173 | ///----------------------------------------------------------------------------- 174 | /// @name Expiry 175 | ///----------------------------------------------------------------------------- 176 | 177 | /** 178 | Expiry date of the current app version 179 | 180 | If set, the app will get unusable at the given date by presenting a blocking view on 181 | top of the apps UI so that no interaction is possible. To present a custom UI, check 182 | the documentation of the 183 | `[BITUpdateManagerDelegate shouldDisplayExpiryAlertForUpdateManager:]` delegate. 184 | 185 | Once the expiry date is reached, the app will no longer check for updates or 186 | send any usage data to the server! 187 | 188 | When running the app from the App Store, this setting is ignored. 189 | 190 | *Default*: nil 191 | @see disableUpdateCheckOptionWhenExpired 192 | @see [BITUpdateManagerDelegate shouldDisplayExpiryAlertForUpdateManager:] 193 | @see [BITUpdateManagerDelegate didDisplayExpiryAlertForUpdateManager:] 194 | @warning This only works when using Ad-Hoc provisioning profiles! 195 | */ 196 | @property (nonatomic, strong) NSDate *expiryDate; 197 | 198 | /** 199 | Disable the update check button from expiry screen or alerts 200 | 201 | If do not want your users to be able to check for updates once a version is expired, 202 | then enable this property. 203 | 204 | If this is not enabled, the users will be able to check for updates and install them 205 | if any is available for the current device. 206 | 207 | *Default*: NO 208 | @see expiryDate 209 | @see [BITUpdateManagerDelegate shouldDisplayExpiryAlertForUpdateManager:] 210 | @see [BITUpdateManagerDelegate didDisplayExpiryAlertForUpdateManager:] 211 | @warning This only works when using Ad-Hoc provisioning profiles! 212 | */ 213 | @property (nonatomic) BOOL disableUpdateCheckOptionWhenExpired; 214 | 215 | 216 | ///----------------------------------------------------------------------------- 217 | /// @name User Interface 218 | ///----------------------------------------------------------------------------- 219 | 220 | 221 | /** 222 | Present the modal update user interface. 223 | 224 | @warning Make sure to call this method from the main thread! 225 | */ 226 | - (void)showUpdateView; 227 | 228 | 229 | /** 230 | Create an update view 231 | 232 | @param modal Return a view which is ready for modal presentation with an integrated navigation bar 233 | @return BITUpdateViewController The update user interface view controller, 234 | e.g. to push it onto a navigation stack. 235 | */ 236 | - (BITUpdateViewController *)hockeyViewController:(BOOL)modal; 237 | 238 | 239 | @end 240 | -------------------------------------------------------------------------------- /Source/ThirdParty/IOS/HockeySDK.framework/Headers/BITUpdateManagerDelegate.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Author: Andreas Linde 3 | * 4 | * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. 5 | * All rights reserved. 6 | * 7 | * Permission is hereby granted, free of charge, to any person 8 | * obtaining a copy of this software and associated documentation 9 | * files (the "Software"), to deal in the Software without 10 | * restriction, including without limitation the rights to use, 11 | * copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | * copies of the Software, and to permit persons to whom the 13 | * Software is furnished to do so, subject to the following 14 | * conditions: 15 | * 16 | * The above copyright notice and this permission notice shall be 17 | * included in all copies or substantial portions of the Software. 18 | * 19 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 21 | * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 23 | * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 24 | * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 26 | * OTHER DEALINGS IN THE SOFTWARE. 27 | */ 28 | 29 | #import 30 | 31 | @class BITUpdateManager; 32 | 33 | /** 34 | The `BITUpdateManagerDelegate` formal protocol defines methods further configuring 35 | the behaviour of `BITUpdateManager`. 36 | */ 37 | 38 | @protocol BITUpdateManagerDelegate 39 | 40 | @optional 41 | 42 | ///----------------------------------------------------------------------------- 43 | /// @name Update 44 | ///----------------------------------------------------------------------------- 45 | 46 | /** 47 | Return if update alert should be shown 48 | 49 | If you want to display your own user interface when there is an update available, 50 | implement this method, present your user interface and return _NO_. In this case 51 | it is your responsibility to call `BITUpdateManager showUpdateView` 52 | 53 | Note: This delegate will be invoked on startup and every time the app becomes 54 | active again! 55 | 56 | When returning _YES_ the default blocking UI will be shown. 57 | 58 | When running the app from the App Store, this delegate is ignored. 59 | 60 | @param updateManager The `BITUpdateManager` instance invoking this delegate 61 | @param shortVersion The latest available version 62 | @param version The latest available version 63 | */ 64 | - (BOOL)shouldDisplayUpdateAlertForUpdateManager:(BITUpdateManager *)updateManager forShortVersion:(NSString *)shortVersion forVersion:(NSString *)version; 65 | 66 | ///----------------------------------------------------------------------------- 67 | /// @name Expiry 68 | ///----------------------------------------------------------------------------- 69 | 70 | /** 71 | Return if expiry alert should be shown if date is reached 72 | 73 | If you want to display your own user interface when the expiry date is reached, 74 | implement this method, present your user interface and return _NO_. In this case 75 | it is your responsibility to make the app unusable! 76 | 77 | Note: This delegate will be invoked on startup and every time the app becomes 78 | active again! 79 | 80 | When returning _YES_ the default blocking UI will be shown. 81 | 82 | When running the app from the App Store, this delegate is ignored. 83 | 84 | @param updateManager The `BITUpdateManager` instance invoking this delegate 85 | @see [BITUpdateManager expiryDate] 86 | @see [BITUpdateManagerDelegate didDisplayExpiryAlertForUpdateManager:] 87 | */ 88 | - (BOOL)shouldDisplayExpiryAlertForUpdateManager:(BITUpdateManager *)updateManager; 89 | 90 | 91 | /** 92 | Invoked once a default expiry alert is shown 93 | 94 | Once expiry date is reached and the default blocking UI is shown, 95 | this delegate method is invoked to provide you the possibility to do any 96 | desired additional processing. 97 | 98 | @param updateManager The `BITUpdateManager` instance invoking this delegate 99 | @see [BITUpdateManager expiryDate] 100 | @see [BITUpdateManagerDelegate shouldDisplayExpiryAlertForUpdateManager:] 101 | */ 102 | - (void)didDisplayExpiryAlertForUpdateManager:(BITUpdateManager *)updateManager; 103 | 104 | 105 | ///----------------------------------------------------------------------------- 106 | /// @name Privacy 107 | ///----------------------------------------------------------------------------- 108 | 109 | /** Return NO if usage data should not be send 110 | 111 | The update module send usage data by default, if the application is _NOT_ 112 | running in an App Store version. Implement this delegate and 113 | return NO if you want to disable this. 114 | 115 | If you intend to implement a user setting to let them enable or disable 116 | sending usage data, this delegate should be used to return that value. 117 | 118 | Usage data contains the following information: 119 | - App Version 120 | - iOS Version 121 | - Device type 122 | - Language 123 | - Installation timestamp 124 | - Usage time 125 | 126 | @param updateManager The `BITUpdateManager` instance invoking this delegate 127 | @warning When setting this to `NO`, you will _NOT_ know if this user is actually testing! 128 | */ 129 | - (BOOL)updateManagerShouldSendUsageData:(BITUpdateManager *)updateManager; 130 | 131 | 132 | ///----------------------------------------------------------------------------- 133 | /// @name Privacy 134 | ///----------------------------------------------------------------------------- 135 | 136 | /** Implement this method to be notified before an update starts. 137 | 138 | The update manager will send this delegate message _just_ before the system 139 | call to update the application is placed, but after the user has already chosen 140 | to install the update. 141 | 142 | There is no guarantee that the update will actually start after this delegate 143 | message is sent. 144 | 145 | @param updateManager The `BITUpdateManager` instance invoking this delegate 146 | */ 147 | - (BOOL)willStartDownloadAndUpdate:(BITUpdateManager *)updateManager; 148 | 149 | /** 150 | Invoked right before the app will exit to allow app update to start (>= iOS8 only) 151 | 152 | The iOS installation mechanism only starts if the app the should be updated is currently 153 | not running. On all iOS versions up to iOS 7, the system did automatically exit the app 154 | in these cases. Since iOS 8 this isn't done any longer. 155 | 156 | @param updateManager The `BITUpdateManager` instance invoking this delegate 157 | */ 158 | - (void)updateManagerWillExitApp:(BITUpdateManager *)updateManager; 159 | 160 | @end 161 | -------------------------------------------------------------------------------- /Source/ThirdParty/IOS/HockeySDK.framework/Headers/BITUpdateViewController.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Author: Andreas Linde 3 | * Peter Steinberger 4 | * 5 | * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. 6 | * Copyright (c) 2011 Andreas Linde, Peter Steinberger. 7 | * All rights reserved. 8 | * 9 | * Permission is hereby granted, free of charge, to any person 10 | * obtaining a copy of this software and associated documentation 11 | * files (the "Software"), to deal in the Software without 12 | * restriction, including without limitation the rights to use, 13 | * copy, modify, merge, publish, distribute, sublicense, and/or sell 14 | * copies of the Software, and to permit persons to whom the 15 | * Software is furnished to do so, subject to the following 16 | * conditions: 17 | * 18 | * The above copyright notice and this permission notice shall be 19 | * included in all copies or substantial portions of the Software. 20 | * 21 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 22 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 23 | * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 24 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 25 | * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 26 | * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 27 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 28 | * OTHER DEALINGS IN THE SOFTWARE. 29 | */ 30 | 31 | #import 32 | 33 | #import "BITHockeyBaseViewController.h" 34 | 35 | 36 | @interface BITUpdateViewController : BITHockeyBaseViewController 37 | @end 38 | -------------------------------------------------------------------------------- /Source/ThirdParty/IOS/HockeySDK.framework/Headers/HockeySDK.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Author: Andreas Linde 3 | * 4 | * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. 5 | * Copyright (c) 2011 Andreas Linde. 6 | * All rights reserved. 7 | * 8 | * Permission is hereby granted, free of charge, to any person 9 | * obtaining a copy of this software and associated documentation 10 | * files (the "Software"), to deal in the Software without 11 | * restriction, including without limitation the rights to use, 12 | * copy, modify, merge, publish, distribute, sublicense, and/or sell 13 | * copies of the Software, and to permit persons to whom the 14 | * Software is furnished to do so, subject to the following 15 | * conditions: 16 | * 17 | * The above copyright notice and this permission notice shall be 18 | * included in all copies or substantial portions of the Software. 19 | * 20 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 21 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 22 | * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 23 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 24 | * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 25 | * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 26 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 27 | * OTHER DEALINGS IN THE SOFTWARE. 28 | */ 29 | 30 | #import 31 | 32 | #import "HockeySDKFeatureConfig.h" 33 | #import "HockeySDKEnums.h" 34 | #import "HockeySDKNullability.h" 35 | 36 | #import "BITHockeyManager.h" 37 | #import "BITHockeyManagerDelegate.h" 38 | 39 | #import "BITHockeyLogger.h" 40 | 41 | #import "BITHockeyUserData.h" 42 | 43 | #if HOCKEYSDK_FEATURE_CRASH_REPORTER || HOCKEYSDK_FEATURE_FEEDBACK 44 | #import "BITHockeyAttachment.h" 45 | #endif 46 | 47 | #if HOCKEYSDK_FEATURE_CRASH_REPORTER 48 | #import "BITCrashManager.h" 49 | #import "BITCrashAttachment.h" 50 | #import "BITCrashManagerDelegate.h" 51 | #import "BITCrashDetails.h" 52 | #import "BITCrashMetaData.h" 53 | #endif /* HOCKEYSDK_FEATURE_CRASH_REPORTER */ 54 | 55 | #if HOCKEYSDK_FEATURE_UPDATES 56 | #import "BITUpdateManager.h" 57 | #import "BITUpdateManagerDelegate.h" 58 | #import "BITUpdateViewController.h" 59 | #endif /* HOCKEYSDK_FEATURE_UPDATES */ 60 | 61 | #if HOCKEYSDK_FEATURE_STORE_UPDATES 62 | #import "BITStoreUpdateManager.h" 63 | #import "BITStoreUpdateManagerDelegate.h" 64 | #endif /* HOCKEYSDK_FEATURE_STORE_UPDATES */ 65 | 66 | #if HOCKEYSDK_FEATURE_FEEDBACK 67 | #import "BITFeedbackManager.h" 68 | #import "BITFeedbackManagerDelegate.h" 69 | #import "BITFeedbackActivity.h" 70 | #import "BITFeedbackComposeViewController.h" 71 | #import "BITFeedbackComposeViewControllerDelegate.h" 72 | #import "BITFeedbackListViewController.h" 73 | #endif /* HOCKEYSDK_FEATURE_FEEDBACK */ 74 | 75 | #if HOCKEYSDK_FEATURE_AUTHENTICATOR 76 | #import "BITAuthenticator.h" 77 | #endif /* HOCKEYSDK_FEATURE_AUTHENTICATOR */ 78 | 79 | #if HOCKEYSDK_FEATURE_METRICS 80 | #import "BITMetricsManager.h" 81 | #endif /* HOCKEYSDK_FEATURE_METRICS */ 82 | 83 | // Notification message which HockeyManager is listening to, to retry requesting updated from the server. 84 | // This can be used by app developers to trigger additional points where the HockeySDK can try sending 85 | // pending crash reports or feedback messages. 86 | // By default the SDK retries sending pending data only when the app becomes active. 87 | #define BITHockeyNetworkDidBecomeReachableNotification @"BITHockeyNetworkDidBecomeReachable" 88 | 89 | extern NSString *const kBITCrashErrorDomain; 90 | extern NSString *const kBITUpdateErrorDomain; 91 | extern NSString *const kBITFeedbackErrorDomain; 92 | extern NSString *const kBITAuthenticatorErrorDomain; 93 | extern NSString *const __attribute__((unused)) kBITHockeyErrorDomain; 94 | 95 | -------------------------------------------------------------------------------- /Source/ThirdParty/IOS/HockeySDK.framework/Headers/HockeySDKEnums.h: -------------------------------------------------------------------------------- 1 | // 2 | // HockeySDKEnums.h 3 | // HockeySDK 4 | // 5 | // Created by Lukas Spieß on 08/10/15. 6 | // 7 | // 8 | 9 | #ifndef HockeySDK_HockeyEnums_h 10 | #define HockeySDK_HockeyEnums_h 11 | 12 | /** 13 | * HockeySDK Log Levels 14 | */ 15 | typedef NS_ENUM(NSUInteger, BITLogLevel) { 16 | /** 17 | * Logging is disabled 18 | */ 19 | BITLogLevelNone = 0, 20 | /** 21 | * Only errors will be logged 22 | */ 23 | BITLogLevelError = 1, 24 | /** 25 | * Errors and warnings will be logged 26 | */ 27 | BITLogLevelWarning = 2, 28 | /** 29 | * Debug information will be logged 30 | */ 31 | BITLogLevelDebug = 3, 32 | /** 33 | * Logging will be very chatty 34 | */ 35 | BITLogLevelVerbose = 4 36 | }; 37 | 38 | typedef NSString *(^BITLogMessageProvider)(void); 39 | typedef void (^BITLogHandler)(BITLogMessageProvider messageProvider, BITLogLevel logLevel, const char *file, const char *function, uint line); 40 | 41 | /** 42 | * HockeySDK App environment 43 | */ 44 | typedef NS_ENUM(NSInteger, BITEnvironment) { 45 | /** 46 | * App has been downloaded from the AppStore 47 | */ 48 | BITEnvironmentAppStore = 0, 49 | /** 50 | * App has been downloaded from TestFlight 51 | */ 52 | BITEnvironmentTestFlight = 1, 53 | /** 54 | * App has been installed by some other mechanism. 55 | * This could be Ad-Hoc, Enterprise, etc. 56 | */ 57 | BITEnvironmentOther = 99 58 | }; 59 | 60 | /** 61 | * HockeySDK Crash Reporter error domain 62 | */ 63 | typedef NS_ENUM (NSInteger, BITCrashErrorReason) { 64 | /** 65 | * Unknown error 66 | */ 67 | BITCrashErrorUnknown, 68 | /** 69 | * API Server rejected app version 70 | */ 71 | BITCrashAPIAppVersionRejected, 72 | /** 73 | * API Server returned empty response 74 | */ 75 | BITCrashAPIReceivedEmptyResponse, 76 | /** 77 | * Connection error with status code 78 | */ 79 | BITCrashAPIErrorWithStatusCode 80 | }; 81 | 82 | /** 83 | * HockeySDK Update error domain 84 | */ 85 | typedef NS_ENUM (NSInteger, BITUpdateErrorReason) { 86 | /** 87 | * Unknown error 88 | */ 89 | BITUpdateErrorUnknown, 90 | /** 91 | * API Server returned invalid status 92 | */ 93 | BITUpdateAPIServerReturnedInvalidStatus, 94 | /** 95 | * API Server returned invalid data 96 | */ 97 | BITUpdateAPIServerReturnedInvalidData, 98 | /** 99 | * API Server returned empty response 100 | */ 101 | BITUpdateAPIServerReturnedEmptyResponse, 102 | /** 103 | * Authorization secret missing 104 | */ 105 | BITUpdateAPIClientAuthorizationMissingSecret, 106 | /** 107 | * No internet connection 108 | */ 109 | BITUpdateAPIClientCannotCreateConnection 110 | }; 111 | 112 | /** 113 | * HockeySDK Feedback error domain 114 | */ 115 | typedef NS_ENUM(NSInteger, BITFeedbackErrorReason) { 116 | /** 117 | * Unknown error 118 | */ 119 | BITFeedbackErrorUnknown, 120 | /** 121 | * API Server returned invalid status 122 | */ 123 | BITFeedbackAPIServerReturnedInvalidStatus, 124 | /** 125 | * API Server returned invalid data 126 | */ 127 | BITFeedbackAPIServerReturnedInvalidData, 128 | /** 129 | * API Server returned empty response 130 | */ 131 | BITFeedbackAPIServerReturnedEmptyResponse, 132 | /** 133 | * Authorization secret missing 134 | */ 135 | BITFeedbackAPIClientAuthorizationMissingSecret, 136 | /** 137 | * No internet connection 138 | */ 139 | BITFeedbackAPIClientCannotCreateConnection 140 | }; 141 | 142 | /** 143 | * HockeySDK Authenticator error domain 144 | */ 145 | typedef NS_ENUM(NSInteger, BITAuthenticatorReason) { 146 | /** 147 | * Unknown error 148 | */ 149 | BITAuthenticatorErrorUnknown, 150 | /** 151 | * Network error 152 | */ 153 | BITAuthenticatorNetworkError, 154 | 155 | /** 156 | * API Server returned invalid response 157 | */ 158 | BITAuthenticatorAPIServerReturnedInvalidResponse, 159 | /** 160 | * Not Authorized 161 | */ 162 | BITAuthenticatorNotAuthorized, 163 | /** 164 | * Unknown Application ID (configuration error) 165 | */ 166 | BITAuthenticatorUnknownApplicationID, 167 | /** 168 | * Authorization secret missing 169 | */ 170 | BITAuthenticatorAuthorizationSecretMissing, 171 | /** 172 | * Not yet identified 173 | */ 174 | BITAuthenticatorNotIdentified, 175 | }; 176 | 177 | /** 178 | * HockeySDK global error domain 179 | */ 180 | typedef NS_ENUM(NSInteger, BITHockeyErrorReason) { 181 | /** 182 | * Unknown error 183 | */ 184 | BITHockeyErrorUnknown 185 | }; 186 | 187 | #endif /* HockeySDK_HockeyEnums_h */ 188 | -------------------------------------------------------------------------------- /Source/ThirdParty/IOS/HockeySDK.framework/Headers/HockeySDKFeatureConfig.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Author: Andreas Linde 3 | * 4 | * Copyright (c) 2013-2014 HockeyApp, Bit Stadium GmbH. 5 | * All rights reserved. 6 | * 7 | * Permission is hereby granted, free of charge, to any person 8 | * obtaining a copy of this software and associated documentation 9 | * files (the "Software"), to deal in the Software without 10 | * restriction, including without limitation the rights to use, 11 | * copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | * copies of the Software, and to permit persons to whom the 13 | * Software is furnished to do so, subject to the following 14 | * conditions: 15 | * 16 | * The above copyright notice and this permission notice shall be 17 | * included in all copies or substantial portions of the Software. 18 | * 19 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 21 | * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 23 | * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 24 | * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 26 | * OTHER DEALINGS IN THE SOFTWARE. 27 | */ 28 | 29 | /** 30 | * This is the template feature config that is used for debug builds and during development. 31 | * For the Distribution target, we are using separate configs that will be copied over in our build script. 32 | */ 33 | 34 | 35 | #ifndef HockeySDK_HockeySDKFeatureConfig_h 36 | #define HockeySDK_HockeySDKFeatureConfig_h 37 | 38 | /** 39 | * If true, include support for handling crash reports 40 | * 41 | * _Default_: Enabled 42 | */ 43 | #ifndef HOCKEYSDK_FEATURE_CRASH_REPORTER 44 | # define HOCKEYSDK_FEATURE_CRASH_REPORTER 1 45 | #endif /* HOCKEYSDK_FEATURE_CRASH_REPORTER */ 46 | 47 | 48 | /** 49 | * If true, include support for managing user feedback 50 | * 51 | * _Default_: Enabled 52 | */ 53 | #ifndef HOCKEYSDK_FEATURE_FEEDBACK 54 | # define HOCKEYSDK_FEATURE_FEEDBACK 1 55 | #endif /* HOCKEYSDK_FEATURE_FEEDBACK */ 56 | 57 | 58 | /** 59 | * If true, include support for informing the user about new updates pending in the App Store 60 | * 61 | * _Default_: Enabled 62 | */ 63 | #ifndef HOCKEYSDK_FEATURE_STORE_UPDATES 64 | # define HOCKEYSDK_FEATURE_STORE_UPDATES 1 65 | #endif /* HOCKEYSDK_FEATURE_STORE_UPDATES */ 66 | 67 | 68 | /** 69 | * If true, include support for authentication installations for Ad-Hoc and Enterprise builds 70 | * 71 | * _Default_: Enabled 72 | */ 73 | #ifndef HOCKEYSDK_FEATURE_AUTHENTICATOR 74 | # define HOCKEYSDK_FEATURE_AUTHENTICATOR 1 75 | #endif /* HOCKEYSDK_FEATURE_AUTHENTICATOR */ 76 | 77 | 78 | /** 79 | * If true, include support for handling in-app updates for Ad-Hoc and Enterprise builds 80 | * 81 | * _Default_: Enabled 82 | */ 83 | #ifndef HOCKEYSDK_FEATURE_UPDATES 84 | # define HOCKEYSDK_FEATURE_UPDATES 1 85 | #endif /* HOCKEYSDK_FEATURE_UPDATES */ 86 | 87 | 88 | /** 89 | * If true, include support for auto collecting metrics data such as sessions and user 90 | * 91 | * _Default_: Enabled 92 | */ 93 | #ifndef HOCKEYSDK_FEATURE_METRICS 94 | # define HOCKEYSDK_FEATURE_METRICS 1 95 | #endif /* HOCKEYSDK_FEATURE_METRICS */ 96 | 97 | #endif /* HockeySDK_HockeySDKFeatureConfig_h */ 98 | -------------------------------------------------------------------------------- /Source/ThirdParty/IOS/HockeySDK.framework/Headers/HockeySDKNullability.h: -------------------------------------------------------------------------------- 1 | // 2 | // HockeyNullability.h 3 | // HockeySDK 4 | // 5 | // Created by Andreas Linde on 12/06/15. 6 | // 7 | // 8 | 9 | #ifndef HockeySDK_HockeyNullability_h 10 | #define HockeySDK_HockeyNullability_h 11 | 12 | // Define nullability fallback for backwards compatibility 13 | #if !__has_feature(nullability) 14 | #define NS_ASSUME_NONNULL_BEGIN 15 | #define NS_ASSUME_NONNULL_END 16 | #define nullable 17 | #define nonnull 18 | #define null_unspecified 19 | #define null_resettable 20 | #define _Nullable 21 | #define _Nonnull 22 | #define __nullable 23 | #define __nonnull 24 | #define __null_unspecified 25 | #endif 26 | 27 | // Fallback for convenience syntax which might not be available in older SDKs 28 | #ifndef NS_ASSUME_NONNULL_BEGIN 29 | #define NS_ASSUME_NONNULL_BEGIN _Pragma("clang assume_nonnull begin") 30 | #endif 31 | #ifndef NS_ASSUME_NONNULL_END 32 | #define NS_ASSUME_NONNULL_END _Pragma("clang assume_nonnull end") 33 | #endif 34 | 35 | #endif /* HockeySDK_HockeyNullability_h */ 36 | -------------------------------------------------------------------------------- /Source/ThirdParty/IOS/HockeySDK.framework/HockeySDK: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BugSplat-Git/bugsplat-unreal/47e80d46f96f92f7b271c952f6ea1e2f4843cea6/Source/ThirdParty/IOS/HockeySDK.framework/HockeySDK -------------------------------------------------------------------------------- /Source/ThirdParty/IOS/HockeySDK.framework/Info.plist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BugSplat-Git/bugsplat-unreal/47e80d46f96f92f7b271c952f6ea1e2f4843cea6/Source/ThirdParty/IOS/HockeySDK.framework/Info.plist -------------------------------------------------------------------------------- /Source/ThirdParty/IOS/HockeySDK.framework/Modules/module.modulemap: -------------------------------------------------------------------------------- 1 | framework module HockeySDK { 2 | umbrella header "HockeySDK.h" 3 | export * 4 | 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Source/ThirdParty/IOS/HockeySDK.framework/PrivateHeaders/BITChannelPrivate.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | #import "HockeySDKFeatureConfig.h" 4 | 5 | #if HOCKEYSDK_FEATURE_METRICS 6 | 7 | @class BITTelemetryData; 8 | @class BITTelemetryContext; 9 | @class BITPersistence; 10 | 11 | #import "BITChannel.h" 12 | 13 | #import "HockeySDKNullability.h" 14 | NS_ASSUME_NONNULL_BEGIN 15 | 16 | @interface BITChannel () 17 | 18 | /** 19 | * Notification that will be send on the main thread to notifiy observers that channel can't enqueue new items. 20 | * This is typically used to trigger sending to the server. 21 | */ 22 | FOUNDATION_EXPORT NSString *const BITChannelBlockedNotification; 23 | 24 | /** 25 | * Telemetry context used by the channel to create the payload (testing). 26 | */ 27 | @property (nonatomic, strong) BITTelemetryContext *telemetryContext; 28 | 29 | /** 30 | * Persistence instance for storing files after the queue gets flushed (testing). 31 | */ 32 | @property (nonatomic, strong) BITPersistence *persistence; 33 | 34 | /* 35 | * Threshold for sending data to the server. Default batch size for debugging is 150, for release 36 | * configuration, the batch size is 5. 37 | * 38 | * Default: 50 39 | * 40 | * @warning: We advice to not set the batch size below 5 events. 41 | */ 42 | @property (nonatomic) NSUInteger maxBatchSize; 43 | 44 | /* 45 | * Interval for sending data to the server in seconds. 46 | * 47 | * Default: 15 48 | */ 49 | @property (nonatomic, assign) NSInteger batchInterval; 50 | 51 | /** 52 | * A timer source which is used to flush the queue after a cretain time. 53 | */ 54 | @property (nonatomic, strong, nullable) dispatch_source_t timerSource; 55 | 56 | /** 57 | * A queue which makes array operations thread safe. 58 | */ 59 | @property (nonatomic, strong) dispatch_queue_t dataItemsOperations; 60 | 61 | /** 62 | * An integer value that keeps tracks of the number of data items added to the JSON Stream string. 63 | */ 64 | @property (nonatomic, assign) NSUInteger dataItemCount; 65 | 66 | /** 67 | * Indicates that channel is currently in a blocked state. 68 | */ 69 | @property BOOL channelBlocked; 70 | 71 | /** 72 | * Manually trigger the BITChannel to persist all items currently in its data item queue. 73 | */ 74 | - (void)persistDataItemQueue:(char *_Nullable*_Nullable)eventBuffer; 75 | 76 | /** 77 | * Create background task for queues and group. 78 | */ 79 | - (void)createBackgroundTaskWhileDataIsSending:(UIApplication *)application 80 | withWaitingGroup:(nullable dispatch_group_t)group; 81 | 82 | /** 83 | * Adds the specified dictionary to the JSON Stream string. 84 | * 85 | * @param dictionary the dictionary object which is to be added to the JSON Stream queue string. 86 | */ 87 | - (void)appendDictionaryToEventBuffer:(NSDictionary *)dictionary; 88 | 89 | /** 90 | * A C function that serializes a given dictionary to JSON and appends it to a char string 91 | * 92 | * @param string The C string which the dictionary's JSON representation will be appended to. 93 | */ 94 | void bit_appendStringToEventBuffer(NSString *string, char *__nonnull*__nonnull eventBuffer); 95 | 96 | /** 97 | * Reset the event buffer so we can start appending JSON dictionaries. 98 | * 99 | * @param eventBuffer The string that will be reset. 100 | */ 101 | void bit_resetEventBuffer(char *__nonnull*__nonnull eventBuffer); 102 | 103 | /** 104 | * A method which indicates whether the telemetry pipeline is busy and no new data should be enqueued. 105 | * Currently, we drop telemetry data if this returns YES. 106 | * This depends on defaultMaxBatchCount and defaultBatchInterval. 107 | * 108 | * @return Returns yes if currently no new data should be enqueued on the channel. 109 | */ 110 | - (BOOL)isQueueBusy; 111 | 112 | /** 113 | * Enqueue a telemetry item. This is for testing purposes where we actually use the completion handler. 114 | * 115 | * @param completionHandler The completion handler that will be called after enqueuing a BITTelemetryData object. 116 | * 117 | * @discussion intended for testing purposes. 118 | */ 119 | - (void)enqueueTelemetryItem:(BITTelemetryData *)item completionHandler:(nullable void (^)(void))completionHandler; 120 | 121 | @end 122 | 123 | NS_ASSUME_NONNULL_END 124 | 125 | #endif /* HOCKEYSDK_FEATURE_METRICS */ 126 | -------------------------------------------------------------------------------- /Source/ThirdParty/IOS/HockeySDK.framework/PrivateHeaders/BITCrashReportTextFormatterPrivate.h: -------------------------------------------------------------------------------- 1 | // 2 | // BITCrashReportTextFormatterPrivate.h 3 | // HockeySDK 4 | // 5 | // Created by Lukas Spieß on 27/01/16. 6 | // 7 | // 8 | 9 | #import "BITCrashReportTextFormatter.h" 10 | 11 | #ifndef BITCrashReportTextFormatterPrivate_h 12 | #define BITCrashReportTextFormatterPrivate_h 13 | 14 | @interface BITCrashReportTextFormatter () 15 | 16 | + (NSString *)anonymizedPathFromPath:(NSString *)path; 17 | 18 | @end 19 | 20 | #endif /* BITCrashReportTextFormatterPrivate_h */ 21 | -------------------------------------------------------------------------------- /Source/ThirdParty/IOS/HockeySDK.framework/PrivateHeaders/BITHockeyLoggerPrivate.h: -------------------------------------------------------------------------------- 1 | #import "BITHockeyLogger.h" 2 | 3 | FOUNDATION_EXPORT BITLogHandler const defaultLogHandler; 4 | -------------------------------------------------------------------------------- /Source/ThirdParty/IOS/HockeySDK.framework/PrivateHeaders/BITUpdateManagerPrivate.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Author: Andreas Linde 3 | * Peter Steinberger 4 | * 5 | * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. 6 | * Copyright (c) 2011 Andreas Linde. 7 | * All rights reserved. 8 | * 9 | * Permission is hereby granted, free of charge, to any person 10 | * obtaining a copy of this software and associated documentation 11 | * files (the "Software"), to deal in the Software without 12 | * restriction, including without limitation the rights to use, 13 | * copy, modify, merge, publish, distribute, sublicense, and/or sell 14 | * copies of the Software, and to permit persons to whom the 15 | * Software is furnished to do so, subject to the following 16 | * conditions: 17 | * 18 | * The above copyright notice and this permission notice shall be 19 | * included in all copies or substantial portions of the Software. 20 | * 21 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 22 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 23 | * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 24 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 25 | * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 26 | * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 27 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 28 | * OTHER DEALINGS IN THE SOFTWARE. 29 | */ 30 | 31 | 32 | #import "HockeySDK.h" 33 | 34 | #if HOCKEYSDK_FEATURE_UPDATES 35 | 36 | /** TODO: 37 | * if during startup the auth-state is pending, we get never rid of the nag-alertview 38 | */ 39 | @interface BITUpdateManager () 40 | 41 | ///----------------------------------------------------------------------------- 42 | /// @name Delegate 43 | ///----------------------------------------------------------------------------- 44 | 45 | /** 46 | Sets the `BITUpdateManagerDelegate` delegate. 47 | 48 | The delegate is automatically set by using `[BITHockeyManager setDelegate:]`. You 49 | should not need to set this delegate individually. 50 | 51 | @see `[BITHockeyManager setDelegate:]` 52 | */ 53 | @property (nonatomic, weak) id delegate; 54 | 55 | 56 | // is an update available? 57 | @property (nonatomic, assign, getter=isUpdateAvailable) BOOL updateAvailable; 58 | 59 | // are we currently checking for updates? 60 | @property (nonatomic, assign, getter=isCheckInProgress) BOOL checkInProgress; 61 | 62 | @property (nonatomic, strong) NSMutableData *receivedData; 63 | 64 | @property (nonatomic, copy) NSDate *lastCheck; 65 | 66 | // get array of all available versions 67 | @property (nonatomic, copy) NSArray *appVersions; 68 | 69 | @property (nonatomic, strong) NSNumber *currentAppVersionUsageTime; 70 | 71 | @property (nonatomic, copy) NSDate *usageStartTimestamp; 72 | 73 | @property (nonatomic, strong) UIView *blockingView; 74 | 75 | @property (nonatomic, copy) NSString *companyName; 76 | 77 | @property (nonatomic, copy) NSString *installationIdentification; 78 | 79 | @property (nonatomic, copy) NSString *installationIdentificationType; 80 | 81 | @property (nonatomic) BOOL installationIdentified; 82 | 83 | // used by BITHockeyManager if disable status is changed 84 | @property (nonatomic, getter = isUpdateManagerDisabled) BOOL disableUpdateManager; 85 | 86 | // checks for update, informs the user (error, no update found, etc) 87 | - (void)checkForUpdateShowFeedback:(BOOL)feedback; 88 | 89 | - (NSURLRequest *)requestForUpdateCheck; 90 | 91 | // initiates app-download call. displays an system UIAlertController 92 | - (BOOL)initiateAppDownload; 93 | 94 | // get/set current active hockey view controller 95 | @property (nonatomic, strong) BITUpdateViewController *currentHockeyViewController; 96 | 97 | @property(nonatomic) BOOL sendUsageData; 98 | 99 | // convenience method to get current running version string 100 | - (NSString *)currentAppVersion; 101 | 102 | // get newest app version 103 | - (BITAppVersionMetaInfo *)newestAppVersion; 104 | 105 | // check if there is any newer version mandatory 106 | - (BOOL)hasNewerMandatoryVersion; 107 | 108 | @end 109 | 110 | #endif /* HOCKEYSDK_FEATURE_UPDATES */ 111 | -------------------------------------------------------------------------------- /Source/ThirdParty/IOS/LICENSE: -------------------------------------------------------------------------------- 1 | ## Licenses 2 | 3 | Bugsplat is provided under the following license: 4 | 5 | The MIT License 6 | Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH. 7 | All rights reserved. 8 | 9 | Permission is hereby granted, free of charge, to any person 10 | obtaining a copy of this software and associated documentation 11 | files (the "Software"), to deal in the Software without 12 | restriction, including without limitation the rights to use, 13 | copy, modify, merge, publish, distribute, sublicense, and/or sell 14 | copies of the Software, and to permit persons to whom the 15 | Software is furnished to do so, subject to the following 16 | conditions: 17 | 18 | The above copyright notice and this permission notice shall be 19 | included in all copies or substantial portions of the Software. 20 | 21 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 22 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 23 | OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 24 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 25 | HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 26 | WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 27 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 28 | OTHER DEALINGS IN THE SOFTWARE. 29 | 30 | Except as noted below, PLCrashReporter 31 | is provided under the following license: 32 | 33 | Copyright (c) 2008 - 2014 Plausible Labs Cooperative, Inc. 34 | Copyright (c) 2012 - 2014 HockeyApp, Bit Stadium GmbH. 35 | All rights reserved. 36 | 37 | Permission is hereby granted, free of charge, to any person 38 | obtaining a copy of this software and associated documentation 39 | files (the "Software"), to deal in the Software without 40 | restriction, including without limitation the rights to use, 41 | copy, modify, merge, publish, distribute, sublicense, and/or sell 42 | copies of the Software, and to permit persons to whom the 43 | Software is furnished to do so, subject to the following 44 | conditions: 45 | 46 | The above copyright notice and this permission notice shall be 47 | included in all copies or substantial portions of the Software. 48 | 49 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 50 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 51 | OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 52 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 53 | HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 54 | WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 55 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 56 | OTHER DEALINGS IN THE SOFTWARE. 57 | 58 | The protobuf-c library, as well as the PLCrashLogWriterEncoding.c 59 | file are licensed as follows: 60 | 61 | Copyright 2008, Dave Benson. 62 | 63 | Licensed under the Apache License, Version 2.0 (the "License"); 64 | you may not use this file except in compliance with 65 | the License. You may obtain a copy of the License 66 | at http://www.apache.org/licenses/LICENSE-2.0 Unless 67 | required by applicable law or agreed to in writing, 68 | software distributed under the License is distributed on 69 | an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 70 | KIND, either express or implied. See the License for the 71 | specific language governing permissions and limitations 72 | under the License. 73 | -------------------------------------------------------------------------------- /Source/ThirdParty/SymUploader/LICENSE-MIT: -------------------------------------------------------------------------------- 1 | Permission is hereby granted, free of charge, to any 2 | person obtaining a copy of this software and associated 3 | documentation files (the "Software"), to deal in the 4 | Software without restriction, including without 5 | limitation the rights to use, copy, modify, merge, 6 | publish, distribute, sublicense, and/or sell copies of 7 | the Software, and to permit persons to whom the Software 8 | is furnished to do so, subject to the following 9 | conditions: 10 | 11 | The above copyright notice and this permission notice 12 | shall be included in all copies or substantial portions 13 | of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF 16 | ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED 17 | TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 18 | PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT 19 | SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 20 | CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 21 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR 22 | IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 23 | DEALINGS IN THE SOFTWARE. 24 | -------------------------------------------------------------------------------- /package.ts: -------------------------------------------------------------------------------- 1 | import { compress } from "https://raw.githubusercontent.com/BugSplat-Git/deno-zip/d6591c94506fde867edb06578549ded598f345dc/mod.ts"; 2 | 3 | const supportedVersions = ['5.0', '5.1', '5.2', '5.3', '5.4', '5.5']; 4 | 5 | const pluginJson = JSON.parse(await Deno.readTextFile('./BugSplat.uplugin')); 6 | 7 | // Remove downloaded symbol-upload-* files before packaging 8 | const symUploaderDir = './Source/ThirdParty/SymUploader'; 9 | for await (const entry of Deno.readDir(symUploaderDir)) { 10 | if (entry.isFile && entry.name.startsWith('symbol-upload-')) { 11 | await Deno.remove(`${symUploaderDir}/${entry.name}`); 12 | console.log(`Deleted ${entry.name}`); 13 | } 14 | } 15 | 16 | // Update the plugin version for each supported Unreal Engine version 17 | for (const unrealVersion of supportedVersions) { 18 | const pluginVersion = pluginJson.VersionName; 19 | pluginJson.EngineVersion = `${unrealVersion}.0`; 20 | await Deno.writeTextFile('./BugSplat.uplugin', JSON.stringify(pluginJson, null, 4)); 21 | 22 | const zipName = `bugsplat-unreal-${pluginVersion}-unreal-${unrealVersion}.zip`; 23 | const zipEntries = [ 24 | 'Source', 25 | 'Resources', 26 | 'README.md', 27 | 'LICENSE.md', 28 | 'Content', 29 | 'Config', 30 | 'BugSplat.uplugin', 31 | ]; 32 | 33 | console.log(`About to create release package for Unreal Engine ${unrealVersion}...`); 34 | 35 | await compress(zipEntries, zipName); 36 | 37 | console.log(`Created ${zipName} successfully!`); 38 | } --------------------------------------------------------------------------------