diff --git a/.github/workflows/build_firebase.yml b/.github/workflows/build_firebase.yml
new file mode 100644
index 0000000..54507a4
--- /dev/null
+++ b/.github/workflows/build_firebase.yml
@@ -0,0 +1,44 @@
+# This workflow will build a Swift project
+# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-swift
+
+name: Build Firebase
+
+on:
+ workflow_dispatch:
+
+jobs:
+ build_firebase:
+ name: Build Firebase
+ runs-on: macos-latest
+
+ steps:
+ - name: Xcode Select Version
+ uses: maxim-lobanov/setup-xcode@v1
+ with:
+ xcode-version: '14.1'
+
+ - name: Checkout Branch
+ uses: actions/checkout@v2
+
+ - name: Install Bundle Dependency
+ run: |
+ bundle install
+
+ - name: Install XcodeGen
+ run: |
+ brew install xcodegen
+
+ - name: Build IPA and Upload to Firebase using Fastlane
+ env:
+ FIREBASE_APP_ID: ${{ vars.FIREBASE_APP_ID }}
+ FIREBASE_TOKEN: ${{ vars.FIREBASE_TOKEN }}
+ MATCH_GIT_BASIC_AUTHORIZATION: ${{ vars.MATCH_GIT_BASIC_AUTHORIZATION }}
+ MATCH_KEYCHAIN: ${{ vars.MATCH_KEYCHAIN }}
+ MATCH_PASSWORD: ${{ vars.MATCH_PASSWORD }}
+ DISCORD_WEBHOOK_URL: ${{ vars.DISCORD_WEBHOOK_URL }}
+ BUILD_NUMBER: ${{ github.run_number }}
+ WORKFLOW_NAME: ${{ github.workflow }}
+ BRANCH_NAME: ${{ github.ref_name }}
+ COMMIT_SHA: ${{ github.sha }}
+ run: |
+ bundle exec fastlane build_firebase
\ No newline at end of file
diff --git a/.github/workflows/build_testflight.yml b/.github/workflows/build_testflight.yml
new file mode 100644
index 0000000..e1a7142
--- /dev/null
+++ b/.github/workflows/build_testflight.yml
@@ -0,0 +1,47 @@
+# This workflow will build a Swift project
+# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-swift
+
+name: Build TestFlight
+
+on:
+ workflow_dispatch:
+
+jobs:
+ build_testflight:
+ name: Build TestFlight
+ runs-on: macos-latest
+
+ steps:
+ - name: Xcode Select Version
+ uses: maxim-lobanov/setup-xcode@v1
+ with:
+ xcode-version: '14.1'
+
+ - name: Checkout Branch
+ uses: actions/checkout@v2
+
+ - name: Install Bundle Dependency
+ run: |
+ bundle install
+
+ - name: Install XcodeGen
+ run: |
+ brew install xcodegen
+
+ - name: Build IPA and Upload to TestFlight using Fastlane
+ env:
+ APP_STORE_CONNECT_API_KEY_IN_HOUSE: ${{ vars.APP_STORE_CONNECT_API_KEY_IN_HOUSE }}
+ APP_STORE_CONNECT_API_KEY_ISSUER_ID: ${{ vars.APP_STORE_CONNECT_API_KEY_ISSUER_ID }}
+ APP_STORE_CONNECT_API_KEY_IS_KEY_CONTENT_BASE64: ${{ vars.APP_STORE_CONNECT_API_KEY_IS_KEY_CONTENT_BASE64 }}
+ APP_STORE_CONNECT_API_KEY_KEY: ${{ vars.APP_STORE_CONNECT_API_KEY_KEY }}
+ APP_STORE_CONNECT_API_KEY_KEY_ID: ${{ vars.APP_STORE_CONNECT_API_KEY_KEY_ID }}
+ MATCH_GIT_BASIC_AUTHORIZATION: ${{ vars.MATCH_GIT_BASIC_AUTHORIZATION }}
+ MATCH_KEYCHAIN: ${{ vars.MATCH_KEYCHAIN }}
+ MATCH_PASSWORD: ${{ vars.MATCH_PASSWORD }}
+ DISCORD_WEBHOOK_URL: ${{ vars.DISCORD_WEBHOOK_URL }}
+ BUILD_NUMBER: ${{ github.run_number }}
+ WORKFLOW_NAME: ${{ github.workflow }}
+ BRANCH_NAME: ${{ github.ref_name }}
+ COMMIT_SHA: ${{ github.sha }}
+ run: |
+ bundle exec fastlane build_testflight
\ No newline at end of file
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..271299b
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,38 @@
+# Contribution Guidelines
+
+We welcome and appreciate contributions to Scandocs! Whether you want to report a bug, propose a new feature, or submit a fix, your help is invaluable.
+
+## How to Contribute
+
+### Reporting Issues
+
+If you encounter any issues or have suggestions for improvement, please [open an issue](https://github.com/rickirby/scandocs/issues/new) on this repository. Make sure to include:
+
+- A clear and descriptive title.
+- Details about the problem or enhancement you are suggesting.
+- Steps to reproduce (if applicable).
+- Screenshots or code snippets (if relevant).
+
+### Pull Requests
+
+We encourage you to contribute directly by submitting pull requests.
+
+1. Fork the repository to your GitHub account.
+2. Clone your fork to your local machine: `git clone https://github.com/your-username/scandocs.git`
+3. Create a new branch for your changes: `git checkout -b feature/your-feature` or `git checkout -b bugfix/your-bug-fix`
+4. Make your changes and commit: `git commit -m "Description of your changes"`
+5. Push the branch to your fork: `git push origin feature/your-feature`
+6. Open a pull request (PR) against the `development` branch on this repository.
+
+Please ensure that your pull request:
+
+- Includes a clear title and description of the changes.
+- References the related issue (if applicable).
+- Follows the coding style and conventions used in the project.
+- Has a well-documented code and, if applicable, includes tests.
+
+## License
+
+By contributing to Scandocs, you agree that your contributions will be licensed under the [MIT License](LICENSE).
+
+Thank you for contributing to Scandocs!
diff --git a/Configuration/AdHoc.xcconfig b/Configuration/AdHoc.xcconfig
index 0f24b42..9cc3c7b 100644
--- a/Configuration/AdHoc.xcconfig
+++ b/Configuration/AdHoc.xcconfig
@@ -10,13 +10,15 @@
APP_NAME = Scandocs (AdHoc)
BUNDLE_ID = com.scandocs.ios
+APP_PROVISIONING_PROFILE = match AdHoc com.scandocs.ios
+CODE_SIGN_IDENTITY = Apple Distribution: Ricki Bin Yamin (6NMANHT3A2)
VALIDATE_PRODUCT = NO
DEBUG_INFORMATION_FORMAT = dwarf-with-dsym
TARGETED_DEVICE_FAMILY = 1
IPHONEOS_DEPLOYMENT_TARGET = 15.0
BUILD_NUMBER = 1
VERSION_NAME = 1.0.0
-CODE_SIGN_STYLE = Automatic
+CODE_SIGN_STYLE = Manual
DEVELOPMENT_TEAM = 6NMANHT3A2
SWIFT_OPTIMIZATION_LEVEL = -O
SWIFT_VERSION = 5.0
diff --git a/Configuration/Development.xcconfig b/Configuration/Development.xcconfig
index 913d690..4e086a0 100644
--- a/Configuration/Development.xcconfig
+++ b/Configuration/Development.xcconfig
@@ -10,13 +10,15 @@
APP_NAME = Scandocs (Development)
BUNDLE_ID = com.scandocs.ios
+APP_PROVISIONING_PROFILE = match Development com.scandocs.ios
+CODE_SIGN_IDENTITY = Apple Development: Ricki Bin Yamin (BWBZZ27H86)
VALIDATE_PRODUCT = NO
DEBUG_INFORMATION_FORMAT = dwarf
TARGETED_DEVICE_FAMILY = 1
IPHONEOS_DEPLOYMENT_TARGET = 15.0
BUILD_NUMBER = 1
VERSION_NAME = 1.0.0
-CODE_SIGN_STYLE = Automatic
+CODE_SIGN_STYLE = Manual
DEVELOPMENT_TEAM = 6NMANHT3A2
SWIFT_OPTIMIZATION_LEVEL = -Onone
SWIFT_VERSION = 5.0
diff --git a/Configuration/Release.xcconfig b/Configuration/Release.xcconfig
index fddfc74..dab673d 100644
--- a/Configuration/Release.xcconfig
+++ b/Configuration/Release.xcconfig
@@ -10,13 +10,15 @@
APP_NAME = Scandocs
BUNDLE_ID = com.scandocs.ios
+APP_PROVISIONING_PROFILE = match AppStore com.scandocs.ios
+CODE_SIGN_IDENTITY = Apple Distribution: Ricki Bin Yamin (6NMANHT3A2)
VALIDATE_PRODUCT = YES
DEBUG_INFORMATION_FORMAT = dwarf-with-dsym
TARGETED_DEVICE_FAMILY = 1
IPHONEOS_DEPLOYMENT_TARGET = 15.0
BUILD_NUMBER = 1
VERSION_NAME = 1.0.0
-CODE_SIGN_STYLE = Automatic
+CODE_SIGN_STYLE = Manual
DEVELOPMENT_TEAM = 6NMANHT3A2
SWIFT_OPTIMIZATION_LEVEL = -O
SWIFT_VERSION = 5.0
diff --git a/Fastlane/Appfile b/Fastlane/Appfile
new file mode 100644
index 0000000..6cac0de
--- /dev/null
+++ b/Fastlane/Appfile
@@ -0,0 +1,6 @@
+app_identifier("com.scandocs.ios") # The bundle identifier of your app
+apple_id("ricki.bin.yamin@gmail.com") # Your Apple Developer Portal username
+
+
+# For more information about the Appfile, see:
+# https://docs.fastlane.tools/advanced/#appfile
\ No newline at end of file
diff --git a/Fastlane/Fastfile b/Fastlane/Fastfile
new file mode 100644
index 0000000..c4467a9
--- /dev/null
+++ b/Fastlane/Fastfile
@@ -0,0 +1,199 @@
+# This file contains the fastlane.tools configuration
+# You can find the documentation at https://docs.fastlane.tools
+#
+# For a list of all available actions, check out
+#
+# https://docs.fastlane.tools/actions
+#
+# For a list of all available plugins, check out
+#
+# https://docs.fastlane.tools/plugins/available-plugins
+#
+
+# Uncomment the line if you want fastlane to automatically update itself
+# update_fastlane
+
+default_platform(:ios)
+
+platform :ios do
+
+ desc "Setup CI Keychain to prevent stack due to default keychain locked"
+ lane :setupCIKeychain do
+ create_keychain(
+ name: ENV["MATCH_KEYCHAIN"],
+ password: ENV["MATCH_PASSWORD"],
+ default_keychain: true,
+ unlock: true,
+ timeout: 3600,
+ add_to_search_list: true,
+ verbose: true
+ )
+ end
+
+ desc "Preparing Certificate and Provisioning Profiles on New Device Setup"
+ lane :prepare do
+ match(
+ app_identifier: "com.scandocs.ios",
+ type: "development",
+ readonly: true
+ )
+
+ match(
+ app_identifier: "com.scandocs.ios",
+ type: "adhoc",
+ readonly: true
+ )
+
+ match(
+ app_identifier: "com.scandocs.ios",
+ type: "appstore",
+ readonly: true
+ )
+ end
+
+ desc "Build TestFlight"
+ lane :build_testflight do
+ build_number = ENV["BUILD_NUMBER"]
+
+ UI.message("Change build number to #{build_number}")
+ sh("cd .. && ./Tooling/change_build_number.sh #{build_number}")
+
+ UI.message("Setup Project")
+ sh("cd .. && ./setup.sh")
+
+ UI.message("Setup Custom Keychain")
+ setupCIKeychain
+
+ UI.message("Prepare Provisioning Profiles")
+ match(
+ keychain_name: ENV["MATCH_KEYCHAIN"] || "login.keychain",
+ keychain_password: ENV["MATCH_PASSWORD"] || "",
+ app_identifier: "com.scandocs.ios",
+ type: "appstore",
+ readonly: true
+ )
+
+ UI.message("Build IPA")
+ build_app(
+ workspace: "Scandocs.xcworkspace",
+ scheme: "Scandocs",
+ configuration: "Release",
+ export_method: "app-store",
+ export_options: {
+ iCloudContainerEnvironment: "Production"
+ }
+ )
+
+ app_store_connect_api_key
+
+ UI.message("Upload to TestFlight")
+ upload_to_testflight(
+ skip_waiting_for_build_processing: true,
+ skip_submission: true
+ )
+
+ notifySuccessBuild(
+ destination: "TestFlight"
+ )
+ end
+
+ desc "Build Firebase"
+ lane :build_firebase do
+ build_number = ENV["BUILD_NUMBER"]
+
+ UI.message("Change build number to #{build_number}")
+ sh("cd .. && ./Tooling/change_build_number.sh #{build_number}")
+
+ UI.message("Setup Project")
+ sh("cd .. && ./setup.sh")
+
+ UI.message("Setup Custom Keychain")
+ setupCIKeychain
+
+ UI.message("Prepare Provisioning Profiles")
+ match(
+ keychain_name: ENV["MATCH_KEYCHAIN"] || "login.keychain",
+ keychain_password: ENV["MATCH_PASSWORD"] || "",
+ app_identifier: "com.scandocs.ios",
+ type: "adhoc",
+ readonly: true
+ )
+
+ UI.message("Build IPA")
+ build_app(
+ workspace: "Scandocs.xcworkspace",
+ scheme: "Scandocs",
+ configuration: "AdHoc",
+ export_method: "ad-hoc",
+ export_options: {
+ iCloudContainerEnvironment: "Development"
+ }
+ )
+
+ UI.message("Upload to Firebase")
+ firebase_app_distribution(
+ app: ENV["FIREBASE_APP_ID"],
+ release_notes: ENV["BRANCH_NAME"],
+ groups: "self-tester",
+ firebase_cli_token: ENV["FIREBASE_TOKEN"]
+ )
+
+ notifySuccessBuild(
+ destination: "Firebase"
+ )
+ end
+
+ desc "Send success message to Discord"
+ lane :notifySuccessBuild do |options|
+ destination = options[:destination]
+
+ discord_notifier(
+ webhook_url: ENV["DISCORD_WEBHOOK_URL"],
+ success: true,
+ title: "#{destination}",
+ description: "Apps has been successfully uploaded to #{destination} 🎉",
+ fields:[
+ {
+ name: "Build Number",
+ value: ENV["BUILD_NUMBER"] || "-"
+ },
+ {
+ name: "Git Branch",
+ value: ENV["BRANCH_NAME"] || "-"
+ },
+ {
+ name: "Git Commit",
+ value: ENV["COMMIT_SHA"] || "-"
+ }
+ ]
+ )
+ end
+
+ desc "Send error message to Discord"
+ error do |lane, exception|
+ discord_notifier(
+ webhook_url: ENV["DISCORD_WEBHOOK_URL"],
+ success: false,
+ title: "Error 💥",
+ description: "Encountered error from Workflow `#{ENV["GITHUB_WORKFLOW"]}` on lane `#{lane}`.",
+ fields:[
+ {
+ name: "Build Number",
+ value: ENV["BUILD_NUMBER"] || "local build"
+ },
+ {
+ name: "Git Branch",
+ value: ENV["BRANCH_NAME"] || "-"
+ },
+ {
+ name: "Git Commit",
+ value: ENV["COMMIT_SHA"] || "-"
+ },
+ {
+ name: "Error Message",
+ value: exception
+ }
+ ]
+ )
+ end
+end
diff --git a/Fastlane/Matchfile b/Fastlane/Matchfile
new file mode 100644
index 0000000..3442aab
--- /dev/null
+++ b/Fastlane/Matchfile
@@ -0,0 +1,13 @@
+git_url("https://github.com/rickirby/scandocs_certificate.git")
+
+storage_mode("git")
+
+type("appstore") # The default type, can be: appstore, adhoc, enterprise or development
+
+app_identifier("com.scandocs.ios")
+username("ricki.bin.yamin@gmail.com") # Your Apple Developer Portal username
+
+# For all available options run `fastlane match --help`
+# Remove the # in the beginning of the line to enable the other options
+
+# The docs are available on https://docs.fastlane.tools/actions/match
diff --git a/Fastlane/Pluginfile b/Fastlane/Pluginfile
new file mode 100644
index 0000000..7de1c51
--- /dev/null
+++ b/Fastlane/Pluginfile
@@ -0,0 +1,6 @@
+# Autogenerated by fastlane
+#
+# Ensure this file is checked in to source control!
+
+gem 'fastlane-plugin-discord_notifier'
+gem 'fastlane-plugin-firebase_app_distribution'
\ No newline at end of file
diff --git a/Gemfile b/Gemfile
new file mode 100644
index 0000000..65c717c
--- /dev/null
+++ b/Gemfile
@@ -0,0 +1,6 @@
+source "https://rubygems.org"
+
+gem "fastlane"
+gem "cocoapods"
+plugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile')
+eval_gemfile(plugins_path) if File.exist?(plugins_path)
\ No newline at end of file
diff --git a/Gemfile.lock b/Gemfile.lock
new file mode 100644
index 0000000..d15526d
--- /dev/null
+++ b/Gemfile.lock
@@ -0,0 +1,317 @@
+GEM
+ remote: https://rubygems.org/
+ specs:
+ CFPropertyList (3.0.6)
+ rexml
+ activesupport (5.2.8.1)
+ concurrent-ruby (~> 1.0, >= 1.0.2)
+ i18n (>= 0.7, < 2)
+ minitest (~> 5.1)
+ tzinfo (~> 1.1)
+ addressable (2.8.5)
+ public_suffix (>= 2.0.2, < 6.0)
+ algoliasearch (1.27.5)
+ httpclient (~> 2.8, >= 2.8.3)
+ json (>= 1.5.1)
+ artifactory (3.0.15)
+ atomos (0.1.3)
+ aws-eventstream (1.2.0)
+ aws-partitions (1.845.0)
+ aws-sdk-core (3.186.0)
+ aws-eventstream (~> 1, >= 1.0.2)
+ aws-partitions (~> 1, >= 1.651.0)
+ aws-sigv4 (~> 1.5)
+ jmespath (~> 1, >= 1.6.1)
+ aws-sdk-kms (1.72.0)
+ aws-sdk-core (~> 3, >= 3.184.0)
+ aws-sigv4 (~> 1.1)
+ aws-sdk-s3 (1.136.0)
+ aws-sdk-core (~> 3, >= 3.181.0)
+ aws-sdk-kms (~> 1)
+ aws-sigv4 (~> 1.6)
+ aws-sigv4 (1.6.1)
+ aws-eventstream (~> 1, >= 1.0.2)
+ babosa (1.0.4)
+ claide (1.1.0)
+ cocoapods (1.10.2)
+ addressable (~> 2.6)
+ claide (>= 1.0.2, < 2.0)
+ cocoapods-core (= 1.10.2)
+ cocoapods-deintegrate (>= 1.0.3, < 2.0)
+ cocoapods-downloader (>= 1.4.0, < 2.0)
+ cocoapods-plugins (>= 1.0.0, < 2.0)
+ cocoapods-search (>= 1.0.0, < 2.0)
+ cocoapods-trunk (>= 1.4.0, < 2.0)
+ cocoapods-try (>= 1.1.0, < 2.0)
+ colored2 (~> 3.1)
+ escape (~> 0.0.4)
+ fourflusher (>= 2.3.0, < 3.0)
+ gh_inspector (~> 1.0)
+ molinillo (~> 0.6.6)
+ nap (~> 1.0)
+ ruby-macho (~> 1.4)
+ xcodeproj (>= 1.19.0, < 2.0)
+ cocoapods-core (1.10.2)
+ activesupport (> 5.0, < 6)
+ addressable (~> 2.6)
+ algoliasearch (~> 1.0)
+ concurrent-ruby (~> 1.1)
+ fuzzy_match (~> 2.0.4)
+ nap (~> 1.0)
+ netrc (~> 0.11)
+ public_suffix
+ typhoeus (~> 1.0)
+ cocoapods-deintegrate (1.0.5)
+ cocoapods-downloader (1.6.3)
+ cocoapods-plugins (1.0.0)
+ nap
+ cocoapods-search (1.0.1)
+ cocoapods-trunk (1.6.0)
+ nap (>= 0.8, < 2.0)
+ netrc (~> 0.11)
+ cocoapods-try (1.2.0)
+ colored (1.2)
+ colored2 (3.1.2)
+ commander (4.6.0)
+ highline (~> 2.0.0)
+ concurrent-ruby (1.2.2)
+ declarative (0.0.20)
+ digest-crc (0.6.5)
+ rake (>= 12.0.0, < 14.0.0)
+ discordrb (3.3.0)
+ discordrb-webhooks (~> 3.3.0)
+ ffi (>= 1.9.24)
+ opus-ruby
+ rbnacl (~> 3.4.0)
+ rest-client (>= 2.1.0.rc1)
+ websocket-client-simple (>= 0.3.0)
+ discordrb-webhooks (3.3.0)
+ rest-client (>= 2.1.0.rc1)
+ domain_name (0.5.20190701)
+ unf (>= 0.0.5, < 1.0.0)
+ dotenv (2.8.1)
+ emoji_regex (3.2.3)
+ escape (0.0.4)
+ ethon (0.16.0)
+ ffi (>= 1.15.0)
+ event_emitter (0.2.6)
+ excon (0.104.0)
+ faraday (1.10.3)
+ faraday-em_http (~> 1.0)
+ faraday-em_synchrony (~> 1.0)
+ faraday-excon (~> 1.1)
+ faraday-httpclient (~> 1.0)
+ faraday-multipart (~> 1.0)
+ faraday-net_http (~> 1.0)
+ faraday-net_http_persistent (~> 1.0)
+ faraday-patron (~> 1.0)
+ faraday-rack (~> 1.0)
+ faraday-retry (~> 1.0)
+ ruby2_keywords (>= 0.0.4)
+ faraday-cookie_jar (0.0.7)
+ faraday (>= 0.8.0)
+ http-cookie (~> 1.0.0)
+ faraday-em_http (1.0.0)
+ faraday-em_synchrony (1.0.0)
+ faraday-excon (1.1.0)
+ faraday-httpclient (1.0.1)
+ faraday-multipart (1.0.4)
+ multipart-post (~> 2)
+ faraday-net_http (1.0.1)
+ faraday-net_http_persistent (1.2.0)
+ faraday-patron (1.0.0)
+ faraday-rack (1.0.0)
+ faraday-retry (1.0.3)
+ faraday_middleware (1.2.0)
+ faraday (~> 1.0)
+ fastimage (2.2.7)
+ fastlane (2.216.0)
+ CFPropertyList (>= 2.3, < 4.0.0)
+ addressable (>= 2.8, < 3.0.0)
+ artifactory (~> 3.0)
+ aws-sdk-s3 (~> 1.0)
+ babosa (>= 1.0.3, < 2.0.0)
+ bundler (>= 1.12.0, < 3.0.0)
+ colored
+ commander (~> 4.6)
+ dotenv (>= 2.1.1, < 3.0.0)
+ emoji_regex (>= 0.1, < 4.0)
+ excon (>= 0.71.0, < 1.0.0)
+ faraday (~> 1.0)
+ faraday-cookie_jar (~> 0.0.6)
+ faraday_middleware (~> 1.0)
+ fastimage (>= 2.1.0, < 3.0.0)
+ gh_inspector (>= 1.1.2, < 2.0.0)
+ google-apis-androidpublisher_v3 (~> 0.3)
+ google-apis-playcustomapp_v1 (~> 0.1)
+ google-cloud-storage (~> 1.31)
+ highline (~> 2.0)
+ http-cookie (~> 1.0.5)
+ json (< 3.0.0)
+ jwt (>= 2.1.0, < 3)
+ mini_magick (>= 4.9.4, < 5.0.0)
+ multipart-post (>= 2.0.0, < 3.0.0)
+ naturally (~> 2.2)
+ optparse (~> 0.1.1)
+ plist (>= 3.1.0, < 4.0.0)
+ rubyzip (>= 2.0.0, < 3.0.0)
+ security (= 0.1.3)
+ simctl (~> 1.6.3)
+ terminal-notifier (>= 2.0.0, < 3.0.0)
+ terminal-table (~> 3)
+ tty-screen (>= 0.6.3, < 1.0.0)
+ tty-spinner (>= 0.8.0, < 1.0.0)
+ word_wrap (~> 1.0.0)
+ xcodeproj (>= 1.13.0, < 2.0.0)
+ xcpretty (~> 0.3.0)
+ xcpretty-travis-formatter (>= 0.0.3)
+ fastlane-plugin-discord_notifier (0.1.7)
+ discordrb (~> 3.3.0)
+ fastlane-plugin-firebase_app_distribution (0.7.4)
+ google-apis-firebaseappdistribution_v1 (~> 0.3.0)
+ ffi (1.16.3)
+ fourflusher (2.3.1)
+ fuzzy_match (2.0.4)
+ gh_inspector (1.1.3)
+ google-apis-androidpublisher_v3 (0.51.0)
+ google-apis-core (>= 0.11.0, < 2.a)
+ google-apis-core (0.11.2)
+ addressable (~> 2.5, >= 2.5.1)
+ googleauth (>= 0.16.2, < 2.a)
+ httpclient (>= 2.8.1, < 3.a)
+ mini_mime (~> 1.0)
+ representable (~> 3.0)
+ retriable (>= 2.0, < 4.a)
+ rexml
+ webrick
+ google-apis-firebaseappdistribution_v1 (0.3.0)
+ google-apis-core (>= 0.11.0, < 2.a)
+ google-apis-iamcredentials_v1 (0.17.0)
+ google-apis-core (>= 0.11.0, < 2.a)
+ google-apis-playcustomapp_v1 (0.13.0)
+ google-apis-core (>= 0.11.0, < 2.a)
+ google-apis-storage_v1 (0.19.0)
+ google-apis-core (>= 0.9.0, < 2.a)
+ google-cloud-core (1.6.0)
+ google-cloud-env (~> 1.0)
+ google-cloud-errors (~> 1.0)
+ google-cloud-env (1.6.0)
+ faraday (>= 0.17.3, < 3.0)
+ google-cloud-errors (1.3.1)
+ google-cloud-storage (1.44.0)
+ addressable (~> 2.8)
+ digest-crc (~> 0.4)
+ google-apis-iamcredentials_v1 (~> 0.1)
+ google-apis-storage_v1 (~> 0.19.0)
+ google-cloud-core (~> 1.6)
+ googleauth (>= 0.16.2, < 2.a)
+ mini_mime (~> 1.0)
+ googleauth (1.8.1)
+ faraday (>= 0.17.3, < 3.a)
+ jwt (>= 1.4, < 3.0)
+ multi_json (~> 1.11)
+ os (>= 0.9, < 2.0)
+ signet (>= 0.16, < 2.a)
+ highline (2.0.3)
+ http-accept (1.7.0)
+ http-cookie (1.0.5)
+ domain_name (~> 0.5)
+ httpclient (2.8.3)
+ i18n (1.14.1)
+ concurrent-ruby (~> 1.0)
+ jmespath (1.6.2)
+ json (2.6.3)
+ jwt (2.7.1)
+ mime-types (3.5.1)
+ mime-types-data (~> 3.2015)
+ mime-types-data (3.2023.1003)
+ mini_magick (4.12.0)
+ mini_mime (1.1.5)
+ minitest (5.20.0)
+ molinillo (0.6.6)
+ multi_json (1.15.0)
+ multipart-post (2.3.0)
+ nanaimo (0.3.0)
+ nap (1.1.0)
+ naturally (2.2.1)
+ netrc (0.11.0)
+ optparse (0.1.1)
+ opus-ruby (1.0.1)
+ ffi
+ os (1.1.4)
+ plist (3.7.0)
+ public_suffix (5.0.3)
+ rake (13.1.0)
+ rbnacl (3.4.0)
+ ffi
+ representable (3.2.0)
+ declarative (< 0.1.0)
+ trailblazer-option (>= 0.1.1, < 0.2.0)
+ uber (< 0.2.0)
+ rest-client (2.1.0)
+ http-accept (>= 1.7.0, < 2.0)
+ http-cookie (>= 1.0.2, < 2.0)
+ mime-types (>= 1.16, < 4.0)
+ netrc (~> 0.8)
+ retriable (3.1.2)
+ rexml (3.2.6)
+ rouge (2.0.7)
+ ruby-macho (1.4.0)
+ ruby2_keywords (0.0.5)
+ rubyzip (2.3.2)
+ security (0.1.3)
+ signet (0.18.0)
+ addressable (~> 2.8)
+ faraday (>= 0.17.5, < 3.a)
+ jwt (>= 1.5, < 3.0)
+ multi_json (~> 1.10)
+ simctl (1.6.10)
+ CFPropertyList
+ naturally
+ terminal-notifier (2.0.0)
+ terminal-table (3.0.2)
+ unicode-display_width (>= 1.1.1, < 3)
+ thread_safe (0.3.6)
+ trailblazer-option (0.1.2)
+ tty-cursor (0.7.1)
+ tty-screen (0.8.1)
+ tty-spinner (0.9.3)
+ tty-cursor (~> 0.7)
+ typhoeus (1.4.1)
+ ethon (>= 0.9.0)
+ tzinfo (1.2.11)
+ thread_safe (~> 0.1)
+ uber (0.1.0)
+ unf (0.1.4)
+ unf_ext
+ unf_ext (0.0.8.2)
+ unicode-display_width (2.5.0)
+ webrick (1.8.1)
+ websocket (1.2.10)
+ websocket-client-simple (0.8.0)
+ event_emitter
+ websocket
+ word_wrap (1.0.0)
+ xcodeproj (1.23.0)
+ CFPropertyList (>= 2.3.3, < 4.0)
+ atomos (~> 0.1.3)
+ claide (>= 1.0.2, < 2.0)
+ colored2 (~> 3.1)
+ nanaimo (~> 0.3.0)
+ rexml (~> 3.2.4)
+ xcpretty (0.3.0)
+ rouge (~> 2.0.7)
+ xcpretty-travis-formatter (1.0.1)
+ xcpretty (~> 0.2, >= 0.0.7)
+
+PLATFORMS
+ arm64-darwin-21
+
+DEPENDENCIES
+ cocoapods
+ fastlane
+ fastlane-plugin-discord_notifier
+ fastlane-plugin-firebase_app_distribution
+
+BUNDLED WITH
+ 2.3.7
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..caec9b8
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2023 Ricki Bin Yamin
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
\ No newline at end of file
diff --git a/Modules/SDDocsOrganizer/SDDocsOrganizer/ScanAlbums/View/SDScanAlbumsEmptyView.swift b/Modules/SDDocsOrganizer/SDDocsOrganizer/ScanAlbums/View/SDScanAlbumsEmptyView.swift
new file mode 100644
index 0000000..44a1fdf
--- /dev/null
+++ b/Modules/SDDocsOrganizer/SDDocsOrganizer/ScanAlbums/View/SDScanAlbumsEmptyView.swift
@@ -0,0 +1,59 @@
+//
+// SDScanAlbumsEmptyView.swift
+// SDDocsOrganizer
+//
+// Created by Ricki Bin Yamin on 19/11/23.
+//
+
+import UIKit
+import SDCoreKit
+
+final class SDScanAlbumsEmptyView: UIView {
+ private lazy var titleLabel: UILabel = {
+ let label = UILabel()
+ label.translatesAutoresizingMaskIntoConstraints = false
+ label.font = .preferredFont(forTextStyle: .title3)
+ label.textColor = .label
+ label.numberOfLines = 0
+ label.textAlignment = .center
+ label.text = "You don't have any documents"
+
+ return label
+ }()
+
+ private lazy var messageLabel: UILabel = {
+ let label = UILabel()
+ label.translatesAutoresizingMaskIntoConstraints = false
+ label.font = .preferredFont(forTextStyle: .footnote)
+ label.textColor = .secondaryLabel
+ label.numberOfLines = 0
+ label.textAlignment = .center
+ label.text = "Tap camera button on top right to start scanning document."
+
+ return label
+ }()
+
+ init() {
+ super.init(frame: .zero)
+
+ setupViews()
+ }
+
+ required init?(coder: NSCoder) {
+ fatalError("init(coder:) has not been implemented")
+ }
+
+ private func setupViews() {
+ addSubviews([titleLabel, messageLabel])
+
+ NSLayoutConstraint.activate([
+ titleLabel.centerYAnchor.constraint(equalTo: centerYAnchor),
+ titleLabel.leftAnchor.constraint(equalTo: leftAnchor, constant: 20),
+ titleLabel.rightAnchor.constraint(equalTo: rightAnchor, constant: -20),
+
+ messageLabel.topAnchor.constraint(equalTo: titleLabel.bottomAnchor, constant: 8),
+ messageLabel.leftAnchor.constraint(equalTo: leftAnchor, constant: 20),
+ messageLabel.rightAnchor.constraint(equalTo: rightAnchor, constant: -20)
+ ])
+ }
+}
diff --git a/Modules/SDDocsOrganizer/SDDocsOrganizer/ScanAlbums/View/SDScanAlbumsViewController.swift b/Modules/SDDocsOrganizer/SDDocsOrganizer/ScanAlbums/View/SDScanAlbumsViewController.swift
index 54f47ad..399c76f 100644
--- a/Modules/SDDocsOrganizer/SDDocsOrganizer/ScanAlbums/View/SDScanAlbumsViewController.swift
+++ b/Modules/SDDocsOrganizer/SDDocsOrganizer/ScanAlbums/View/SDScanAlbumsViewController.swift
@@ -171,6 +171,16 @@ final class SDScanAlbumsViewController: UIViewController, IScreenIdentifier {
}
}
}
+
+ private func configureEmptyState() {
+ let emptyView: SDScanAlbumsEmptyView = SDScanAlbumsEmptyView()
+ emptyView.frame = CGRect(x: view.center.x, y: view.center.y, width: view.bounds.size.width, height: view.bounds.size.height)
+ tableView.backgroundView = emptyView
+ }
+
+ private func clearEmptyState() {
+ tableView.backgroundView = nil
+ }
}
extension SDScanAlbumsViewController {
@@ -335,6 +345,12 @@ extension SDScanAlbumsViewController: UITableViewDelegate, UITableViewDataSource
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
interactor.getFetchedDocumentGroup()
+ if tableData.count == 0 {
+ configureEmptyState()
+ } else {
+ clearEmptyState()
+ }
+
return tableData.count
}
diff --git a/Podfile b/Podfile
index f006905..cdca7e7 100644
--- a/Podfile
+++ b/Podfile
@@ -11,6 +11,9 @@ target 'Scandocs' do
pod 'SDDocumentEditor', :path => 'Modules/SDDocumentEditor'
pod 'SDPhotosGallery', :path => 'Modules/SDPhotosGallery'
pod 'SDScanKit', :path => 'Modules/SDScanKit'
+
+ pod 'FirebaseAnalytics'
+ pod 'FirebaseCrashlytics'
end
post_install do |installer|
diff --git a/Podfile.lock b/Podfile.lock
index 88f99d2..ea72654 100644
--- a/Podfile.lock
+++ b/Podfile.lock
@@ -1,4 +1,102 @@
PODS:
+ - FirebaseAnalytics (10.17.0):
+ - FirebaseAnalytics/AdIdSupport (= 10.17.0)
+ - FirebaseCore (~> 10.0)
+ - FirebaseInstallations (~> 10.0)
+ - GoogleUtilities/AppDelegateSwizzler (~> 7.11)
+ - GoogleUtilities/MethodSwizzler (~> 7.11)
+ - GoogleUtilities/Network (~> 7.11)
+ - "GoogleUtilities/NSData+zlib (~> 7.11)"
+ - nanopb (< 2.30910.0, >= 2.30908.0)
+ - FirebaseAnalytics/AdIdSupport (10.17.0):
+ - FirebaseCore (~> 10.0)
+ - FirebaseInstallations (~> 10.0)
+ - GoogleAppMeasurement (= 10.17.0)
+ - GoogleUtilities/AppDelegateSwizzler (~> 7.11)
+ - GoogleUtilities/MethodSwizzler (~> 7.11)
+ - GoogleUtilities/Network (~> 7.11)
+ - "GoogleUtilities/NSData+zlib (~> 7.11)"
+ - nanopb (< 2.30910.0, >= 2.30908.0)
+ - FirebaseCore (10.17.0):
+ - FirebaseCoreInternal (~> 10.0)
+ - GoogleUtilities/Environment (~> 7.8)
+ - GoogleUtilities/Logger (~> 7.8)
+ - FirebaseCoreExtension (10.17.0):
+ - FirebaseCore (~> 10.0)
+ - FirebaseCoreInternal (10.17.0):
+ - "GoogleUtilities/NSData+zlib (~> 7.8)"
+ - FirebaseCrashlytics (10.17.0):
+ - FirebaseCore (~> 10.5)
+ - FirebaseInstallations (~> 10.0)
+ - FirebaseSessions (~> 10.5)
+ - GoogleDataTransport (~> 9.2)
+ - GoogleUtilities/Environment (~> 7.8)
+ - nanopb (< 2.30910.0, >= 2.30908.0)
+ - PromisesObjC (~> 2.1)
+ - FirebaseInstallations (10.17.0):
+ - FirebaseCore (~> 10.0)
+ - GoogleUtilities/Environment (~> 7.8)
+ - GoogleUtilities/UserDefaults (~> 7.8)
+ - PromisesObjC (~> 2.1)
+ - FirebaseSessions (10.17.0):
+ - FirebaseCore (~> 10.5)
+ - FirebaseCoreExtension (~> 10.0)
+ - FirebaseInstallations (~> 10.0)
+ - GoogleDataTransport (~> 9.2)
+ - GoogleUtilities/Environment (~> 7.10)
+ - nanopb (< 2.30910.0, >= 2.30908.0)
+ - PromisesSwift (~> 2.1)
+ - GoogleAppMeasurement (10.17.0):
+ - GoogleAppMeasurement/AdIdSupport (= 10.17.0)
+ - GoogleUtilities/AppDelegateSwizzler (~> 7.11)
+ - GoogleUtilities/MethodSwizzler (~> 7.11)
+ - GoogleUtilities/Network (~> 7.11)
+ - "GoogleUtilities/NSData+zlib (~> 7.11)"
+ - nanopb (< 2.30910.0, >= 2.30908.0)
+ - GoogleAppMeasurement/AdIdSupport (10.17.0):
+ - GoogleAppMeasurement/WithoutAdIdSupport (= 10.17.0)
+ - GoogleUtilities/AppDelegateSwizzler (~> 7.11)
+ - GoogleUtilities/MethodSwizzler (~> 7.11)
+ - GoogleUtilities/Network (~> 7.11)
+ - "GoogleUtilities/NSData+zlib (~> 7.11)"
+ - nanopb (< 2.30910.0, >= 2.30908.0)
+ - GoogleAppMeasurement/WithoutAdIdSupport (10.17.0):
+ - GoogleUtilities/AppDelegateSwizzler (~> 7.11)
+ - GoogleUtilities/MethodSwizzler (~> 7.11)
+ - GoogleUtilities/Network (~> 7.11)
+ - "GoogleUtilities/NSData+zlib (~> 7.11)"
+ - nanopb (< 2.30910.0, >= 2.30908.0)
+ - GoogleDataTransport (9.2.5):
+ - GoogleUtilities/Environment (~> 7.7)
+ - nanopb (< 2.30910.0, >= 2.30908.0)
+ - PromisesObjC (< 3.0, >= 1.2)
+ - GoogleUtilities/AppDelegateSwizzler (7.12.0):
+ - GoogleUtilities/Environment
+ - GoogleUtilities/Logger
+ - GoogleUtilities/Network
+ - GoogleUtilities/Environment (7.12.0):
+ - PromisesObjC (< 3.0, >= 1.2)
+ - GoogleUtilities/Logger (7.12.0):
+ - GoogleUtilities/Environment
+ - GoogleUtilities/MethodSwizzler (7.12.0):
+ - GoogleUtilities/Logger
+ - GoogleUtilities/Network (7.12.0):
+ - GoogleUtilities/Logger
+ - "GoogleUtilities/NSData+zlib"
+ - GoogleUtilities/Reachability
+ - "GoogleUtilities/NSData+zlib (7.12.0)"
+ - GoogleUtilities/Reachability (7.12.0):
+ - GoogleUtilities/Logger
+ - GoogleUtilities/UserDefaults (7.12.0):
+ - GoogleUtilities/Logger
+ - nanopb (2.30909.1):
+ - nanopb/decode (= 2.30909.1)
+ - nanopb/encode (= 2.30909.1)
+ - nanopb/decode (2.30909.1)
+ - nanopb/encode (2.30909.1)
+ - PromisesObjC (2.3.1)
+ - PromisesSwift (2.3.1):
+ - PromisesObjC (= 2.3.1)
- SDCameraScan (1.0.0):
- SDCoreKit
- SDScanKit
@@ -21,6 +119,8 @@ PODS:
- SDCoreKit
DEPENDENCIES:
+ - FirebaseAnalytics
+ - FirebaseCrashlytics
- SDCameraScan (from `Modules/SDCameraScan`)
- SDCloudKitModel (from `Modules/SDCloudKitModel`)
- SDCoreKit (from `Modules/SDCoreKit`)
@@ -30,6 +130,22 @@ DEPENDENCIES:
- SDPhotosGallery (from `Modules/SDPhotosGallery`)
- SDScanKit (from `Modules/SDScanKit`)
+SPEC REPOS:
+ trunk:
+ - FirebaseAnalytics
+ - FirebaseCore
+ - FirebaseCoreExtension
+ - FirebaseCoreInternal
+ - FirebaseCrashlytics
+ - FirebaseInstallations
+ - FirebaseSessions
+ - GoogleAppMeasurement
+ - GoogleDataTransport
+ - GoogleUtilities
+ - nanopb
+ - PromisesObjC
+ - PromisesSwift
+
EXTERNAL SOURCES:
SDCameraScan:
:path: Modules/SDCameraScan
@@ -49,6 +165,19 @@ EXTERNAL SOURCES:
:path: Modules/SDScanKit
SPEC CHECKSUMS:
+ FirebaseAnalytics: b9284f9fff10157a843e0422e908711f7bf3b9f2
+ FirebaseCore: 534544dd98cabcf4bf8598d88ec683b02319a528
+ FirebaseCoreExtension: 47720bb330d7041047c0935a34a3a4b92f818074
+ FirebaseCoreInternal: 2cf9202e226e3f78d2bf6d56c472686b935bfb7f
+ FirebaseCrashlytics: d78651ad7db206ef98269e103ac38d69d569200a
+ FirebaseInstallations: 9387bf15abfc69a714f54e54f74a251264fdb79b
+ FirebaseSessions: 49f39e5c10e3f9fdd38d01b748329bae2a2fa8ed
+ GoogleAppMeasurement: 4dcddfc7f102825c1c4e6422cb35567b101881a7
+ GoogleDataTransport: 54dee9d48d14580407f8f5fbf2f496e92437a2f2
+ GoogleUtilities: 0759d1a57ebb953965c2dfe0ba4c82e95ccc2e34
+ nanopb: d4d75c12cd1316f4a64e3c6963f879ecd4b5e0d5
+ PromisesObjC: c50d2056b5253dadbd6c2bea79b0674bd5a52fa4
+ PromisesSwift: 28dca69a9c40779916ac2d6985a0192a5cb4a265
SDCameraScan: a6ee2c74fab855cd7995eafc310d738553676cf0
SDCloudKitModel: 5d8674c8e83592202158f9d559b0d877d4106b81
SDCoreKit: 098a4f1d9398d9f7de03cf33307b35f1a31a4941
@@ -58,6 +187,6 @@ SPEC CHECKSUMS:
SDPhotosGallery: 2d7e7c2182a4c6f4136e605fbc738ba3415c35e6
SDScanKit: 8ccf2518b7bdadd7771ca2e07362fbee4f39ec78
-PODFILE CHECKSUM: 11015ba41b2bafbf297d843272f2c2457ac84e3b
+PODFILE CHECKSUM: 2022d526fb9052a8635f6085adeb06e257426b07
COCOAPODS: 1.11.3
diff --git a/Privacy Policy/PrivacyPolicy.md b/Privacy Policy/PrivacyPolicy.md
new file mode 100644
index 0000000..d22b1fb
--- /dev/null
+++ b/Privacy Policy/PrivacyPolicy.md
@@ -0,0 +1,33 @@
+# Privacy Policy for Scandocs
+
+**Last updated:** November 19, 2023
+
+## 1. Introduction
+
+Welcome to Scandocs, a document scanner application for iOS. This Privacy Policy is designed to help you understand how we collect, use, share, and safeguard your personal information.
+
+## 2. Information We Collect
+
+- **Camera Access:** Scandocs requires access to your device's camera to scan documents. We do not store any images captured by the camera.
+
+- **Photo Library Access:** Scandocs require access to your photo library to import your local photos to be cropped or processed inside Scandocs apps.
+
+- **Personal Information:** Scandocs does not collect or store any personal information.
+
+## 3. Database Location
+
+We store your scanned document to your personal iCloud account, not public CloudKit storage. So that only you that have access to your scanned document.
+
+## 4. Your Choices
+
+You can control and manage app permissions through your device settings. You may also contact us to inquire about the information we have collected and request its deletion.
+
+## 5. Changes to This Privacy Policy
+
+We may update this Privacy Policy periodically. Users will be notified of any changes by revising the "Last updated" date at the top of this page.
+
+## 8. Contact Us
+
+If you have any questions or concerns about this Privacy Policy, please contact us at ricki.bin.yamin@gmail.com.
+
+By using Scandocs, you agree to the terms outlined in this Privacy Policy.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..39fe0c8
--- /dev/null
+++ b/README.md
@@ -0,0 +1,44 @@
+# Scandocs: Document Scanner
+
+[![License](https://img.shields.io/badge/license-MIT-green)](LICENSE)
+
+Scandocs is a simple and efficient document scanner app for iOS. Capture, organize, and manage your documents effortlessly. What sets Scandocs apart? It's totally free, with no ads or hidden subscriptions!
+
+## Features
+
+- 📷 **Easy Scanning:** Utilize your device's camera to quickly scan documents.
+- 📑 **Organize Documents:** Create and manage folders to keep your scans organized.
+- 🚀 **Fast and Lightweight:** Enjoy a streamlined experience with a focus on simplicity.
+- 🔄 **iCloud Synced:** Your saved document are synced in iCloud. You can access it on any ios devices that use the same iCloud account.
+
+## Get Started
+1. Your system should have [`xcodegen`](https://github.com/yonaskolb/XcodeGen?tab=readme-ov-file#installing) and [`cocoapods`](https://guides.cocoapods.org/using/getting-started.html#installation) installed before running this project.
+2. Clone the repository: `git clone https://github.com/rickirby/scandocs.git` or `git clone git@github.com:rickirby/scandocs.git`.
+3. Run `./setup.sh` from your terminal. It should setup the project (by XcodeGen) and then setting up dependency (by CocoaPods).
+2. Open `Scandocs.xcworkspace`.
+3. Build and run the app on your iOS device or simulator.
+
+## App Store
+
+Download Scandocs on the [App Store](https://apps.apple.com/id/app/scandocs-document-scanner/id6472603812).
+
+## Screenshots
+
+| ![Screenshot 1](screenshots/screenshots1.png) | ![Screenshot 2](screenshots/screenshots2.png) | ![Screenshot 3](screenshots/screenshots3.png) | ![Screenshot 4](screenshots/screenshots4.png) |
+|-----------------------------------------------|-----------------------------------------------|-----------------------------------------------|-----------------------------------------------|
+
+## Keywords
+
+Document Scanner, Scanner, Camera Scanner, Page Scan, Scan
+
+## Contributing
+
+We welcome contributions! Please check out our [contribution guidelines](CONTRIBUTING.md) for details.
+
+## License
+
+Scandocs is available under the MIT License. See the [LICENSE](LICENSE) file for more information.
+
+---
+
+**Note:** If you enjoy using Scandocs, consider leaving a positive review on the App Store. Your feedback is invaluable!
\ No newline at end of file
diff --git a/Scandocs/AppUtilities/AppDelegate.swift b/Scandocs/AppUtilities/AppDelegate.swift
index 343ccc8..d8fd2db 100644
--- a/Scandocs/AppUtilities/AppDelegate.swift
+++ b/Scandocs/AppUtilities/AppDelegate.swift
@@ -15,6 +15,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
+ FirebaseSetupCommand().execute()
return true
}
diff --git a/Scandocs/AppUtilities/SetupCommandUtilities/SetupCommand/FirebaseSetupCommand.swift b/Scandocs/AppUtilities/SetupCommandUtilities/SetupCommand/FirebaseSetupCommand.swift
new file mode 100644
index 0000000..baa4b11
--- /dev/null
+++ b/Scandocs/AppUtilities/SetupCommandUtilities/SetupCommand/FirebaseSetupCommand.swift
@@ -0,0 +1,15 @@
+//
+// FirebaseSetupCommand.swift
+// Scandocs
+//
+// Created by Ricki Bin Yamin on 19/11/23.
+//
+
+import Foundation
+import FirebaseCore
+
+struct FirebaseSetupCommand: ISetupCommand {
+ func execute() {
+ FirebaseApp.configure()
+ }
+}
diff --git a/Scandocs/GoogleService-Info.plist b/Scandocs/GoogleService-Info.plist
new file mode 100644
index 0000000..ce8e20c
--- /dev/null
+++ b/Scandocs/GoogleService-Info.plist
@@ -0,0 +1,30 @@
+
+
+
+
+ API_KEY
+ AIzaSyBgNNGOQPByzEwJHBucijn1bu0Zz9BTbfg
+ GCM_SENDER_ID
+ 364479955210
+ PLIST_VERSION
+ 1
+ BUNDLE_ID
+ com.scandocs.ios
+ PROJECT_ID
+ scandocs-ios
+ STORAGE_BUCKET
+ scandocs-ios.appspot.com
+ IS_ADS_ENABLED
+
+ IS_ANALYTICS_ENABLED
+
+ IS_APPINVITE_ENABLED
+
+ IS_GCM_ENABLED
+
+ IS_SIGNIN_ENABLED
+
+ GOOGLE_APP_ID
+ 1:364479955210:ios:57751a7f94a28496833af3
+
+
\ No newline at end of file
diff --git a/Scandocs/Supporting Files/Info.plist b/Scandocs/Supporting Files/Info.plist
index f628db4..b9492be 100644
--- a/Scandocs/Supporting Files/Info.plist
+++ b/Scandocs/Supporting Files/Info.plist
@@ -10,6 +10,12 @@
$(VERSION_NAME)
CFBundleVersion
$(BUILD_NUMBER)
+ CFBundlePackageType
+ APPL
+ CFBundleDisplayName
+ $(APP_NAME)
+ CFBundleName
+ $(APP_NAME)
UIApplicationSceneManifest
UIApplicationSupportsMultipleScenes
@@ -41,5 +47,7 @@
The app needs access to save scanned documents in your photo library
NSCameraUsageDescription
The app needs access your camera to capture the document that will be scanned
+ ITSAppUsesNonExemptEncryption
+
diff --git a/Tooling/change_build_number.sh b/Tooling/change_build_number.sh
new file mode 100755
index 0000000..ae1e88d
--- /dev/null
+++ b/Tooling/change_build_number.sh
@@ -0,0 +1,11 @@
+#!/bin/bash
+
+# Input Param
+new_build_number="$1"
+
+# Change BUILD_NUMBER in .xcconfig files
+echo -e "\033[0;33mChange BUILD_NUMBER in all .xcconfig files into $new_build_number...\033[0m"
+xcconfig_path="Configuration"
+
+find "$xcconfig_path" -type f -name "*.xcconfig" -exec sed -i '' -e "s/BUILD_NUMBER = .*/BUILD_NUMBER = $new_build_number/" {} \;
+echo -e "\033[0;32m✅ Successfully update BUILD_NUMBER to $new_build_number in all .xcconfig files\033[0m"
\ No newline at end of file
diff --git a/project.yml b/project.yml
index baf7418..39db8e9 100644
--- a/project.yml
+++ b/project.yml
@@ -10,6 +10,8 @@ settings:
PRODUCT_BUNDLE_IDENTIFIER: $(BUNDLE_ID)
BUILD_NUMBER: $(BUILD_NUMBER)
VERSION_NAME: $(VERSION_NAME)
+ PROVISIONING_PROFILE_SPECIFIER: $(APP_PROVISIONING_PROFILE)
+ CODE_SIGN_IDENTITY: $(CODE_SIGN_IDENTITY)
targets:
Scandocs:
@@ -25,6 +27,17 @@ targets:
TARGETED_DEVICE_FAMILY: $(TARGETED_DEVICE_FAMILY)
SWIFT_ACTIVE_COMPILATION_CONDITIONS: $(SWIFT_ACTIVE_COMPILATION_CONDITIONS)
CODE_SIGN_ENTITLEMENTS: "Scandocs/Supporting Files/Scandocs.entitlements"
+ postBuildScripts:
+ - name: Upload dSYMs Scripts
+ path: xcodegen-scripts/upload_dsyms.sh
+ basedOnDependencyAnalysis: YES
+ showEnvVars: YES
+ inputFiles:
+ - "${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}"
+ - "${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${PRODUCT_NAME}"
+ - "${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Info.plist"
+ - "$(TARGET_BUILD_DIR)/$(UNLOCALIZED_RESOURCES_FOLDER_PATH)/GoogleService-Info.plist"
+ - "$(TARGET_BUILD_DIR)/$(EXECUTABLE_PATH)"
schemes:
Scandocs:
diff --git a/screenshots/screenshots1.png b/screenshots/screenshots1.png
new file mode 100644
index 0000000..8551a54
Binary files /dev/null and b/screenshots/screenshots1.png differ
diff --git a/screenshots/screenshots2.png b/screenshots/screenshots2.png
new file mode 100644
index 0000000..c97a5aa
Binary files /dev/null and b/screenshots/screenshots2.png differ
diff --git a/screenshots/screenshots3.png b/screenshots/screenshots3.png
new file mode 100644
index 0000000..ea4b2aa
Binary files /dev/null and b/screenshots/screenshots3.png differ
diff --git a/screenshots/screenshots4.png b/screenshots/screenshots4.png
new file mode 100644
index 0000000..b0feb3c
Binary files /dev/null and b/screenshots/screenshots4.png differ
diff --git a/xcodegen-scripts/upload_dsyms.sh b/xcodegen-scripts/upload_dsyms.sh
new file mode 100755
index 0000000..6bba2bd
--- /dev/null
+++ b/xcodegen-scripts/upload_dsyms.sh
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+${PROJECT_DIR}/Pods/FirebaseCrashlytics/Run
\ No newline at end of file