diff --git a/.metadata b/.metadata
index 0b60be7..b09d708 100644
--- a/.metadata
+++ b/.metadata
@@ -4,7 +4,30 @@
# This file should be version controlled and should not be manually edited.
version:
- revision: f139b11009aeb8ed2a3a3aa8b0066e482709dde3
- channel: stable
+ revision: "d8a9f9a52e5af486f80d932e838ee93861ffd863"
+ channel: "stable"
project_type: plugin
+
+# Tracks metadata for the flutter migrate command
+migration:
+ platforms:
+ - platform: root
+ create_revision: d8a9f9a52e5af486f80d932e838ee93861ffd863
+ base_revision: d8a9f9a52e5af486f80d932e838ee93861ffd863
+ - platform: android
+ create_revision: d8a9f9a52e5af486f80d932e838ee93861ffd863
+ base_revision: d8a9f9a52e5af486f80d932e838ee93861ffd863
+ - platform: ios
+ create_revision: d8a9f9a52e5af486f80d932e838ee93861ffd863
+ base_revision: d8a9f9a52e5af486f80d932e838ee93861ffd863
+
+ # User provided section
+
+ # List of Local paths (relative to this file) that should be
+ # ignored by the migrate tool.
+ #
+ # Files that are not part of the templates will be ignored by default.
+ unmanaged_files:
+ - 'lib/main.dart'
+ - 'ios/Runner.xcodeproj/project.pbxproj'
diff --git a/README.md b/README.md
index c38c3b1..591b3fe 100644
--- a/README.md
+++ b/README.md
@@ -1,88 +1,39 @@
# flutter_sodium
-With flutter_sodium you get access to the modern, easy-to-use [libsodium](https://download.libsodium.org/doc/) crypto library in your [Flutter](https://flutter.io) apps. One set of crypto APIs supporting both Android and iOS.
+Flutter plugin exposing libsodium to the app.
-[](https://pub.dartlang.org/packages/flutter_sodium)
+## Refreshing Android archives
-## Getting Started
+Run the helper below to rebuild the checked-in Android `libsodium` shared
+libraries from the pinned upstream release. The wrapper delegates the actual
+compile step to libsodium's upstream Android `dist-build` scripts and then
+copies the resulting `.so` files into this repository:
-In your flutter project add the dependency:
-
-```yml
-dependencies:
- ...
- flutter_sodium: ^0.2.0
-```
-
-Import the plugin and initialize it. Sodium.init() initializes the plugin and should be called before any other function provided by flutter_sodium.
-
-```dart
-import 'package:flutter_sodium/flutter_sodium.dart';
-
-// initialize sodium
-Sodium.init();
+```sh
+./scripts/build-libsodium-android.sh
```
-## Usage example
+This generates:
-```dart
-// Password hashing (using Argon)
-final password = 'my password';
-final str = PasswordHash.hashStringStorage(password);
+- `android/src/main/jniLibs/armeabi-v7a/libsodium.so`
+- `android/src/main/jniLibs/arm64-v8a/libsodium.so`
+- `android/src/main/jniLibs/x86/libsodium.so`
+- `android/src/main/jniLibs/x86_64/libsodium.so`
+- `android/prebuilt/libsodium-build-info.json`
-print(str);
+## Refreshing iOS archives
-// verify hash str
-final valid = PasswordHash.verifyStorage(str, password);
+Run the helper below to rebuild the checked-in iOS `libsodium` archives from the
+pinned upstream release. The wrapper loads libsodium's upstream Apple
+`dist-build` helpers, builds the iOS slices we ship, and then writes the final
+archives into this repository:
-assert(valid);
+```sh
+./scripts/build-libsodium-ios.sh
```
-This project includes an extensive example app with runnable code samples. Be sure to check it out!
-
-
-
-## API coverage
-The flutter_sodium plugin implements the following libsodium APIs:
-- crypto_aead
-- crypto_auth
-- crypto_box
-- crypto_generichash
-- crypto_hash
-- crypto_kdf
-- crypto_kx
-- crypto_onetimeauth
-- crypto_pwhash
-- crypto_scalarmult
-- crypto_secretbox
-- crypto_secretstream
-- crypto_shorthash
-- crypto_sign
-- crypto_stream
-- randombytes
-- sodium_version
-
-API coverage is not 100% complete, track the progress in [issue #61](https://github.com/firstfloorsoftware/flutter_sodium/issues/61)
+This generates:
-## Dart APIs
-The plugin includes a core API that maps native libsodium functions 1:1 to Dart equivalents. The core API is available in the class [`Sodium`](https://github.com/firstfloorsoftware/flutter_sodium/blob/master/lib/flutter_sodium.dart). Dart naming conventions are used for core API function names. A native libsodium function such as `crypto_pwhash_str`, is available in flutter as `Sodium.cryptoPwhashStr`.
-
-Also included in flutter_sodium is a high-level, opinionated API providing access to libsodium in a Dart friendly manner. The various functions are available in separate Dart classes. Password hashing for example is available in the `PasswordHash` class. The high-level API depends on the core API to get things done.
-
-## Migrating to fluttter_sodium FFI
-The FFI implementation of flutter_sodium is backwards incompatible with the previous platform channel implementation. The list of changes:
-- the entire FFI API is now synchronous, while the previous implementation was entirely asynchronous
-- all hardcoded libsodium constants are now available as properties on the Sodium class.
-- in the platform channel versions the Android and iOS implementations were not in sync. Some functions were available only in iOS, others only in Android. With the FFI implementation, there is a single API covering both platforms.
-
-## Background threads
-Since the entire FFI API is synchronous, you'll need to do some extra work to execute long running crypto function on a background thread. Luckily this is very easy with Flutter's [compute function](https://api.flutter.dev/flutter/foundation/compute.html).
-
-The following code snippet demonstrates running a password hash on the background thread.
-
-```dart
-final pw = 'hello world';
-final str = await compute(PasswordHash.hashStringStorageModerate, pw);
-
-print(str);
-```
+- `ios/prebuilt/libsodium-device.a`
+- `ios/prebuilt/libsodium-simulator.a`
+- `ios/prebuilt/libsodium-build-info.json`
diff --git a/analysis_options.yaml b/analysis_options.yaml
new file mode 100644
index 0000000..a5744c1
--- /dev/null
+++ b/analysis_options.yaml
@@ -0,0 +1,4 @@
+include: package:flutter_lints/flutter.yaml
+
+# Additional information about this file can be found at
+# https://dart.dev/guides/language/analysis-options
diff --git a/android/.gitignore b/android/.gitignore
index c6cbe56..161bdcd 100644
--- a/android/.gitignore
+++ b/android/.gitignore
@@ -6,3 +6,4 @@
.DS_Store
/build
/captures
+.cxx
diff --git a/android/build.gradle b/android/build.gradle
index eab525e..b04a830 100644
--- a/android/build.gradle
+++ b/android/build.gradle
@@ -1,8 +1,50 @@
-apply plugin: 'com.android.library'
+group = "com.firstfloorsoftware.flutter_sodium"
+version = "1.0-SNAPSHOT"
+
+buildscript {
+ ext.kotlin_version = "1.8.22"
+ repositories {
+ google()
+ mavenCentral()
+ }
+
+ dependencies {
+ classpath("com.android.tools.build:gradle:8.1.0")
+ classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version")
+ }
+}
+
+allprojects {
+ repositories {
+ google()
+ mavenCentral()
+ }
+}
+
+apply plugin: "com.android.library"
+apply plugin: "kotlin-android"
+
android {
- compileSdkVersion 28
+ namespace = "com.firstfloorsoftware.flutter_sodium"
+
+ compileSdk = 35
+
+ compileOptions {
+ sourceCompatibility = JavaVersion.VERSION_11
+ targetCompatibility = JavaVersion.VERSION_11
+ }
+
+ kotlinOptions {
+ jvmTarget = JavaVersion.VERSION_11
+ }
+
+ sourceSets {
+ main.java.srcDirs += "src/main/kotlin"
+ test.java.srcDirs += "src/test/kotlin"
+ }
+
defaultConfig {
- minSdkVersion 16
+ minSdk = 21
}
}
diff --git a/android/gradle.properties b/android/gradle.properties
deleted file mode 100644
index 38c8d45..0000000
--- a/android/gradle.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-org.gradle.jvmargs=-Xmx1536M
-android.enableR8=true
-android.useAndroidX=true
-android.enableJetifier=true
diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties
deleted file mode 100644
index 01a286e..0000000
--- a/android/gradle/wrapper/gradle-wrapper.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-distributionBase=GRADLE_USER_HOME
-distributionPath=wrapper/dists
-zipStoreBase=GRADLE_USER_HOME
-zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-all.zip
diff --git a/android/prebuilt/libsodium-build-info.json b/android/prebuilt/libsodium-build-info.json
new file mode 100644
index 0000000..27efe20
--- /dev/null
+++ b/android/prebuilt/libsodium-build-info.json
@@ -0,0 +1,43 @@
+{
+ "libsodium_version": "1.0.21",
+ "source_url": "https://download.libsodium.org/libsodium/releases/libsodium-1.0.21.tar.gz",
+ "source_sha256": "9e4285c7a419e82dedb0be63a72eea357d6943bc3e28e6735bf600dd4883feaf",
+ "android_ndk_version": "28.2.13676358",
+ "android_ndk_release": "r28c",
+ "llvm_prebuilt_host": "darwin-x86_64",
+ "page_alignment_bytes": 16384,
+ "linker_flags": ["-Wl,-z,max-page-size=16384"],
+ "build_variant": "full",
+ "upstream_dist_build_scripts": [
+ "dist-build/android-armv7-a.sh",
+ "dist-build/android-armv8-a.sh",
+ "dist-build/android-x86.sh",
+ "dist-build/android-x86_64.sh"
+ ],
+ "abi_outputs": [
+ {
+ "abi": "armeabi-v7a",
+ "android_api": 21,
+ "library_path": "android/src/main/jniLibs/armeabi-v7a/libsodium.so",
+ "sha256": "b9f6a7cc6ce615c95362d14ab4661039f2b267b188fd9c1b4e37c8d540df780a"
+ },
+ {
+ "abi": "arm64-v8a",
+ "android_api": 21,
+ "library_path": "android/src/main/jniLibs/arm64-v8a/libsodium.so",
+ "sha256": "46d8117341757f5f1328ba947fa09ef8d1e6bf13e7e151c6543d7c1666cc0264"
+ },
+ {
+ "abi": "x86",
+ "android_api": 21,
+ "library_path": "android/src/main/jniLibs/x86/libsodium.so",
+ "sha256": "7d94fddd5a5249c2222853303b1fd36be5b61ff21993e85c43840e4990c6b25c"
+ },
+ {
+ "abi": "x86_64",
+ "android_api": 21,
+ "library_path": "android/src/main/jniLibs/x86_64/libsodium.so",
+ "sha256": "9f4b0f9db22c7d82c7394e916bed06aa2fc5c05b9534e0c872f809eff7c98d79"
+ }
+ ]
+}
diff --git a/android/src/main/AndroidManifest.xml b/android/src/main/AndroidManifest.xml
index 50dede5..a2f47b6 100644
--- a/android/src/main/AndroidManifest.xml
+++ b/android/src/main/AndroidManifest.xml
@@ -1,3 +1,2 @@
-
+
diff --git a/android/src/main/java/com/firstfloorsoftware/flutter_sodium/FlutterSodiumPlugin.java b/android/src/main/java/com/firstfloorsoftware/flutter_sodium/FlutterSodiumPlugin.java
index f946a28..4587136 100644
--- a/android/src/main/java/com/firstfloorsoftware/flutter_sodium/FlutterSodiumPlugin.java
+++ b/android/src/main/java/com/firstfloorsoftware/flutter_sodium/FlutterSodiumPlugin.java
@@ -7,7 +7,6 @@
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
import io.flutter.plugin.common.MethodChannel.Result;
-import io.flutter.plugin.common.PluginRegistry.Registrar;
/** FlutterSodiumPlugin */
public class FlutterSodiumPlugin implements FlutterPlugin, MethodCallHandler {
@@ -23,20 +22,6 @@ public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBindin
channel.setMethodCallHandler(this);
}
- // This static function is optional and equivalent to onAttachedToEngine. It supports the old
- // pre-Flutter-1.12 Android projects. You are encouraged to continue supporting
- // plugin registration via this function while apps migrate to use the new Android APIs
- // post-flutter-1.12 via https://flutter.dev/go/android-project-migration.
- //
- // It is encouraged to share logic between onAttachedToEngine and registerWith to keep
- // them functionally equivalent. Only one of onAttachedToEngine or registerWith will be called
- // depending on the user's project. onAttachedToEngine or registerWith must both be defined
- // in the same class.
- public static void registerWith(Registrar registrar) {
- final MethodChannel channel = new MethodChannel(registrar.messenger(), "sodium");
- channel.setMethodCallHandler(new FlutterSodiumPlugin());
- }
-
@Override
public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
if (call.method.equals("getPlatformVersion")) {
@@ -50,4 +35,4 @@ public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
channel.setMethodCallHandler(null);
}
-}
\ No newline at end of file
+}
diff --git a/android/src/main/jniLibs/arm64-v8a/libsodium.so b/android/src/main/jniLibs/arm64-v8a/libsodium.so
index 8e8cefb..5f261c0 100755
Binary files a/android/src/main/jniLibs/arm64-v8a/libsodium.so and b/android/src/main/jniLibs/arm64-v8a/libsodium.so differ
diff --git a/android/src/main/jniLibs/armeabi-v7a/libsodium.so b/android/src/main/jniLibs/armeabi-v7a/libsodium.so
index 0490abc..5e4af0c 100755
Binary files a/android/src/main/jniLibs/armeabi-v7a/libsodium.so and b/android/src/main/jniLibs/armeabi-v7a/libsodium.so differ
diff --git a/android/src/main/jniLibs/x86/libsodium.so b/android/src/main/jniLibs/x86/libsodium.so
index 58d0d7b..0d32cac 100755
Binary files a/android/src/main/jniLibs/x86/libsodium.so and b/android/src/main/jniLibs/x86/libsodium.so differ
diff --git a/android/src/main/jniLibs/x86_64/libsodium.so b/android/src/main/jniLibs/x86_64/libsodium.so
index 1bba652..0644ba3 100755
Binary files a/android/src/main/jniLibs/x86_64/libsodium.so and b/android/src/main/jniLibs/x86_64/libsodium.so differ
diff --git a/example/analysis_options.yaml b/example/analysis_options.yaml
new file mode 100644
index 0000000..0d29021
--- /dev/null
+++ b/example/analysis_options.yaml
@@ -0,0 +1,28 @@
+# This file configures the analyzer, which statically analyzes Dart code to
+# check for errors, warnings, and lints.
+#
+# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
+# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
+# invoked from the command line by running `flutter analyze`.
+
+# The following line activates a set of recommended lints for Flutter apps,
+# packages, and plugins designed to encourage good coding practices.
+include: package:flutter_lints/flutter.yaml
+
+linter:
+ # The lint rules applied to this project can be customized in the
+ # section below to disable rules from the `package:flutter_lints/flutter.yaml`
+ # included above or to enable additional rules. A list of all available lints
+ # and their documentation is published at https://dart.dev/lints.
+ #
+ # Instead of disabling a lint rule for the entire project in the
+ # section below, it can also be suppressed for a single line of code
+ # or a specific dart file by using the `// ignore: name_of_lint` and
+ # `// ignore_for_file: name_of_lint` syntax on the line or in the file
+ # producing the lint.
+ rules:
+ # avoid_print: false # Uncomment to disable the `avoid_print` rule
+ # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
+
+# Additional information about this file can be found at
+# https://dart.dev/guides/language/analysis-options
diff --git a/example/android/.gitignore b/example/android/.gitignore
deleted file mode 100644
index bc2100d..0000000
--- a/example/android/.gitignore
+++ /dev/null
@@ -1,7 +0,0 @@
-gradle-wrapper.jar
-/.gradle
-/captures/
-/gradlew
-/gradlew.bat
-/local.properties
-GeneratedPluginRegistrant.java
diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle
deleted file mode 100644
index 6cee61f..0000000
--- a/example/android/app/build.gradle
+++ /dev/null
@@ -1,67 +0,0 @@
-def localProperties = new Properties()
-def localPropertiesFile = rootProject.file('local.properties')
-if (localPropertiesFile.exists()) {
- localPropertiesFile.withReader('UTF-8') { reader ->
- localProperties.load(reader)
- }
-}
-
-def flutterRoot = localProperties.getProperty('flutter.sdk')
-if (flutterRoot == null) {
- throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
-}
-
-def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
-if (flutterVersionCode == null) {
- flutterVersionCode = '1'
-}
-
-def flutterVersionName = localProperties.getProperty('flutter.versionName')
-if (flutterVersionName == null) {
- flutterVersionName = '1.0'
-}
-
-apply plugin: 'com.android.application'
-apply plugin: 'kotlin-android'
-apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
-
-android {
- compileSdkVersion 28
-
- sourceSets {
- main.java.srcDirs += 'src/main/kotlin'
- }
-
- lintOptions {
- disable 'InvalidPackage'
- }
-
- defaultConfig {
- // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
- applicationId "com.firstfloorsoftware.flutter_sodium_example"
- minSdkVersion 16
- targetSdkVersion 28
- versionCode flutterVersionCode.toInteger()
- versionName flutterVersionName
- testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
- }
-
- buildTypes {
- release {
- // TODO: Add your own signing config for the release build.
- // Signing with the debug keys for now, so `flutter run --release` works.
- signingConfig signingConfigs.debug
- }
- }
-}
-
-flutter {
- source '../..'
-}
-
-dependencies {
- implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
- testImplementation 'junit:junit:4.12'
- androidTestImplementation 'androidx.test:runner:1.1.1'
- androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
-}
diff --git a/example/android/app/src/debug/AndroidManifest.xml b/example/android/app/src/debug/AndroidManifest.xml
deleted file mode 100644
index ccb2dac..0000000
--- a/example/android/app/src/debug/AndroidManifest.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
diff --git a/example/android/app/src/main/AndroidManifest.xml b/example/android/app/src/main/AndroidManifest.xml
deleted file mode 100644
index 0d35ed3..0000000
--- a/example/android/app/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/example/android/app/src/main/kotlin/com/firstfloorsoftware/flutter_sodium_example/MainActivity.kt b/example/android/app/src/main/kotlin/com/firstfloorsoftware/flutter_sodium_example/MainActivity.kt
deleted file mode 100644
index e6de98c..0000000
--- a/example/android/app/src/main/kotlin/com/firstfloorsoftware/flutter_sodium_example/MainActivity.kt
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.firstfloorsoftware.flutter_sodium_example
-
-import androidx.annotation.NonNull;
-import io.flutter.embedding.android.FlutterActivity
-import io.flutter.embedding.engine.FlutterEngine
-import io.flutter.plugins.GeneratedPluginRegistrant
-
-class MainActivity: FlutterActivity() {
- override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
- GeneratedPluginRegistrant.registerWith(flutterEngine);
- }
-}
diff --git a/example/android/app/src/main/res/drawable/launch_background.xml b/example/android/app/src/main/res/drawable/launch_background.xml
deleted file mode 100644
index 304732f..0000000
--- a/example/android/app/src/main/res/drawable/launch_background.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index db77bb4..0000000
Binary files a/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 17987b7..0000000
Binary files a/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 09d4391..0000000
Binary files a/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index d5f1c8d..0000000
Binary files a/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 4d6372e..0000000
Binary files a/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/example/android/app/src/main/res/values/styles.xml b/example/android/app/src/main/res/values/styles.xml
deleted file mode 100644
index 00fa441..0000000
--- a/example/android/app/src/main/res/values/styles.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/example/android/app/src/profile/AndroidManifest.xml b/example/android/app/src/profile/AndroidManifest.xml
deleted file mode 100644
index ccb2dac..0000000
--- a/example/android/app/src/profile/AndroidManifest.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
diff --git a/example/android/build.gradle b/example/android/build.gradle
deleted file mode 100644
index 3100ad2..0000000
--- a/example/android/build.gradle
+++ /dev/null
@@ -1,31 +0,0 @@
-buildscript {
- ext.kotlin_version = '1.3.50'
- repositories {
- google()
- jcenter()
- }
-
- dependencies {
- classpath 'com.android.tools.build:gradle:3.5.0'
- classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
- }
-}
-
-allprojects {
- repositories {
- google()
- jcenter()
- }
-}
-
-rootProject.buildDir = '../build'
-subprojects {
- project.buildDir = "${rootProject.buildDir}/${project.name}"
-}
-subprojects {
- project.evaluationDependsOn(':app')
-}
-
-task clean(type: Delete) {
- delete rootProject.buildDir
-}
diff --git a/example/android/gradle.properties b/example/android/gradle.properties
deleted file mode 100644
index 38c8d45..0000000
--- a/example/android/gradle.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-org.gradle.jvmargs=-Xmx1536M
-android.enableR8=true
-android.useAndroidX=true
-android.enableJetifier=true
diff --git a/example/android/gradle/wrapper/gradle-wrapper.jar b/example/android/gradle/wrapper/gradle-wrapper.jar
deleted file mode 100644
index 13372ae..0000000
Binary files a/example/android/gradle/wrapper/gradle-wrapper.jar and /dev/null differ
diff --git a/example/android/gradle/wrapper/gradle-wrapper.properties b/example/android/gradle/wrapper/gradle-wrapper.properties
deleted file mode 100644
index 296b146..0000000
--- a/example/android/gradle/wrapper/gradle-wrapper.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-#Fri Jun 23 08:50:38 CEST 2017
-distributionBase=GRADLE_USER_HOME
-distributionPath=wrapper/dists
-zipStoreBase=GRADLE_USER_HOME
-zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-all.zip
diff --git a/example/android/gradlew b/example/android/gradlew
deleted file mode 100755
index 9d82f78..0000000
--- a/example/android/gradlew
+++ /dev/null
@@ -1,160 +0,0 @@
-#!/usr/bin/env bash
-
-##############################################################################
-##
-## Gradle start up script for UN*X
-##
-##############################################################################
-
-# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS=""
-
-APP_NAME="Gradle"
-APP_BASE_NAME=`basename "$0"`
-
-# Use the maximum available, or set MAX_FD != -1 to use that value.
-MAX_FD="maximum"
-
-warn ( ) {
- echo "$*"
-}
-
-die ( ) {
- echo
- echo "$*"
- echo
- exit 1
-}
-
-# OS specific support (must be 'true' or 'false').
-cygwin=false
-msys=false
-darwin=false
-case "`uname`" in
- CYGWIN* )
- cygwin=true
- ;;
- Darwin* )
- darwin=true
- ;;
- MINGW* )
- msys=true
- ;;
-esac
-
-# Attempt to set APP_HOME
-# Resolve links: $0 may be a link
-PRG="$0"
-# Need this for relative symlinks.
-while [ -h "$PRG" ] ; do
- ls=`ls -ld "$PRG"`
- link=`expr "$ls" : '.*-> \(.*\)$'`
- if expr "$link" : '/.*' > /dev/null; then
- PRG="$link"
- else
- PRG=`dirname "$PRG"`"/$link"
- fi
-done
-SAVED="`pwd`"
-cd "`dirname \"$PRG\"`/" >/dev/null
-APP_HOME="`pwd -P`"
-cd "$SAVED" >/dev/null
-
-CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
-
-# Determine the Java command to use to start the JVM.
-if [ -n "$JAVA_HOME" ] ; then
- if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
- # IBM's JDK on AIX uses strange locations for the executables
- JAVACMD="$JAVA_HOME/jre/sh/java"
- else
- JAVACMD="$JAVA_HOME/bin/java"
- fi
- if [ ! -x "$JAVACMD" ] ; then
- die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
-
-Please set the JAVA_HOME variable in your environment to match the
-location of your Java installation."
- fi
-else
- JAVACMD="java"
- which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-
-Please set the JAVA_HOME variable in your environment to match the
-location of your Java installation."
-fi
-
-# Increase the maximum file descriptors if we can.
-if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
- MAX_FD_LIMIT=`ulimit -H -n`
- if [ $? -eq 0 ] ; then
- if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
- MAX_FD="$MAX_FD_LIMIT"
- fi
- ulimit -n $MAX_FD
- if [ $? -ne 0 ] ; then
- warn "Could not set maximum file descriptor limit: $MAX_FD"
- fi
- else
- warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
- fi
-fi
-
-# For Darwin, add options to specify how the application appears in the dock
-if $darwin; then
- GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
-fi
-
-# For Cygwin, switch paths to Windows format before running java
-if $cygwin ; then
- APP_HOME=`cygpath --path --mixed "$APP_HOME"`
- CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
- JAVACMD=`cygpath --unix "$JAVACMD"`
-
- # We build the pattern for arguments to be converted via cygpath
- ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
- SEP=""
- for dir in $ROOTDIRSRAW ; do
- ROOTDIRS="$ROOTDIRS$SEP$dir"
- SEP="|"
- done
- OURCYGPATTERN="(^($ROOTDIRS))"
- # Add a user-defined pattern to the cygpath arguments
- if [ "$GRADLE_CYGPATTERN" != "" ] ; then
- OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
- fi
- # Now convert the arguments - kludge to limit ourselves to /bin/sh
- i=0
- for arg in "$@" ; do
- CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
- CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
-
- if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
- eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
- else
- eval `echo args$i`="\"$arg\""
- fi
- i=$((i+1))
- done
- case $i in
- (0) set -- ;;
- (1) set -- "$args0" ;;
- (2) set -- "$args0" "$args1" ;;
- (3) set -- "$args0" "$args1" "$args2" ;;
- (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
- (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
- (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
- (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
- (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
- (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
- esac
-fi
-
-# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
-function splitJvmOpts() {
- JVM_OPTS=("$@")
-}
-eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
-JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
-
-exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/example/android/gradlew.bat b/example/android/gradlew.bat
deleted file mode 100644
index aec9973..0000000
--- a/example/android/gradlew.bat
+++ /dev/null
@@ -1,90 +0,0 @@
-@if "%DEBUG%" == "" @echo off
-@rem ##########################################################################
-@rem
-@rem Gradle startup script for Windows
-@rem
-@rem ##########################################################################
-
-@rem Set local scope for the variables with windows NT shell
-if "%OS%"=="Windows_NT" setlocal
-
-@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS=
-
-set DIRNAME=%~dp0
-if "%DIRNAME%" == "" set DIRNAME=.
-set APP_BASE_NAME=%~n0
-set APP_HOME=%DIRNAME%
-
-@rem Find java.exe
-if defined JAVA_HOME goto findJavaFromJavaHome
-
-set JAVA_EXE=java.exe
-%JAVA_EXE% -version >NUL 2>&1
-if "%ERRORLEVEL%" == "0" goto init
-
-echo.
-echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:findJavaFromJavaHome
-set JAVA_HOME=%JAVA_HOME:"=%
-set JAVA_EXE=%JAVA_HOME%/bin/java.exe
-
-if exist "%JAVA_EXE%" goto init
-
-echo.
-echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:init
-@rem Get command-line arguments, handling Windowz variants
-
-if not "%OS%" == "Windows_NT" goto win9xME_args
-if "%@eval[2+2]" == "4" goto 4NT_args
-
-:win9xME_args
-@rem Slurp the command line arguments.
-set CMD_LINE_ARGS=
-set _SKIP=2
-
-:win9xME_args_slurp
-if "x%~1" == "x" goto execute
-
-set CMD_LINE_ARGS=%*
-goto execute
-
-:4NT_args
-@rem Get arguments from the 4NT Shell from JP Software
-set CMD_LINE_ARGS=%$
-
-:execute
-@rem Setup the command line
-
-set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
-
-@rem Execute Gradle
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
-
-:end
-@rem End local scope for the variables with windows NT shell
-if "%ERRORLEVEL%"=="0" goto mainEnd
-
-:fail
-rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
-rem the _cmd.exe /c_ return code!
-if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
-exit /b 1
-
-:mainEnd
-if "%OS%"=="Windows_NT" endlocal
-
-:omega
diff --git a/example/android/settings.gradle b/example/android/settings.gradle
deleted file mode 100644
index 5a2f14f..0000000
--- a/example/android/settings.gradle
+++ /dev/null
@@ -1,15 +0,0 @@
-include ':app'
-
-def flutterProjectRoot = rootProject.projectDir.parentFile.toPath()
-
-def plugins = new Properties()
-def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins')
-if (pluginsFile.exists()) {
- pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) }
-}
-
-plugins.each { name, path ->
- def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile()
- include ":$name"
- project(":$name").projectDir = pluginDirectory
-}
diff --git a/example/integration_test/plugin_integration_test.dart b/example/integration_test/plugin_integration_test.dart
new file mode 100644
index 0000000..4469487
--- /dev/null
+++ b/example/integration_test/plugin_integration_test.dart
@@ -0,0 +1,25 @@
+// This is a basic Flutter integration test.
+//
+// Since integration tests run in a full Flutter application, they can interact
+// with the host side of a plugin implementation, unlike Dart unit tests.
+//
+// For more information about Flutter integration tests, please see
+// https://flutter.dev/to/integration-testing
+
+
+import 'package:flutter_test/flutter_test.dart';
+import 'package:integration_test/integration_test.dart';
+
+import 'package:flutter_sodium/flutter_sodium.dart';
+
+void main() {
+ IntegrationTestWidgetsFlutterBinding.ensureInitialized();
+
+ testWidgets('getPlatformVersion test', (WidgetTester tester) async {
+ final FlutterSodium plugin = FlutterSodium();
+ final String? version = await plugin.getPlatformVersion();
+ // The version string depends on the host platform running the test, so
+ // just assert that some non-empty string is returned.
+ expect(version?.isNotEmpty, true);
+ });
+}
diff --git a/example/ios/.gitignore b/example/ios/.gitignore
deleted file mode 100644
index e96ef60..0000000
--- a/example/ios/.gitignore
+++ /dev/null
@@ -1,32 +0,0 @@
-*.mode1v3
-*.mode2v3
-*.moved-aside
-*.pbxuser
-*.perspectivev3
-**/*sync/
-.sconsign.dblite
-.tags*
-**/.vagrant/
-**/DerivedData/
-Icon?
-**/Pods/
-**/.symlinks/
-profile
-xcuserdata
-**/.generated/
-Flutter/App.framework
-Flutter/Flutter.framework
-Flutter/Flutter.podspec
-Flutter/Generated.xcconfig
-Flutter/app.flx
-Flutter/app.zip
-Flutter/flutter_assets/
-Flutter/flutter_export_environment.sh
-ServiceDefinitions.json
-Runner/GeneratedPluginRegistrant.*
-
-# Exceptions to above rules.
-!default.mode1v3
-!default.mode2v3
-!default.pbxuser
-!default.perspectivev3
diff --git a/example/ios/Flutter/AppFrameworkInfo.plist b/example/ios/Flutter/AppFrameworkInfo.plist
deleted file mode 100644
index 6b4c0f7..0000000
--- a/example/ios/Flutter/AppFrameworkInfo.plist
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
- CFBundleDevelopmentRegion
- $(DEVELOPMENT_LANGUAGE)
- CFBundleExecutable
- App
- CFBundleIdentifier
- io.flutter.flutter.app
- CFBundleInfoDictionaryVersion
- 6.0
- CFBundleName
- App
- CFBundlePackageType
- FMWK
- CFBundleShortVersionString
- 1.0
- CFBundleSignature
- ????
- CFBundleVersion
- 1.0
- MinimumOSVersion
- 8.0
-
-
diff --git a/example/ios/Flutter/Debug.xcconfig b/example/ios/Flutter/Debug.xcconfig
deleted file mode 100644
index b2f5fae..0000000
--- a/example/ios/Flutter/Debug.xcconfig
+++ /dev/null
@@ -1,3 +0,0 @@
-#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
-#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
-#include "Generated.xcconfig"
diff --git a/example/ios/Flutter/Release.xcconfig b/example/ios/Flutter/Release.xcconfig
deleted file mode 100644
index 88c2914..0000000
--- a/example/ios/Flutter/Release.xcconfig
+++ /dev/null
@@ -1,3 +0,0 @@
-#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
-#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
-#include "Generated.xcconfig"
diff --git a/example/ios/Podfile b/example/ios/Podfile
deleted file mode 100644
index 1e8c3c9..0000000
--- a/example/ios/Podfile
+++ /dev/null
@@ -1,41 +0,0 @@
-# Uncomment this line to define a global platform for your project
-# platform :ios, '9.0'
-
-# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
-ENV['COCOAPODS_DISABLE_STATS'] = 'true'
-
-project 'Runner', {
- 'Debug' => :debug,
- 'Profile' => :release,
- 'Release' => :release,
-}
-
-def flutter_root
- generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)
- unless File.exist?(generated_xcode_build_settings_path)
- raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first"
- end
-
- File.foreach(generated_xcode_build_settings_path) do |line|
- matches = line.match(/FLUTTER_ROOT\=(.*)/)
- return matches[1].strip if matches
- end
- raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get"
-end
-
-require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
-
-flutter_ios_podfile_setup
-
-target 'Runner' do
- use_frameworks!
- use_modular_headers!
-
- flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
-end
-
-post_install do |installer|
- installer.pods_project.targets.each do |target|
- flutter_additional_ios_build_settings(target)
- end
-end
diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock
deleted file mode 100644
index 6df20b8..0000000
--- a/example/ios/Podfile.lock
+++ /dev/null
@@ -1,28 +0,0 @@
-PODS:
- - Flutter (1.0.0)
- - flutter_sodium (0.0.1):
- - Flutter
- - url_launcher (0.0.1):
- - Flutter
-
-DEPENDENCIES:
- - Flutter (from `Flutter`)
- - flutter_sodium (from `.symlinks/plugins/flutter_sodium/ios`)
- - url_launcher (from `.symlinks/plugins/url_launcher/ios`)
-
-EXTERNAL SOURCES:
- Flutter:
- :path: Flutter
- flutter_sodium:
- :path: ".symlinks/plugins/flutter_sodium/ios"
- url_launcher:
- :path: ".symlinks/plugins/url_launcher/ios"
-
-SPEC CHECKSUMS:
- Flutter: 434fef37c0980e73bb6479ef766c45957d4b510c
- flutter_sodium: c84426b4de738514b5b66cfdeb8a06634e72fe0b
- url_launcher: 6fef411d543ceb26efce54b05a0a40bfd74cbbef
-
-PODFILE CHECKSUM: aafe91acc616949ddb318b77800a7f51bffa2a4c
-
-COCOAPODS: 1.10.1
diff --git a/example/ios/Runner.xcodeproj/project.pbxproj b/example/ios/Runner.xcodeproj/project.pbxproj
deleted file mode 100644
index 7713c0b..0000000
--- a/example/ios/Runner.xcodeproj/project.pbxproj
+++ /dev/null
@@ -1,574 +0,0 @@
-// !$*UTF8*$!
-{
- archiveVersion = 1;
- classes = {
- };
- objectVersion = 46;
- objects = {
-
-/* Begin PBXBuildFile section */
- 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
- 149FB357672EE250597AC929 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C838EC254A0CCC58ACAA81B /* Pods_Runner.framework */; };
- 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
- 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
- 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
- 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
- 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
-/* End PBXBuildFile section */
-
-/* Begin PBXCopyFilesBuildPhase section */
- 9705A1C41CF9048500538489 /* Embed Frameworks */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- );
- name = "Embed Frameworks";
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXCopyFilesBuildPhase section */
-
-/* Begin PBXFileReference section */
- 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; };
- 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; };
- 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; };
- 4C838EC254A0CCC58ACAA81B /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
- 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; };
- 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
- 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; };
- 80F2A67D88D5308C7C03107D /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; };
- 8675E4787B222EA609FB9914 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; };
- 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; };
- 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; };
- 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
- 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
- 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
- 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
- 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
- E4CB2F8B43CC8EB2CA464EDF /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; };
-/* End PBXFileReference section */
-
-/* Begin PBXFrameworksBuildPhase section */
- 97C146EB1CF9000F007C117D /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 149FB357672EE250597AC929 /* Pods_Runner.framework in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXFrameworksBuildPhase section */
-
-/* Begin PBXGroup section */
- 15C5CDE098F27C804253D648 /* Pods */ = {
- isa = PBXGroup;
- children = (
- 8675E4787B222EA609FB9914 /* Pods-Runner.debug.xcconfig */,
- E4CB2F8B43CC8EB2CA464EDF /* Pods-Runner.release.xcconfig */,
- 80F2A67D88D5308C7C03107D /* Pods-Runner.profile.xcconfig */,
- );
- name = Pods;
- path = Pods;
- sourceTree = "";
- };
- 6B28B36E418160D8E8452581 /* Frameworks */ = {
- isa = PBXGroup;
- children = (
- 4C838EC254A0CCC58ACAA81B /* Pods_Runner.framework */,
- );
- name = Frameworks;
- sourceTree = "";
- };
- 9740EEB11CF90186004384FC /* Flutter */ = {
- isa = PBXGroup;
- children = (
- 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
- 9740EEB21CF90195004384FC /* Debug.xcconfig */,
- 7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
- 9740EEB31CF90195004384FC /* Generated.xcconfig */,
- );
- name = Flutter;
- sourceTree = "";
- };
- 97C146E51CF9000F007C117D = {
- isa = PBXGroup;
- children = (
- 9740EEB11CF90186004384FC /* Flutter */,
- 97C146F01CF9000F007C117D /* Runner */,
- 97C146EF1CF9000F007C117D /* Products */,
- 15C5CDE098F27C804253D648 /* Pods */,
- 6B28B36E418160D8E8452581 /* Frameworks */,
- );
- sourceTree = "";
- };
- 97C146EF1CF9000F007C117D /* Products */ = {
- isa = PBXGroup;
- children = (
- 97C146EE1CF9000F007C117D /* Runner.app */,
- );
- name = Products;
- sourceTree = "";
- };
- 97C146F01CF9000F007C117D /* Runner */ = {
- isa = PBXGroup;
- children = (
- 97C146FA1CF9000F007C117D /* Main.storyboard */,
- 97C146FD1CF9000F007C117D /* Assets.xcassets */,
- 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
- 97C147021CF9000F007C117D /* Info.plist */,
- 97C146F11CF9000F007C117D /* Supporting Files */,
- 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
- 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
- 74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
- 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,
- );
- path = Runner;
- sourceTree = "";
- };
- 97C146F11CF9000F007C117D /* Supporting Files */ = {
- isa = PBXGroup;
- children = (
- );
- name = "Supporting Files";
- sourceTree = "";
- };
-/* End PBXGroup section */
-
-/* Begin PBXNativeTarget section */
- 97C146ED1CF9000F007C117D /* Runner */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
- buildPhases = (
- E29DD6FFE92E2C786601B5A9 /* [CP] Check Pods Manifest.lock */,
- 9740EEB61CF901F6004384FC /* Run Script */,
- 97C146EA1CF9000F007C117D /* Sources */,
- 97C146EB1CF9000F007C117D /* Frameworks */,
- 97C146EC1CF9000F007C117D /* Resources */,
- 9705A1C41CF9048500538489 /* Embed Frameworks */,
- 3B06AD1E1E4923F5004D2608 /* Thin Binary */,
- 52D823E0B64BC1FAD8E1E7C2 /* [CP] Embed Pods Frameworks */,
- );
- buildRules = (
- );
- dependencies = (
- );
- name = Runner;
- productName = Runner;
- productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
- productType = "com.apple.product-type.application";
- };
-/* End PBXNativeTarget section */
-
-/* Begin PBXProject section */
- 97C146E61CF9000F007C117D /* Project object */ = {
- isa = PBXProject;
- attributes = {
- LastUpgradeCheck = 1020;
- ORGANIZATIONNAME = "The Chromium Authors";
- TargetAttributes = {
- 97C146ED1CF9000F007C117D = {
- CreatedOnToolsVersion = 7.3.1;
- LastSwiftMigration = 1100;
- };
- };
- };
- buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
- compatibilityVersion = "Xcode 3.2";
- developmentRegion = en;
- hasScannedForEncodings = 0;
- knownRegions = (
- en,
- Base,
- );
- mainGroup = 97C146E51CF9000F007C117D;
- productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
- projectDirPath = "";
- projectRoot = "";
- targets = (
- 97C146ED1CF9000F007C117D /* Runner */,
- );
- };
-/* End PBXProject section */
-
-/* Begin PBXResourcesBuildPhase section */
- 97C146EC1CF9000F007C117D /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
- 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
- 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
- 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXResourcesBuildPhase section */
-
-/* Begin PBXShellScriptBuildPhase section */
- 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
- isa = PBXShellScriptBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- inputPaths = (
- );
- name = "Thin Binary";
- outputPaths = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- shellPath = /bin/sh;
- shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
- };
- 52D823E0B64BC1FAD8E1E7C2 /* [CP] Embed Pods Frameworks */ = {
- isa = PBXShellScriptBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- inputPaths = (
- "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh",
- "${BUILT_PRODUCTS_DIR}/flutter_sodium/flutter_sodium.framework",
- "${BUILT_PRODUCTS_DIR}/url_launcher/url_launcher.framework",
- );
- name = "[CP] Embed Pods Frameworks";
- outputPaths = (
- "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_sodium.framework",
- "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/url_launcher.framework",
- );
- runOnlyForDeploymentPostprocessing = 0;
- shellPath = /bin/sh;
- shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
- showEnvVarsInLog = 0;
- };
- 9740EEB61CF901F6004384FC /* Run Script */ = {
- isa = PBXShellScriptBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- inputPaths = (
- );
- name = "Run Script";
- outputPaths = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- shellPath = /bin/sh;
- shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
- };
- E29DD6FFE92E2C786601B5A9 /* [CP] Check Pods Manifest.lock */ = {
- isa = PBXShellScriptBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- inputFileListPaths = (
- );
- inputPaths = (
- "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
- "${PODS_ROOT}/Manifest.lock",
- );
- name = "[CP] Check Pods Manifest.lock";
- outputFileListPaths = (
- );
- outputPaths = (
- "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
- );
- runOnlyForDeploymentPostprocessing = 0;
- shellPath = /bin/sh;
- shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
- showEnvVarsInLog = 0;
- };
-/* End PBXShellScriptBuildPhase section */
-
-/* Begin PBXSourcesBuildPhase section */
- 97C146EA1CF9000F007C117D /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
- 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXSourcesBuildPhase section */
-
-/* Begin PBXVariantGroup section */
- 97C146FA1CF9000F007C117D /* Main.storyboard */ = {
- isa = PBXVariantGroup;
- children = (
- 97C146FB1CF9000F007C117D /* Base */,
- );
- name = Main.storyboard;
- sourceTree = "";
- };
- 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {
- isa = PBXVariantGroup;
- children = (
- 97C147001CF9000F007C117D /* Base */,
- );
- name = LaunchScreen.storyboard;
- sourceTree = "";
- };
-/* End PBXVariantGroup section */
-
-/* Begin XCBuildConfiguration section */
- 249021D3217E4FDB00AE95B9 /* Profile */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- CLANG_ANALYZER_NONNULL = YES;
- CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
- CLANG_CXX_LIBRARY = "libc++";
- CLANG_ENABLE_MODULES = YES;
- CLANG_ENABLE_OBJC_ARC = YES;
- CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
- CLANG_WARN_BOOL_CONVERSION = YES;
- CLANG_WARN_COMMA = YES;
- CLANG_WARN_CONSTANT_CONVERSION = YES;
- CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
- CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
- CLANG_WARN_EMPTY_BODY = YES;
- CLANG_WARN_ENUM_CONVERSION = YES;
- CLANG_WARN_INFINITE_RECURSION = YES;
- CLANG_WARN_INT_CONVERSION = YES;
- CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
- CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
- CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
- CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
- CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
- CLANG_WARN_STRICT_PROTOTYPES = YES;
- CLANG_WARN_SUSPICIOUS_MOVE = YES;
- CLANG_WARN_UNREACHABLE_CODE = YES;
- CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
- "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
- COPY_PHASE_STRIP = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- ENABLE_NS_ASSERTIONS = NO;
- ENABLE_STRICT_OBJC_MSGSEND = YES;
- GCC_C_LANGUAGE_STANDARD = gnu99;
- GCC_NO_COMMON_BLOCKS = YES;
- GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
- GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
- GCC_WARN_UNDECLARED_SELECTOR = YES;
- GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
- GCC_WARN_UNUSED_FUNCTION = YES;
- GCC_WARN_UNUSED_VARIABLE = YES;
- IPHONEOS_DEPLOYMENT_TARGET = 8.0;
- MTL_ENABLE_DEBUG_INFO = NO;
- SDKROOT = iphoneos;
- SUPPORTED_PLATFORMS = iphoneos;
- TARGETED_DEVICE_FAMILY = "1,2";
- VALIDATE_PRODUCT = YES;
- };
- name = Profile;
- };
- 249021D4217E4FDB00AE95B9 /* Profile */ = {
- isa = XCBuildConfiguration;
- baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
- buildSettings = {
- ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
- CLANG_ENABLE_MODULES = YES;
- CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
- ENABLE_BITCODE = NO;
- FRAMEWORK_SEARCH_PATHS = (
- "$(inherited)",
- "$(PROJECT_DIR)/Flutter",
- );
- INFOPLIST_FILE = Runner/Info.plist;
- LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
- LIBRARY_SEARCH_PATHS = (
- "$(inherited)",
- "$(PROJECT_DIR)/Flutter",
- );
- PRODUCT_BUNDLE_IDENTIFIER = com.firstfloorsoftware.flutterSodiumExample;
- PRODUCT_NAME = "$(TARGET_NAME)";
- SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
- SWIFT_VERSION = 5.0;
- VERSIONING_SYSTEM = "apple-generic";
- };
- name = Profile;
- };
- 97C147031CF9000F007C117D /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- CLANG_ANALYZER_NONNULL = YES;
- CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
- CLANG_CXX_LIBRARY = "libc++";
- CLANG_ENABLE_MODULES = YES;
- CLANG_ENABLE_OBJC_ARC = YES;
- CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
- CLANG_WARN_BOOL_CONVERSION = YES;
- CLANG_WARN_COMMA = YES;
- CLANG_WARN_CONSTANT_CONVERSION = YES;
- CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
- CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
- CLANG_WARN_EMPTY_BODY = YES;
- CLANG_WARN_ENUM_CONVERSION = YES;
- CLANG_WARN_INFINITE_RECURSION = YES;
- CLANG_WARN_INT_CONVERSION = YES;
- CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
- CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
- CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
- CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
- CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
- CLANG_WARN_STRICT_PROTOTYPES = YES;
- CLANG_WARN_SUSPICIOUS_MOVE = YES;
- CLANG_WARN_UNREACHABLE_CODE = YES;
- CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
- "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
- COPY_PHASE_STRIP = NO;
- DEBUG_INFORMATION_FORMAT = dwarf;
- ENABLE_STRICT_OBJC_MSGSEND = YES;
- ENABLE_TESTABILITY = YES;
- GCC_C_LANGUAGE_STANDARD = gnu99;
- GCC_DYNAMIC_NO_PIC = NO;
- GCC_NO_COMMON_BLOCKS = YES;
- GCC_OPTIMIZATION_LEVEL = 0;
- GCC_PREPROCESSOR_DEFINITIONS = (
- "DEBUG=1",
- "$(inherited)",
- );
- GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
- GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
- GCC_WARN_UNDECLARED_SELECTOR = YES;
- GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
- GCC_WARN_UNUSED_FUNCTION = YES;
- GCC_WARN_UNUSED_VARIABLE = YES;
- IPHONEOS_DEPLOYMENT_TARGET = 8.0;
- MTL_ENABLE_DEBUG_INFO = YES;
- ONLY_ACTIVE_ARCH = YES;
- SDKROOT = iphoneos;
- TARGETED_DEVICE_FAMILY = "1,2";
- };
- name = Debug;
- };
- 97C147041CF9000F007C117D /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- CLANG_ANALYZER_NONNULL = YES;
- CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
- CLANG_CXX_LIBRARY = "libc++";
- CLANG_ENABLE_MODULES = YES;
- CLANG_ENABLE_OBJC_ARC = YES;
- CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
- CLANG_WARN_BOOL_CONVERSION = YES;
- CLANG_WARN_COMMA = YES;
- CLANG_WARN_CONSTANT_CONVERSION = YES;
- CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
- CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
- CLANG_WARN_EMPTY_BODY = YES;
- CLANG_WARN_ENUM_CONVERSION = YES;
- CLANG_WARN_INFINITE_RECURSION = YES;
- CLANG_WARN_INT_CONVERSION = YES;
- CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
- CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
- CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
- CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
- CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
- CLANG_WARN_STRICT_PROTOTYPES = YES;
- CLANG_WARN_SUSPICIOUS_MOVE = YES;
- CLANG_WARN_UNREACHABLE_CODE = YES;
- CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
- "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
- COPY_PHASE_STRIP = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- ENABLE_NS_ASSERTIONS = NO;
- ENABLE_STRICT_OBJC_MSGSEND = YES;
- GCC_C_LANGUAGE_STANDARD = gnu99;
- GCC_NO_COMMON_BLOCKS = YES;
- GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
- GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
- GCC_WARN_UNDECLARED_SELECTOR = YES;
- GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
- GCC_WARN_UNUSED_FUNCTION = YES;
- GCC_WARN_UNUSED_VARIABLE = YES;
- IPHONEOS_DEPLOYMENT_TARGET = 8.0;
- MTL_ENABLE_DEBUG_INFO = NO;
- SDKROOT = iphoneos;
- SUPPORTED_PLATFORMS = iphoneos;
- SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
- TARGETED_DEVICE_FAMILY = "1,2";
- VALIDATE_PRODUCT = YES;
- };
- name = Release;
- };
- 97C147061CF9000F007C117D /* Debug */ = {
- isa = XCBuildConfiguration;
- baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
- buildSettings = {
- ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
- CLANG_ENABLE_MODULES = YES;
- CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
- ENABLE_BITCODE = NO;
- FRAMEWORK_SEARCH_PATHS = (
- "$(inherited)",
- "$(PROJECT_DIR)/Flutter",
- );
- INFOPLIST_FILE = Runner/Info.plist;
- LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
- LIBRARY_SEARCH_PATHS = (
- "$(inherited)",
- "$(PROJECT_DIR)/Flutter",
- );
- PRODUCT_BUNDLE_IDENTIFIER = com.firstfloorsoftware.flutterSodiumExample;
- PRODUCT_NAME = "$(TARGET_NAME)";
- SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
- SWIFT_OPTIMIZATION_LEVEL = "-Onone";
- SWIFT_VERSION = 5.0;
- VERSIONING_SYSTEM = "apple-generic";
- };
- name = Debug;
- };
- 97C147071CF9000F007C117D /* Release */ = {
- isa = XCBuildConfiguration;
- baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
- buildSettings = {
- ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
- CLANG_ENABLE_MODULES = YES;
- CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
- ENABLE_BITCODE = NO;
- FRAMEWORK_SEARCH_PATHS = (
- "$(inherited)",
- "$(PROJECT_DIR)/Flutter",
- );
- INFOPLIST_FILE = Runner/Info.plist;
- LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
- LIBRARY_SEARCH_PATHS = (
- "$(inherited)",
- "$(PROJECT_DIR)/Flutter",
- );
- PRODUCT_BUNDLE_IDENTIFIER = com.firstfloorsoftware.flutterSodiumExample;
- PRODUCT_NAME = "$(TARGET_NAME)";
- SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
- SWIFT_VERSION = 5.0;
- VERSIONING_SYSTEM = "apple-generic";
- };
- name = Release;
- };
-/* End XCBuildConfiguration section */
-
-/* Begin XCConfigurationList section */
- 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 97C147031CF9000F007C117D /* Debug */,
- 97C147041CF9000F007C117D /* Release */,
- 249021D3217E4FDB00AE95B9 /* Profile */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
- 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 97C147061CF9000F007C117D /* Debug */,
- 97C147071CF9000F007C117D /* Release */,
- 249021D4217E4FDB00AE95B9 /* Profile */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
-/* End XCConfigurationList section */
- };
- rootObject = 97C146E61CF9000F007C117D /* Project object */;
-}
diff --git a/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
deleted file mode 100644
index 919434a..0000000
--- a/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
diff --git a/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
deleted file mode 100644
index a28140c..0000000
--- a/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
+++ /dev/null
@@ -1,91 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/example/ios/Runner.xcworkspace/contents.xcworkspacedata
deleted file mode 100644
index 21a3cc1..0000000
--- a/example/ios/Runner.xcworkspace/contents.xcworkspacedata
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
-
diff --git a/example/ios/Runner/AppDelegate.swift b/example/ios/Runner/AppDelegate.swift
deleted file mode 100644
index 70693e4..0000000
--- a/example/ios/Runner/AppDelegate.swift
+++ /dev/null
@@ -1,13 +0,0 @@
-import UIKit
-import Flutter
-
-@UIApplicationMain
-@objc class AppDelegate: FlutterAppDelegate {
- override func application(
- _ application: UIApplication,
- didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
- ) -> Bool {
- GeneratedPluginRegistrant.register(with: self)
- return super.application(application, didFinishLaunchingWithOptions: launchOptions)
- }
-}
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
deleted file mode 100644
index d36b1fa..0000000
--- a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
+++ /dev/null
@@ -1,122 +0,0 @@
-{
- "images" : [
- {
- "size" : "20x20",
- "idiom" : "iphone",
- "filename" : "Icon-App-20x20@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "20x20",
- "idiom" : "iphone",
- "filename" : "Icon-App-20x20@3x.png",
- "scale" : "3x"
- },
- {
- "size" : "29x29",
- "idiom" : "iphone",
- "filename" : "Icon-App-29x29@1x.png",
- "scale" : "1x"
- },
- {
- "size" : "29x29",
- "idiom" : "iphone",
- "filename" : "Icon-App-29x29@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "29x29",
- "idiom" : "iphone",
- "filename" : "Icon-App-29x29@3x.png",
- "scale" : "3x"
- },
- {
- "size" : "40x40",
- "idiom" : "iphone",
- "filename" : "Icon-App-40x40@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "40x40",
- "idiom" : "iphone",
- "filename" : "Icon-App-40x40@3x.png",
- "scale" : "3x"
- },
- {
- "size" : "60x60",
- "idiom" : "iphone",
- "filename" : "Icon-App-60x60@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "60x60",
- "idiom" : "iphone",
- "filename" : "Icon-App-60x60@3x.png",
- "scale" : "3x"
- },
- {
- "size" : "20x20",
- "idiom" : "ipad",
- "filename" : "Icon-App-20x20@1x.png",
- "scale" : "1x"
- },
- {
- "size" : "20x20",
- "idiom" : "ipad",
- "filename" : "Icon-App-20x20@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "29x29",
- "idiom" : "ipad",
- "filename" : "Icon-App-29x29@1x.png",
- "scale" : "1x"
- },
- {
- "size" : "29x29",
- "idiom" : "ipad",
- "filename" : "Icon-App-29x29@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "40x40",
- "idiom" : "ipad",
- "filename" : "Icon-App-40x40@1x.png",
- "scale" : "1x"
- },
- {
- "size" : "40x40",
- "idiom" : "ipad",
- "filename" : "Icon-App-40x40@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "76x76",
- "idiom" : "ipad",
- "filename" : "Icon-App-76x76@1x.png",
- "scale" : "1x"
- },
- {
- "size" : "76x76",
- "idiom" : "ipad",
- "filename" : "Icon-App-76x76@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "83.5x83.5",
- "idiom" : "ipad",
- "filename" : "Icon-App-83.5x83.5@2x.png",
- "scale" : "2x"
- },
- {
- "size" : "1024x1024",
- "idiom" : "ios-marketing",
- "filename" : "Icon-App-1024x1024@1x.png",
- "scale" : "1x"
- }
- ],
- "info" : {
- "version" : 1,
- "author" : "xcode"
- }
-}
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
deleted file mode 100644
index dc9ada4..0000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
deleted file mode 100644
index 28c6bf0..0000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
deleted file mode 100644
index 2ccbfd9..0000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
deleted file mode 100644
index f091b6b..0000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
deleted file mode 100644
index 4cde121..0000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
deleted file mode 100644
index d0ef06e..0000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
deleted file mode 100644
index dcdc230..0000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
deleted file mode 100644
index 2ccbfd9..0000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
deleted file mode 100644
index c8f9ed8..0000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
deleted file mode 100644
index a6d6b86..0000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
deleted file mode 100644
index a6d6b86..0000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
deleted file mode 100644
index 75b2d16..0000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
deleted file mode 100644
index c4df70d..0000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
deleted file mode 100644
index 6a84f41..0000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
deleted file mode 100644
index d0e1f58..0000000
Binary files a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
deleted file mode 100644
index 0bedcf2..0000000
--- a/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
- "images" : [
- {
- "idiom" : "universal",
- "filename" : "LaunchImage.png",
- "scale" : "1x"
- },
- {
- "idiom" : "universal",
- "filename" : "LaunchImage@2x.png",
- "scale" : "2x"
- },
- {
- "idiom" : "universal",
- "filename" : "LaunchImage@3x.png",
- "scale" : "3x"
- }
- ],
- "info" : {
- "version" : 1,
- "author" : "xcode"
- }
-}
diff --git a/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
deleted file mode 100644
index 9da19ea..0000000
Binary files a/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
deleted file mode 100644
index 9da19ea..0000000
Binary files a/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
deleted file mode 100644
index 9da19ea..0000000
Binary files a/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png and /dev/null differ
diff --git a/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
deleted file mode 100644
index 89c2725..0000000
--- a/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# Launch Screen Assets
-
-You can customize the launch screen with your own desired assets by replacing the image files in this directory.
-
-You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.
\ No newline at end of file
diff --git a/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/example/ios/Runner/Base.lproj/LaunchScreen.storyboard
deleted file mode 100644
index f2e259c..0000000
--- a/example/ios/Runner/Base.lproj/LaunchScreen.storyboard
+++ /dev/null
@@ -1,37 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/example/ios/Runner/Base.lproj/Main.storyboard b/example/ios/Runner/Base.lproj/Main.storyboard
deleted file mode 100644
index f3c2851..0000000
--- a/example/ios/Runner/Base.lproj/Main.storyboard
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/example/ios/Runner/Info.plist b/example/ios/Runner/Info.plist
deleted file mode 100644
index 25e9cf1..0000000
--- a/example/ios/Runner/Info.plist
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
-
-
- CFBundleDevelopmentRegion
- $(DEVELOPMENT_LANGUAGE)
- CFBundleExecutable
- $(EXECUTABLE_NAME)
- CFBundleIdentifier
- $(PRODUCT_BUNDLE_IDENTIFIER)
- CFBundleInfoDictionaryVersion
- 6.0
- CFBundleName
- flutter_sodium_example
- CFBundlePackageType
- APPL
- CFBundleShortVersionString
- $(FLUTTER_BUILD_NAME)
- CFBundleSignature
- ????
- CFBundleVersion
- $(FLUTTER_BUILD_NUMBER)
- LSRequiresIPhoneOS
-
- UILaunchStoryboardName
- LaunchScreen
- UIMainStoryboardFile
- Main
- UISupportedInterfaceOrientations
-
- UIInterfaceOrientationPortrait
- UIInterfaceOrientationLandscapeLeft
- UIInterfaceOrientationLandscapeRight
-
- UISupportedInterfaceOrientations~ipad
-
- UIInterfaceOrientationPortrait
- UIInterfaceOrientationPortraitUpsideDown
- UIInterfaceOrientationLandscapeLeft
- UIInterfaceOrientationLandscapeRight
-
- UIViewControllerBasedStatusBarAppearance
-
-
-
diff --git a/example/ios/Runner/Runner-Bridging-Header.h b/example/ios/Runner/Runner-Bridging-Header.h
deleted file mode 100644
index 7335fdf..0000000
--- a/example/ios/Runner/Runner-Bridging-Header.h
+++ /dev/null
@@ -1 +0,0 @@
-#import "GeneratedPluginRegistrant.h"
\ No newline at end of file
diff --git a/example/macos/Podfile b/example/macos/Podfile
deleted file mode 100644
index d60ec71..0000000
--- a/example/macos/Podfile
+++ /dev/null
@@ -1,82 +0,0 @@
-platform :osx, '10.11'
-
-# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
-ENV['COCOAPODS_DISABLE_STATS'] = 'true'
-
-project 'Runner', {
- 'Debug' => :debug,
- 'Profile' => :release,
- 'Release' => :release,
-}
-
-def parse_KV_file(file, separator='=')
- file_abs_path = File.expand_path(file)
- if !File.exists? file_abs_path
- return [];
- end
- pods_ary = []
- skip_line_start_symbols = ["#", "/"]
- File.foreach(file_abs_path) { |line|
- next if skip_line_start_symbols.any? { |symbol| line =~ /^\s*#{symbol}/ }
- plugin = line.split(pattern=separator)
- if plugin.length == 2
- podname = plugin[0].strip()
- path = plugin[1].strip()
- podpath = File.expand_path("#{path}", file_abs_path)
- pods_ary.push({:name => podname, :path => podpath});
- else
- puts "Invalid plugin specification: #{line}"
- end
- }
- return pods_ary
-end
-
-def pubspec_supports_macos(file)
- file_abs_path = File.expand_path(file)
- if !File.exists? file_abs_path
- return false;
- end
- File.foreach(file_abs_path) { |line|
- return true if line =~ /^\s*macos:/
- }
- return false
-end
-
-target 'Runner' do
- use_frameworks!
- use_modular_headers!
-
- # Prepare symlinks folder. We use symlinks to avoid having Podfile.lock
- # referring to absolute paths on developers' machines.
- ephemeral_dir = File.join('Flutter', 'ephemeral')
- symlink_dir = File.join(ephemeral_dir, '.symlinks')
- symlink_plugins_dir = File.join(symlink_dir, 'plugins')
- system("rm -rf #{symlink_dir}")
- system("mkdir -p #{symlink_plugins_dir}")
-
- # Flutter Pods
- generated_xcconfig = parse_KV_file(File.join(ephemeral_dir, 'Flutter-Generated.xcconfig'))
- if generated_xcconfig.empty?
- puts "Flutter-Generated.xcconfig must exist. If you're running pod install manually, make sure flutter packages get is executed first."
- end
- generated_xcconfig.map { |p|
- if p[:name] == 'FLUTTER_FRAMEWORK_DIR'
- symlink = File.join(symlink_dir, 'flutter')
- File.symlink(File.dirname(p[:path]), symlink)
- pod 'FlutterMacOS', :path => File.join(symlink, File.basename(p[:path]))
- end
- }
-
- # Plugin Pods
- plugin_pods = parse_KV_file('../.flutter-plugins')
- plugin_pods.map { |p|
- symlink = File.join(symlink_plugins_dir, p[:name])
- File.symlink(p[:path], symlink)
- if pubspec_supports_macos(File.join(symlink, 'pubspec.yaml'))
- pod p[:name], :path => File.join(symlink, 'macos')
- end
- }
-end
-
-# Prevent Cocoapods from embedding a second Flutter framework and causing an error with the new Xcode build system.
-install! 'cocoapods', :disable_input_output_paths => true
diff --git a/example/pubspec.yaml b/example/pubspec.yaml
index a0fc7dd..69aa1c0 100644
--- a/example/pubspec.yaml
+++ b/example/pubspec.yaml
@@ -4,7 +4,7 @@ description: Demonstrates how to use the flutter_sodium plugin.
publish_to: 'none'
environment:
- sdk: ">=2.12.0 <3.0.0"
+ sdk: ">=3.0.0"
dependencies:
flutter:
diff --git a/ios/.gitignore b/ios/.gitignore
index aa479fd..034771f 100644
--- a/ios/.gitignore
+++ b/ios/.gitignore
@@ -34,4 +34,5 @@ Icon?
.tags*
/Flutter/Generated.xcconfig
-/Flutter/flutter_export_environment.sh
\ No newline at end of file
+/Flutter/ephemeral/
+/Flutter/flutter_export_environment.sh
diff --git a/ios/flutter_sodium.podspec b/ios/flutter_sodium.podspec
index 2da7c01..562d6c6 100644
--- a/ios/flutter_sodium.podspec
+++ b/ios/flutter_sodium.podspec
@@ -1,26 +1,38 @@
#
# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html.
-# Run `pod lib lint flutter_sodium.podspec' to validate before publishing.
+# Run `pod lib lint flutter_sodium.podspec` to validate before publishing.
#
Pod::Spec.new do |s|
s.name = 'flutter_sodium'
s.version = '0.0.1'
- s.summary = 'A new flutter plugin project.'
+ s.summary = 'A new Flutter plugin project.'
s.description = <<-DESC
-A new flutter plugin project.
+A new Flutter plugin project.
DESC
s.homepage = 'http://example.com'
s.license = { :file => '../LICENSE' }
s.author = { 'Your Company' => 'email@example.com' }
s.source = { :path => '.' }
- s.public_header_files = 'Classes**/*.h'
s.source_files = 'Classes/**/*'
- s.vendored_libraries = "**/*.a"
s.dependency 'Flutter'
- s.platform = :ios, '8.0'
+ s.platform = :ios, '14.0'
+ s.preserve_paths = 'prebuilt/*'
- # Flutter.framework does not contain a i386 slice. Only x86_64 simulators are supported.
- s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'VALID_ARCHS[sdk=iphonesimulator*]' => 'x86_64' }
+ # Flutter.framework does not contain a i386 slice.
+ s.pod_target_xcconfig = {
+ 'DEFINES_MODULE' => 'YES',
+ 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386'
+ }
s.swift_version = '5.0'
- s.xcconfig = { 'OTHER_LDFLAGS' => '-force_load "${PODS_ROOT}/../.symlinks/plugins/flutter_sodium/ios/libsodium.a"'}
+ s.xcconfig = {
+ 'LIBSODIUM_ARCHIVE' => '${PODS_ROOT}/../.symlinks/plugins/flutter_sodium/ios/prebuilt/libsodium-device.a',
+ 'LIBSODIUM_ARCHIVE[sdk=iphonesimulator*]' => '${PODS_ROOT}/../.symlinks/plugins/flutter_sodium/ios/prebuilt/libsodium-simulator.a',
+ 'OTHER_LDFLAGS' => '-force_load "${LIBSODIUM_ARCHIVE}"'
+ }
+
+ # If your plugin requires a privacy manifest, for example if it uses any
+ # required reason APIs, update the PrivacyInfo.xcprivacy file to describe your
+ # plugin's privacy impact, and then uncomment this line. For more information,
+ # see https://developer.apple.com/documentation/bundleresources/privacy_manifest_files
+ # s.resource_bundles = {'flutter_sodium_privacy' => ['Resources/PrivacyInfo.xcprivacy']}
end
diff --git a/ios/libsodium.a b/ios/libsodium.a
deleted file mode 100644
index 6e6b289..0000000
Binary files a/ios/libsodium.a and /dev/null differ
diff --git a/ios/prebuilt/libsodium-build-info.json b/ios/prebuilt/libsodium-build-info.json
new file mode 100644
index 0000000..0d400ec
--- /dev/null
+++ b/ios/prebuilt/libsodium-build-info.json
@@ -0,0 +1,20 @@
+{
+ "libsodium_version": "1.0.21",
+ "source_url": "https://download.libsodium.org/libsodium/releases/libsodium-1.0.21.tar.gz",
+ "source_sha256": "9e4285c7a419e82dedb0be63a72eea357d6943bc3e28e6735bf600dd4883feaf",
+ "xcode_version": "26.4",
+ "xcode_build_version": "17E192",
+ "iphoneos_sdk_version": "26.4",
+ "iphonesimulator_sdk_version": "26.4",
+ "min_ios_version": "14.0",
+ "build_variant": "full",
+ "upstream_dist_build_script": "dist-build/apple-xcframework.sh",
+ "upstream_functions_used": ["build_ios", "build_ios_simulator"],
+ "upstream_overrides": ["--disable-shared", "--enable-static"],
+ "device_archive": "libsodium-device.a",
+ "device_sha256": "42ae91bc6cb2bfcedd2751fc0bd62395f9e145e353d9a6938fc0828d4a56fd3d",
+ "device_archs": ["arm64"],
+ "simulator_archive": "libsodium-simulator.a",
+ "simulator_sha256": "86708a1426a674e4d5f190f90ea621276ccde992d854b6f91bc65cbe7f7bbfd8",
+ "simulator_archs": ["arm64", "x86_64"]
+}
diff --git a/ios/prebuilt/libsodium-device.a b/ios/prebuilt/libsodium-device.a
new file mode 100644
index 0000000..ae0d5cf
Binary files /dev/null and b/ios/prebuilt/libsodium-device.a differ
diff --git a/ios/prebuilt/libsodium-simulator.a b/ios/prebuilt/libsodium-simulator.a
new file mode 100644
index 0000000..233a858
Binary files /dev/null and b/ios/prebuilt/libsodium-simulator.a differ
diff --git a/pubspec.yaml b/pubspec.yaml
index af5f447..a14f742 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -4,13 +4,13 @@ version: 0.2.0
homepage: https://github.com/firstfloorsoftware/flutter_sodium
environment:
- sdk: ">=2.12.0 <3.0.0"
+ sdk: ">=3.0.0"
flutter: ">=1.12.0"
dependencies:
flutter:
sdk: flutter
- ffi: ^1.0.0
+ ffi: ^2.1.4
dev_dependencies:
flutter_test:
@@ -23,4 +23,4 @@ flutter:
package: com.firstfloorsoftware.flutter_sodium
pluginClass: FlutterSodiumPlugin
ios:
- pluginClass: FlutterSodiumPlugin
\ No newline at end of file
+ pluginClass: FlutterSodiumPlugin
diff --git a/scripts/build-libsodium-android.sh b/scripts/build-libsodium-android.sh
new file mode 100755
index 0000000..a1fbbc5
--- /dev/null
+++ b/scripts/build-libsodium-android.sh
@@ -0,0 +1,338 @@
+#!/usr/bin/env bash
+
+set -euo pipefail
+
+# Use the immutable point release tarball here. Stable tarballs are intentionally
+# mutable, which is useful for app build hooks but not ideal for checked-in
+# artifacts that we want to regenerate deterministically.
+#
+# NDK r28c only provides Android 21+ sysroots for the ABIs we ship here, so the
+# rebuilt shared libraries all target API 21 even for 32-bit ABIs.
+LIBSODIUM_VERSION="${LIBSODIUM_VERSION:-1.0.21}"
+LIBSODIUM_SHA256="${LIBSODIUM_SHA256:-9e4285c7a419e82dedb0be63a72eea357d6943bc3e28e6735bf600dd4883feaf}"
+LIBSODIUM_URL="${LIBSODIUM_URL:-https://download.libsodium.org/libsodium/releases/libsodium-${LIBSODIUM_VERSION}.tar.gz}"
+ANDROID_NDK_VERSION="${ANDROID_NDK_VERSION:-28.2.13676358}"
+PAGE_ALIGNMENT_BYTES="16384"
+
+ROOT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd)"
+BUILD_ROOT="${BUILD_ROOT:-${ROOT_DIR}/build/android-libsodium}"
+DOWNLOAD_DIR="${BUILD_ROOT}/downloads"
+WORK_ROOT="${BUILD_ROOT}/work"
+PREBUILT_DIR="${ROOT_DIR}/android/prebuilt"
+JNI_LIBS_DIR="${ROOT_DIR}/android/src/main/jniLibs"
+
+ARCHIVE_NAME="libsodium-${LIBSODIUM_VERSION}.tar.gz"
+ARCHIVE_PATH="${LIBSODIUM_ARCHIVE_PATH:-${DOWNLOAD_DIR}/${ARCHIVE_NAME}}"
+BUILD_INFO_OUTPUT="${PREBUILT_DIR}/libsodium-build-info.json"
+
+ANDROID_HOME=""
+NDK_ROOT=""
+NDK_RELEASE_NAME=""
+TOOLCHAIN_ROOT=""
+TOOLCHAIN_BIN=""
+LLVM_AR=""
+LLVM_NM=""
+LLVM_OBJDUMP=""
+LLVM_RANLIB=""
+LLVM_STRIP=""
+
+ARMV7_OUTPUT="${JNI_LIBS_DIR}/armeabi-v7a/libsodium.so"
+ARM64_OUTPUT="${JNI_LIBS_DIR}/arm64-v8a/libsodium.so"
+X86_OUTPUT="${JNI_LIBS_DIR}/x86/libsodium.so"
+X86_64_OUTPUT="${JNI_LIBS_DIR}/x86_64/libsodium.so"
+
+log() {
+ printf '==> %s\n' "$*"
+}
+
+ensure_commands() {
+ local command
+ for command in curl shasum tar make find awk sed strings grep; do
+ if ! command -v "${command}" >/dev/null 2>&1; then
+ printf 'Missing required command: %s\n' "${command}" >&2
+ exit 1
+ fi
+ done
+}
+
+read_source_property() {
+ local file="$1"
+ local key="$2"
+ awk -F ' = ' -v wanted="${key}" '$1 == wanted { print $2; exit }' "${file}"
+}
+
+detect_android_home() {
+ local candidate
+ for candidate in \
+ "${ANDROID_HOME:-}" \
+ "${ANDROID_SDK_ROOT:-}" \
+ "${HOME}/Library/Android/sdk" \
+ "/opt/homebrew/share/android-commandlinetools"
+ do
+ if [[ -n "${candidate}" && -d "${candidate}/ndk" ]]; then
+ printf '%s\n' "${candidate}"
+ return 0
+ fi
+ done
+
+ printf 'Unable to locate Android SDK root. Set ANDROID_HOME or ANDROID_SDK_ROOT.\n' >&2
+ exit 1
+}
+
+resolve_ndk_root() {
+ local sdk_root="$1"
+
+ if [[ -n "${ANDROID_NDK_HOME:-}" && -d "${ANDROID_NDK_HOME}" ]]; then
+ printf '%s\n' "${ANDROID_NDK_HOME}"
+ return 0
+ fi
+
+ if [[ -n "${ANDROID_NDK_ROOT:-}" && -d "${ANDROID_NDK_ROOT}" ]]; then
+ printf '%s\n' "${ANDROID_NDK_ROOT}"
+ return 0
+ fi
+
+ if [[ -d "${sdk_root}/ndk/${ANDROID_NDK_VERSION}" ]]; then
+ printf '%s\n' "${sdk_root}/ndk/${ANDROID_NDK_VERSION}"
+ return 0
+ fi
+
+ printf 'Unable to locate Android NDK %s under %s. Set ANDROID_NDK_HOME/ANDROID_NDK_ROOT or install that version.\n' \
+ "${ANDROID_NDK_VERSION}" "${sdk_root}" >&2
+ exit 1
+}
+
+resolve_toolchain_root() {
+ local ndk_root="$1"
+ local toolchain_root
+
+ toolchain_root="$(find "${ndk_root}/toolchains/llvm/prebuilt" -mindepth 1 -maxdepth 1 -type d | sort | head -n 1)"
+ if [[ -z "${toolchain_root}" ]]; then
+ printf 'Unable to locate LLVM toolchain under %s\n' "${ndk_root}" >&2
+ exit 1
+ fi
+
+ printf '%s\n' "${toolchain_root}"
+}
+
+download_archive() {
+ local fallback_archive="${ROOT_DIR}/build/ios-libsodium/downloads/${ARCHIVE_NAME}"
+
+ mkdir -p "${DOWNLOAD_DIR}"
+
+ if [[ ! -f "${ARCHIVE_PATH}" && -f "${fallback_archive}" ]]; then
+ log "Reusing existing archive at ${fallback_archive}"
+ cp "${fallback_archive}" "${ARCHIVE_PATH}"
+ fi
+
+ if [[ ! -f "${ARCHIVE_PATH}" ]]; then
+ log "Downloading ${LIBSODIUM_URL}"
+ curl --fail --location --output "${ARCHIVE_PATH}" "${LIBSODIUM_URL}"
+ else
+ log "Using existing archive at ${ARCHIVE_PATH}"
+ fi
+
+ local actual_sha
+ actual_sha="$(shasum -a 256 "${ARCHIVE_PATH}" | awk '{print $1}')"
+ if [[ "${actual_sha}" != "${LIBSODIUM_SHA256}" ]]; then
+ printf 'Checksum mismatch for %s\nExpected: %s\nActual: %s\n' \
+ "${ARCHIVE_PATH}" "${LIBSODIUM_SHA256}" "${actual_sha}" >&2
+ exit 1
+ fi
+}
+
+extract_source() {
+ local destination="$1"
+
+ rm -rf "${destination}"
+ mkdir -p "${destination}"
+ tar -xzf "${ARCHIVE_PATH}" -C "${destination}"
+ printf '%s/libsodium-%s\n' "${destination}" "${LIBSODIUM_VERSION}"
+}
+
+build_target() {
+ local name="$1"
+ local abi="$2"
+ local dist_build_script="$3"
+ local built_library_path="$4"
+ local source_root="$5"
+
+ local source_dir
+ source_dir="$(extract_source "${source_root}")"
+
+ if [[ ! -x "${source_dir}/${dist_build_script}" ]]; then
+ printf 'Unable to locate upstream build script: %s\n' "${source_dir}/${dist_build_script}" >&2
+ exit 1
+ fi
+
+ log "Building ${name} via ${dist_build_script}"
+ pushd "${source_dir}" >/dev/null
+ # Pin binutils to the NDK toolchain so libtool doesn't fall back to macOS host tools.
+ env \
+ ANDROID_NDK_HOME="${NDK_ROOT}" \
+ AR="${LLVM_AR}" \
+ NDK_PLATFORM="android-21" \
+ LIBSODIUM_FULL_BUILD="Y" \
+ NM="${LLVM_NM}" \
+ OBJDUMP="${LLVM_OBJDUMP}" \
+ RANLIB="${LLVM_RANLIB}" \
+ STRIP="${LLVM_STRIP}" \
+ "${source_dir}/${dist_build_script}"
+ popd >/dev/null
+
+ if [[ ! -f "${source_dir}/${built_library_path}" ]]; then
+ printf 'Unable to locate built library: %s\n' "${source_dir}/${built_library_path}" >&2
+ exit 1
+ fi
+
+ mkdir -p "${JNI_LIBS_DIR}/${abi}"
+ cp "${source_dir}/${built_library_path}" "${JNI_LIBS_DIR}/${abi}/libsodium.so"
+}
+
+verify_load_alignment() {
+ local library_path="$1"
+
+ if ! "${LLVM_OBJDUMP}" -p "${library_path}" | awk '/LOAD/{count++; if ($0 !~ /align 2\*\*14/) bad=1} END{exit !(count > 0 && bad != 1)}'; then
+ printf 'Expected all LOAD segments in %s to use 16 KB alignment.\n' "${library_path}" >&2
+ exit 1
+ fi
+}
+
+verify_version_string() {
+ local library_path="$1"
+
+ if ! strings "${library_path}" | grep -Fx -- "${LIBSODIUM_VERSION}" >/dev/null 2>&1; then
+ printf 'Unable to find libsodium version string %s in %s\n' "${LIBSODIUM_VERSION}" "${library_path}" >&2
+ exit 1
+ fi
+}
+
+sha256_file() {
+ shasum -a 256 "$1" | awk '{print $1}'
+}
+
+write_build_info() {
+ local armv7_sha arm64_sha x86_sha x86_64_sha
+
+ armv7_sha="$(sha256_file "${ARMV7_OUTPUT}")"
+ arm64_sha="$(sha256_file "${ARM64_OUTPUT}")"
+ x86_sha="$(sha256_file "${X86_OUTPUT}")"
+ x86_64_sha="$(sha256_file "${X86_64_OUTPUT}")"
+
+ cat > "${BUILD_INFO_OUTPUT}" <&2
+ exit 1
+ fi
+
+ download_archive
+ mkdir -p "${WORK_ROOT}" "${PREBUILT_DIR}"
+
+ build_target \
+ "Android armeabi-v7a" \
+ "armeabi-v7a" \
+ "dist-build/android-armv7-a.sh" \
+ "libsodium-android-armv7-a/lib/libsodium.so" \
+ "${WORK_ROOT}/armeabi-v7a/src"
+
+ build_target \
+ "Android arm64-v8a" \
+ "arm64-v8a" \
+ "dist-build/android-armv8-a.sh" \
+ "libsodium-android-armv8-a+crypto/lib/libsodium.so" \
+ "${WORK_ROOT}/arm64-v8a/src"
+
+ build_target \
+ "Android x86" \
+ "x86" \
+ "dist-build/android-x86.sh" \
+ "libsodium-android-i686/lib/libsodium.so" \
+ "${WORK_ROOT}/x86/src"
+
+ build_target \
+ "Android x86_64" \
+ "x86_64" \
+ "dist-build/android-x86_64.sh" \
+ "libsodium-android-westmere/lib/libsodium.so" \
+ "${WORK_ROOT}/x86_64/src"
+
+ verify_load_alignment "${ARMV7_OUTPUT}"
+ verify_load_alignment "${ARM64_OUTPUT}"
+ verify_load_alignment "${X86_OUTPUT}"
+ verify_load_alignment "${X86_64_OUTPUT}"
+
+ verify_version_string "${ARMV7_OUTPUT}"
+ verify_version_string "${ARM64_OUTPUT}"
+ verify_version_string "${X86_OUTPUT}"
+ verify_version_string "${X86_64_OUTPUT}"
+
+ write_build_info
+
+ log "Created $(basename "${ARMV7_OUTPUT}") for armeabi-v7a"
+ log "Created $(basename "${ARM64_OUTPUT}") for arm64-v8a"
+ log "Created $(basename "${X86_OUTPUT}") for x86"
+ log "Created $(basename "${X86_64_OUTPUT}") for x86_64"
+ log "Wrote $(basename "${BUILD_INFO_OUTPUT}")"
+}
+
+main "$@"
diff --git a/scripts/build-libsodium-ios.sh b/scripts/build-libsodium-ios.sh
new file mode 100755
index 0000000..6b353f3
--- /dev/null
+++ b/scripts/build-libsodium-ios.sh
@@ -0,0 +1,192 @@
+#!/usr/bin/env bash
+
+set -euo pipefail
+
+# Use the immutable point release tarball here. Stable tarballs are intentionally
+# mutable, which is useful for app build hooks but not ideal for checked-in
+# artifacts that we want to regenerate deterministically.
+LIBSODIUM_VERSION="${LIBSODIUM_VERSION:-1.0.21}"
+LIBSODIUM_SHA256="${LIBSODIUM_SHA256:-9e4285c7a419e82dedb0be63a72eea357d6943bc3e28e6735bf600dd4883feaf}"
+LIBSODIUM_URL="${LIBSODIUM_URL:-https://download.libsodium.org/libsodium/releases/libsodium-${LIBSODIUM_VERSION}.tar.gz}"
+MIN_IOS_VERSION="${MIN_IOS_VERSION:-14.0}"
+
+ROOT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd)"
+BUILD_ROOT="${BUILD_ROOT:-${ROOT_DIR}/build/ios-libsodium}"
+DOWNLOAD_DIR="${BUILD_ROOT}/downloads"
+WORK_ROOT="${BUILD_ROOT}/work"
+PREBUILT_DIR="${ROOT_DIR}/ios/prebuilt"
+
+ARCHIVE_NAME="libsodium-${LIBSODIUM_VERSION}.tar.gz"
+ARCHIVE_PATH="${LIBSODIUM_ARCHIVE_PATH:-${DOWNLOAD_DIR}/${ARCHIVE_NAME}}"
+
+DEVICE_OUTPUT="${PREBUILT_DIR}/libsodium-device.a"
+SIMULATOR_OUTPUT="${PREBUILT_DIR}/libsodium-simulator.a"
+BUILD_INFO_OUTPUT="${PREBUILT_DIR}/libsodium-build-info.json"
+
+XCODE_VERSION=""
+XCODE_BUILD_VERSION=""
+IPHONEOS_SDK_VERSION=""
+IPHONESIMULATOR_SDK_VERSION=""
+
+log() {
+ printf '==> %s\n' "$*"
+}
+
+ensure_commands() {
+ local command
+ for command in curl grep shasum tar make xcodebuild xcrun lipo sed; do
+ if ! command -v "${command}" >/dev/null 2>&1; then
+ printf 'Missing required command: %s\n' "${command}" >&2
+ exit 1
+ fi
+ done
+}
+
+download_archive() {
+ mkdir -p "${DOWNLOAD_DIR}"
+
+ if [[ ! -f "${ARCHIVE_PATH}" ]]; then
+ log "Downloading ${LIBSODIUM_URL}"
+ curl --fail --location --output "${ARCHIVE_PATH}" "${LIBSODIUM_URL}"
+ else
+ log "Using existing archive at ${ARCHIVE_PATH}"
+ fi
+
+ local actual_sha
+ actual_sha="$(shasum -a 256 "${ARCHIVE_PATH}" | awk '{print $1}')"
+ if [[ "${actual_sha}" != "${LIBSODIUM_SHA256}" ]]; then
+ printf 'Checksum mismatch for %s\nExpected: %s\nActual: %s\n' \
+ "${ARCHIVE_PATH}" "${LIBSODIUM_SHA256}" "${actual_sha}" >&2
+ exit 1
+ fi
+}
+
+extract_source() {
+ local destination="$1"
+
+ rm -rf "${destination}"
+ mkdir -p "${destination}"
+ tar -xzf "${ARCHIVE_PATH}" -C "${destination}"
+ printf '%s/libsodium-%s\n' "${destination}" "${LIBSODIUM_VERSION}"
+}
+
+sha256_file() {
+ shasum -a 256 "$1" | awk '{print $1}'
+}
+
+detect_xcode_metadata() {
+ XCODE_VERSION="$(xcodebuild -version | awk 'NR == 1 { print $2 }')"
+ XCODE_BUILD_VERSION="$(xcodebuild -version | awk 'NR == 2 { print $3 }')"
+ IPHONEOS_SDK_VERSION="$(xcrun --sdk iphoneos --show-sdk-version)"
+ IPHONESIMULATOR_SDK_VERSION="$(xcrun --sdk iphonesimulator --show-sdk-version)"
+}
+
+build_archives_from_upstream() {
+ local source_root="$1"
+
+ local source_dir helper_script split_marker split_marker_count
+ source_dir="$(extract_source "${source_root}")"
+ helper_script="${WORK_ROOT}/apple-xcframework-functions.sh"
+ split_marker='mkdir -p "${PREFIX}/tmp"'
+
+ if [[ ! -f "${source_dir}/dist-build/apple-xcframework.sh" ]]; then
+ printf 'Unable to locate upstream build script: %s\n' "${source_dir}/dist-build/apple-xcframework.sh" >&2
+ exit 1
+ fi
+
+ split_marker_count="$(grep -Fxc -- "${split_marker}" "${source_dir}/dist-build/apple-xcframework.sh" || true)"
+ if [[ "${split_marker_count}" != "1" ]]; then
+ printf 'Expected exactly one upstream split marker in %s, found %s\n' \
+ "${source_dir}/dist-build/apple-xcframework.sh" "${split_marker_count}" >&2
+ exit 1
+ fi
+
+ sed '/^mkdir -p "${PREFIX}\/tmp"$/,$d; s#\./configure #./configure --disable-shared --enable-static #g' \
+ "${source_dir}/dist-build/apple-xcframework.sh" > "${helper_script}"
+ if [[ ! -s "${helper_script}" ]]; then
+ printf 'Unable to extract helper definitions from %s\n' "${source_dir}/dist-build/apple-xcframework.sh" >&2
+ exit 1
+ fi
+
+ log "Building iOS archives via dist-build/apple-xcframework.sh"
+ pushd "${source_dir}" >/dev/null
+ export IOS_VERSION_MIN="${MIN_IOS_VERSION}"
+ export IOS_SIMULATOR_VERSION_MIN="${MIN_IOS_VERSION}"
+ export LIBSODIUM_MINIMAL_BUILD=""
+ export LIBSODIUM_SKIP_SIMULATORS=""
+ source "${helper_script}"
+ if ! declare -F build_ios >/dev/null 2>&1; then
+ printf 'build_ios was not defined after sourcing %s\n' "${helper_script}" >&2
+ exit 1
+ fi
+ if ! declare -F build_ios_simulator >/dev/null 2>&1; then
+ printf 'build_ios_simulator was not defined after sourcing %s\n' "${helper_script}" >&2
+ exit 1
+ fi
+
+ mkdir -p "${PREFIX}/tmp"
+ if ! ( build_ios ) >"${LOG_FILE}" 2>&1; then
+ printf 'Upstream iOS build failed. See %s\n' "${LOG_FILE}" >&2
+ exit 1
+ fi
+ if ! ( build_ios_simulator ) >>"${LOG_FILE}" 2>&1; then
+ printf 'Upstream iOS build failed. See %s\n' "${LOG_FILE}" >&2
+ exit 1
+ fi
+
+ cp "${IOS64_PREFIX}/lib/libsodium.a" "${DEVICE_OUTPUT}"
+ lipo -create \
+ "${IOS_SIMULATOR_ARM64_PREFIX}/lib/libsodium.a" \
+ "${IOS_SIMULATOR_X86_64_PREFIX}/lib/libsodium.a" \
+ -output "${SIMULATOR_OUTPUT}"
+ popd >/dev/null
+
+ xcrun ranlib -D "${DEVICE_OUTPUT}"
+ xcrun ranlib -D "${SIMULATOR_OUTPUT}"
+}
+
+write_build_info() {
+ local device_sha simulator_sha
+ device_sha="$(sha256_file "${DEVICE_OUTPUT}")"
+ simulator_sha="$(sha256_file "${SIMULATOR_OUTPUT}")"
+
+ cat > "${BUILD_INFO_OUTPUT}" <