Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions PRIVACYPOLICY.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# Privacy Policy

Your privacy is very important to us. Therefore we consider al your personal information yours and yours alone. No data is stored or transmitted and we do no include any advertising or analytics software that talks to third parties.

## What information is collected?

Formulus does not collect any personal information. All login information is only stored locally on your device.

## Contact

If you have questions or concerns about this Privacy Policy, please [contact us](https://forum.opendataensemble.org/).
Binary file not shown.
Binary file added formulus/assets/images/logo_1024x1024.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added formulus/assets/images/logo_1024x1024.xcf
Binary file not shown.
Binary file added formulus/assets/images/logo_1024x1024_tinted.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
37 changes: 33 additions & 4 deletions formulus/ios/Formulus.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
761780ED2CA45674006654EE /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 761780EC2CA45674006654EE /* AppDelegate.swift */; };
81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */; };
92DE80C6F6664AA2AF375F73 /* formplayer_dist in Resources */ = {isa = PBXBuildFile; fileRef = EBDD571F89894B28B8C91913 /* formplayer_dist */; };
A1B2C3D4E5F60718293A4B5C /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1B2C3D4E5F60718293A4B5D /* SceneDelegate.swift */; };
A403F6B5C831432092D6432A /* formulus-api.js in Resources */ = {isa = PBXBuildFile; fileRef = 672207178378430481699308 /* formulus-api.js */; };
D1F3D891BD4E91B83D93379D /* libPods-Formulus.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 35A5068D571FAAC91153000D /* libPods-Formulus.a */; };
E2D4C3847B9CFE032014F121 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */; };
Expand All @@ -31,6 +32,7 @@
761780EC2CA45674006654EE /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = AppDelegate.swift; path = Formulus/AppDelegate.swift; sourceTree = "<group>"; };
771907CB95B14EB19B4CB206 /* placeholder_app.html */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = placeholder_app.html; path = ../assets/webview/placeholder_app.html; sourceTree = "<group>"; };
81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = Formulus/LaunchScreen.storyboard; sourceTree = "<group>"; };
A1B2C3D4E5F60718293A4B5D /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = SceneDelegate.swift; path = Formulus/SceneDelegate.swift; sourceTree = "<group>"; };
B069022F6C1C274ADFA7DCBD /* Pods-Formulus.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Formulus.debug.xcconfig"; path = "Target Support Files/Pods-Formulus/Pods-Formulus.debug.xcconfig"; sourceTree = "<group>"; };
B9003E8457E34C9983C8BD62 /* FormulusInjectionScript.js */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = FormulusInjectionScript.js; path = ../assets/webview/FormulusInjectionScript.js; sourceTree = "<group>"; };
EBDD571F89894B28B8C91913 /* formplayer_dist */ = {isa = PBXFileReference; lastKnownFileType = folder; path = formplayer_dist; sourceTree = "<group>"; };
Expand All @@ -54,6 +56,7 @@
children = (
13B07FB51A68108700A75B9A /* Images.xcassets */,
761780EC2CA45674006654EE /* AppDelegate.swift */,
A1B2C3D4E5F60718293A4B5D /* SceneDelegate.swift */,
13B07FB61A68108700A75B9A /* Info.plist */,
81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */,
13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */,
Expand Down Expand Up @@ -134,6 +137,7 @@
13B07F8E1A680F5B00A75B9A /* Resources */,
00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */,
563235D0618B399E9E2C5576 /* [CP] Embed Pods Frameworks */,
A7E4F1C29B8D4056A13E70D2 /* Generate Hermes dSYM */,
FFE8138CF617206B3248B8EF /* [CP] Copy Pods Resources */,
);
buildRules = (
Expand Down Expand Up @@ -254,6 +258,23 @@
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Formulus/Pods-Formulus-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
A7E4F1C29B8D4056A13E70D2 /* Generate Hermes dSYM */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${PODS_ROOT}/hermes-engine/destroot/Library/Frameworks/universal/hermesvm.xcframework/ios-arm64/hermesvm.framework/hermesvm",
);
name = "Generate Hermes dSYM";
outputPaths = (
"${DWARF_DSYM_FOLDER_PATH}/hermesvm.framework.dSYM",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${SRCROOT}/scripts/generate-hermes-dsym.sh\"\n";
showEnvVarsInLog = 0;
};
FFE8138CF617206B3248B8EF /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
Expand Down Expand Up @@ -283,6 +304,7 @@
buildActionMask = 2147483647;
files = (
761780ED2CA45674006654EE /* AppDelegate.swift in Sources */,
A1B2C3D4E5F60718293A4B5C /* SceneDelegate.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand All @@ -294,9 +316,10 @@
baseConfigurationReference = B069022F6C1C274ADFA7DCBD /* Pods-Formulus.debug.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = 24;
DEVELOPMENT_TEAM = ZZ9482ZVMJ;
DEVELOPMENT_TEAM = 57WY3GA5K7;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Formulus/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 15.1;
Expand All @@ -310,7 +333,7 @@
"-ObjC",
"-lc++",
);
PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)";
PRODUCT_BUNDLE_IDENTIFIER = "org.opendataensemble.$(PRODUCT_NAME:rfc1034identifier)";
PRODUCT_NAME = Formulus;
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
Expand All @@ -328,9 +351,10 @@
baseConfigurationReference = 4BC86BCC31A36E17B33DBE8D /* Pods-Formulus.release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = 24;
DEVELOPMENT_TEAM = ZZ9482ZVMJ;
DEVELOPMENT_TEAM = 57WY3GA5K7;
INFOPLIST_FILE = Formulus/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 15.1;
LD_RUNPATH_SEARCH_PATHS = (
Expand All @@ -343,7 +367,7 @@
"-ObjC",
"-lc++",
);
PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)";
PRODUCT_BUNDLE_IDENTIFIER = "org.opendataensemble.$(PRODUCT_NAME:rfc1034identifier)";
PRODUCT_NAME = Formulus;
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
Expand Down Expand Up @@ -386,8 +410,10 @@
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEVELOPMENT_TEAM = 57WY3GA5K7;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "";
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
Expand Down Expand Up @@ -427,6 +453,7 @@
);
REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
SDKROOT = iphoneos;
STRING_CATALOG_GENERATE_SYMBOLS = YES;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG";
USE_HERMES = true;
};
Expand Down Expand Up @@ -463,8 +490,10 @@
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = YES;
DEVELOPMENT_TEAM = 57WY3GA5K7;
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "";
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
Expand Down
11 changes: 3 additions & 8 deletions formulus/ios/Formulus/AppDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,26 +9,21 @@ class AppDelegate: UIResponder, UIApplicationDelegate {

var reactNativeDelegate: ReactNativeDelegate?
var reactNativeFactory: RCTReactNativeFactory?
var launchOptions: [UIApplication.LaunchOptionsKey: Any]?

func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil
) -> Bool {
self.launchOptions = launchOptions

let delegate = ReactNativeDelegate()
let factory = RCTReactNativeFactory(delegate: delegate)
delegate.dependencyProvider = RCTAppDependencyProvider()

reactNativeDelegate = delegate
reactNativeFactory = factory

window = UIWindow(frame: UIScreen.main.bounds)

factory.startReactNative(
withModuleName: "Formulus",
in: window,
launchOptions: launchOptions
)

return true
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,48 +1,33 @@
{
"images" : [
{
"idiom" : "iphone",
"scale" : "2x",
"size" : "20x20"
},
{
"idiom" : "iphone",
"scale" : "3x",
"size" : "20x20"
},
{
"idiom" : "iphone",
"scale" : "2x",
"size" : "29x29"
},
{
"idiom" : "iphone",
"scale" : "3x",
"size" : "29x29"
},
{
"idiom" : "iphone",
"scale" : "2x",
"size" : "40x40"
},
{
"idiom" : "iphone",
"scale" : "3x",
"size" : "40x40"
},
{
"idiom" : "iphone",
"scale" : "2x",
"size" : "60x60"
"filename" : "logo_1024x1024.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
},
{
"idiom" : "iphone",
"scale" : "3x",
"size" : "60x60"
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"filename" : "logo_1024x1024.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
},
{
"idiom" : "ios-marketing",
"scale" : "1x",
"appearances" : [
{
"appearance" : "luminosity",
"value" : "tinted"
}
],
"filename" : "logo_1024x1024_tinted.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 2 additions & 2 deletions formulus/ios/Formulus/Images.xcassets/Contents.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"info" : {
"version" : 1,
"author" : "xcode"
"author" : "xcode",
"version" : 1
}
}
38 changes: 33 additions & 5 deletions formulus/ios/Formulus/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,34 @@
<string>Formulus needs access to your location to add geolocation data to observations for accurate data collection.</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Formulus needs access to your location to add geolocation data to observations for accurate data collection.</string>
<key>NSMicrophoneUsageDescription</key>
<string>Formulus needs access to your microphone to add voice note data to observations for accurate data collection.</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>Formulus needs access to your photo library if you wish to upload photo observations for accurate data collection.</string>
<key>RCTNewArchEnabled</key>
<true/>
<key>UIAppFonts</key>
<array>
<string>MaterialDesignIcons.ttf</string>
<string>MaterialIcons.ttf</string>
</array>
<key>UIApplicationSceneManifest</key>
<dict>
<key>UIApplicationSupportsMultipleScenes</key>
<false/>
<key>UISceneConfigurations</key>
<dict>
<key>UIWindowSceneSessionRoleApplication</key>
<array>
<dict>
<key>UISceneConfigurationName</key>
<string>Default Configuration</string>
<key>UISceneDelegateClassName</key>
<string>$(PRODUCT_MODULE_NAME).SceneDelegate</string>
</dict>
</array>
</dict>
</dict>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIRequiredDeviceCapabilities</key>
Expand All @@ -51,12 +77,14 @@
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>UIAppFonts</key>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>MaterialDesignIcons.ttf</string>
<string>MaterialIcons.ttf</string>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
</dict>
</plist>
32 changes: 32 additions & 0 deletions formulus/ios/Formulus/SceneDelegate.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import UIKit

class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?

func scene(
_ scene: UIScene,
willConnectTo session: UISceneSession,
options connectionOptions: UIScene.ConnectionOptions
) {
guard let windowScene = scene as? UIWindowScene else {
return
}

guard let appDelegate = UIApplication.shared.delegate as? AppDelegate,
let factory = appDelegate.reactNativeFactory
else {
return
}

let window = UIWindow(windowScene: windowScene)
self.window = window
// Keep AppDelegate.window in sync for libraries that still read it.
appDelegate.window = window

factory.startReactNative(
withModuleName: "Formulus",
in: window,
launchOptions: appDelegate.launchOptions
)
}
}
31 changes: 31 additions & 0 deletions formulus/ios/scripts/generate-hermes-dsym.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
#!/bin/sh
# Generate hermesvm.framework.dSYM for App Store symbol upload.
# Prebuilt Hermes ships without a matching dSYM; Xcode 16+ warns on archive upload.
set -e

if [ "${CONFIGURATION}" != "Release" ]; then
echo "Skipping Hermes dSYM (CONFIGURATION=${CONFIGURATION})"
exit 0
fi

EMBEDDED_HERMES_BIN="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermesvm.framework/hermesvm"
PODS_HERMES_BIN="${PODS_ROOT}/hermes-engine/destroot/Library/Frameworks/universal/hermesvm.xcframework/ios-arm64/hermesvm.framework/hermesvm"

if [ -f "${EMBEDDED_HERMES_BIN}" ]; then
HERMES_BIN="${EMBEDDED_HERMES_BIN}"
elif [ -f "${PODS_HERMES_BIN}" ]; then
HERMES_BIN="${PODS_HERMES_BIN}"
else
echo "warning: hermesvm binary not found; skipping dSYM generation"
exit 0
fi

DSYM_OUTPUT="${DWARF_DSYM_FOLDER_PATH}/hermesvm.framework.dSYM"

echo "Generating Hermes dSYM from: ${HERMES_BIN}"
echo "Output: ${DSYM_OUTPUT}"

rm -rf "${DSYM_OUTPUT}"
# Prebuilt Hermes has no local object files; dsymutil still emits a UUID-matched
# dSYM that satisfies App Store symbol upload checks (stderr is noisy otherwise).
dsymutil "${HERMES_BIN}" -o "${DSYM_OUTPUT}" 2>/dev/null
Loading