diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4a9270c2..d319eeaf 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,8 +2,33 @@ name: CI on: [ push, pull_request ] jobs: + checks: + name: "Lint & Test" + runs-on: macos-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-java@v1 + with: + java-version: '12.x' + - uses: subosito/flutter-action@v1 + with: + channel: 'dev' + - name: "Lint" + run: | + touch .env + flutter analyze + - name: "Test" + run: flutter test + - name: "Upload Failure Screenshots" + uses: actions/upload-artifact@v2 + if: failure() + with: + name: golden-failures + path: test/failures + version: name: "Get Version" + needs: checks runs-on: ubuntu-latest outputs: version: ${{ steps.version.outputs.VERSION }} @@ -39,30 +64,6 @@ jobs: echo ::set-output name=VERSION::$GITHUB_RUN_ID fi - checks: - name: "Lint & Test" - runs-on: macos-latest - steps: - - uses: actions/checkout@v2 - - uses: actions/setup-java@v1 - with: - java-version: '12.x' - - uses: subosito/flutter-action@v1 - with: - channel: 'dev' - - name: "Lint" - run: | - touch .env - flutter analyze - - name: "Test" - run: flutter test - - name: "Upload failure Screenshots" - uses: actions/upload-artifact@v2 - if: failure() - with: - name: golden-failures - path: test/failures - ######### # macos # ######### @@ -72,82 +73,88 @@ jobs: needs: version steps: - uses: actions/checkout@v2 + - name: "Gen Keychain" + env: + FASTLANE_PASSWORD: ${{ secrets.FASTLANE_PASSWORD }} + MATCH_GIT_BASIC_AUTHORIZATION: ${{ secrets.MATCH_GIT_BASIC_AUTHORIZATION }} + MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }} + continue-on-error: true + run: | + echo "${{ secrets.APPLE_AUTH_KEY_P8 }}" | base64 --decode > AuthKey_MK4628AYTK.p8 + mkdir ~/.private_keys + cp AuthKey_MK4628AYTK.p8 ~/.private_keys/ + cd macos + gem install fastlane + fastlane keychain - uses: actions/setup-java@v1 with: java-version: '12.x' - - name: "Setup Code signing" - env: - DEV_P12_CERT: ${{ secrets.DEV_P12_CERT }} - DIST_P12_CERT: ${{ secrets.DIST_P12_CERT }} - DEV_P12_PASS: ${{ secrets.DEV_P12_PASS }} - DIST_P12_PASS: ${{ secrets.DIST_P12_PASS }} - IOS_PROVISION: ${{ secrets.IOS_PROVISION }} - MAC_PROVISION: ${{ secrets.MAC_PROVISION }} - run: | - bash ~/.github/workflows/utils/set-keychain-certs.sh - uses: subosito/flutter-action@v1 with: channel: 'dev' - - name: "Create App" - env: - FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD: ${{ secrets.FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD }} - FASTLANE_SESSION: ${{ secrets.FASTLANE_SESSION }} - FASTLANE_PASSWORD: ${{ secrets.FASTLANE_PASSWORD }} + - name: "Build" run: | flutter config --enable-macos-desktop flutter pub get - - if [[ "${{ github.ref }}" == "refs/heads/master" ]] + if [[ "${{ github.ref }}" == "refs/heads/develop" ]] then - echo "${{ secrets.B64_ENV }}" | base64 --decode > .env + echo "${{ secrets.B64_DEV_ENV }}" | base64 --decode > .env else - echo "${{ secrets.B64_DEV_ENV }}" | base64 --decode > .env + echo "${{ secrets.B64_ENV }}" | base64 --decode > .env fi - cd macos - # write version + cd macos xcrun agvtool new-marketing-version ${{ needs.version.outputs.version }} xcrun agvtool new-version -all ${{ needs.version.outputs.version }} + + cd ../ + flutter build macos --release --build-name=${{ needs.version.outputs.version }} + /usr/bin/codesign --force --deep --options runtime --strict -s Z28DW76Y3W build/macos/Build/Products/Release/notifi.app - pod install - - gem install fastlane - fastlane mac build - - - name: "Create .dmg" - continue-on-error: true + - name: "Create & Notarize .dmg" + env: + APPLE_USERNAME: ${{ secrets.APPLE_USERNAME }} + APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }} run: | npm install --global create-dmg - mkdir dmg - create-dmg ./macos/notifi.app dmg/ + + mkdir dmg/ + create-dmg build/macos/Build/Products/Release/notifi.app dmg/ + mv dmg/* notifi.dmg + + dmg_path="notifi.dmg" + + /usr/bin/codesign --force --deep --strict --options runtime -s "Z28DW76Y3W" "$dmg_path" + + echo "notarizing..." + notarize=$(xcrun altool -t osx --primary-bundle-id it.notifi.notifi --output-format json --notarize-app -f "$dmg_path" --username "$APPLE_USERNAME" --password "$APPLE_PASSWORD") + uuid=$(echo "$notarize" | python3 -c "import sys, json; print(json.load(sys.stdin)['notarization-upload']['RequestUUID'])") + echo "$uuid" + + # wait for apple to notarize + sleep 60 + + while true; do + check=$(xcrun altool --notarization-info "$uuid" --output-format json --username "$APPLE_USERNAME" --password "$APPLE_PASSWORD") + echo $check + status=$(echo "$check" | python3 -c "import sys, json; print(json.load(sys.stdin)['notarization-info']['Status'])") + echo $status + if [ "$status" != "in progress" ]; then + echo "staple dmg..." + xcrun stapler staple -v "$dmg_path" + exit 0 + fi + sleep 10 + done + exit 1 - name: "Store .dmg artifact" uses: actions/upload-artifact@v2 with: name: notifi-dmg - path: dmg/ + path: notifi.dmg if-no-files-found: error - deploy-macos: - name: "Deploy MacOS" - if: ${{ github.ref == 'refs/heads/master' || (!github.event.issue.pull_request && github.ref == 'refs/heads/develop') }} - runs-on: macos-latest - needs: [ checks, build-macos, version ] - steps: - - uses: actions/download-artifact@v2 - id: download - with: - name: notifi-dmg - - name: "Deploy .dmg as GH release" - uses: marvinpinto/action-automatic-releases@latest - with: - repo_token: "${{ secrets.GITHUB_TOKEN }}" - prerelease: ${{ github.ref == 'refs/heads/develop' }} - automatic_release_tag: ${{ needs.version.outputs.version }} - title: "Release ${{ needs.version.outputs.version }}" - files: | - ${{steps.download.outputs.download-path}} - ######### # iOS # ######### @@ -161,25 +168,16 @@ jobs: - uses: actions/setup-java@v1 with: java-version: '12.x' - - name: "Setup Code signing" - env: - DEV_P12_CERT: ${{ secrets.DEV_P12_CERT }} - DIST_P12_CERT: ${{ secrets.DIST_P12_CERT }} - DEV_P12_PASS: ${{ secrets.DEV_P12_PASS }} - DIST_P12_PASS: ${{ secrets.DIST_P12_PASS }} - IOS_PROVISION: ${{ secrets.IOS_PROVISION }} - MAC_PROVISION: ${{ secrets.MAC_PROVISION }} - run: | - bash ~/.github/workflows/utils/set-keychain-certs.sh + - uses: subosito/flutter-action@v1 with: channel: 'dev' - name: "Build & Deploy" env: - FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD: ${{ secrets.FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD }} - FASTLANE_SESSION: ${{ secrets.FASTLANE_SESSION }} FASTLANE_PASSWORD: ${{ secrets.FASTLANE_PASSWORD }} + MATCH_GIT_BASIC_AUTHORIZATION: ${{ secrets.MATCH_GIT_BASIC_AUTHORIZATION }} + MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }} run: | flutter pub get if [[ "${{ github.ref }}" != "refs/heads/master" ]] @@ -189,7 +187,10 @@ jobs: echo "${{ secrets.B64_ENV }}" | base64 --decode > .env fi + echo "${{ secrets.APPLE_AUTH_KEY_P8 }}" | base64 --decode > AuthKey_MK4628AYTK.p8 + cd ios + flutter pub get # write version xcrun agvtool new-marketing-version ${{ needs.version.outputs.version }} @@ -198,9 +199,31 @@ jobs: pod install gem install fastlane + if [[ "${{ github.ref }}" == "refs/heads/master" ]] then fastlane asdeploy else fastlane tfdeploy fi + + # Create release + release: + name: "Release" + if: ${{ github.ref == 'refs/heads/master' || (!github.event.issue.pull_request && github.ref == 'refs/heads/develop') }} + runs-on: macos-latest + needs: [ checks, build-macos, build-ios, version ] + steps: + - uses: actions/download-artifact@v2 + id: download + with: + name: notifi-dmg + - name: "Create Release" + uses: marvinpinto/action-automatic-releases@latest + with: + repo_token: "${{ secrets.GITHUB_TOKEN }}" + prerelease: ${{ github.ref == 'refs/heads/develop' }} + automatic_release_tag: ${{ needs.version.outputs.version }} + title: "Release ${{ needs.version.outputs.version }}" + files: | + ${{steps.download.outputs.download-path}} diff --git a/.github/workflows/scripts/notarize.sh b/.github/workflows/scripts/notarize.sh new file mode 100644 index 00000000..2384f50c --- /dev/null +++ b/.github/workflows/scripts/notarize.sh @@ -0,0 +1,30 @@ +#!/bin/bash +npm install --global create-dmg + +mkdir dmg/ +create-dmg build/macos/Build/Products/Release/notifi.app dmg/ +mv dmg/* notifi.dmg + +dmg_path="notifi.dmg" + +/usr/bin/codesign --force --deep --strict --options runtime -s "Z28DW76Y3W" "$dmg_path" + +echo "notarizing..." +notarize=$(xcrun altool -t osx --primary-bundle-id it.notifi.notifi --output-format json --notarize-app -f "$dmg_path" --username "$APPLE_USERNAME" --password "$APPLE_PASSWORD") +uuid=$(echo "$notarize" | python3 -c "import sys, json; print(json.load(sys.stdin)['notarization-upload']['RequestUUID'])") +echo "$uuid" + +# wait for apple to notarize +sleep 60 + +while true; do + check=$(xcrun altool --notarization-info "$uuid" --output-format json --username "$APPLE_USERNAME" --password "$APPLE_PASSWORD") + echo $check + status=$(echo "$check" | python3 -c "import sys, json; print(json.load(sys.stdin)['notarization-info']['Status'])") + echo $status + if [ "$status" != "in progress" ]; then + echo "staple dmg..." + xcrun stapler staple -v "$dmg_path" + exit + fi +done diff --git a/.github/workflows/utils/set-keychain-certs.sh b/.github/workflows/utils/set-keychain-certs.sh deleted file mode 100644 index 01dd9f10..00000000 --- a/.github/workflows/utils/set-keychain-certs.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -echo "$DEV_P12_CERT" | base64 --decode > devcert.p12 # ios -echo "$DIST_P12_CERT" | base64 --decode > distcert.p12 -security create-keychain -p p4ssword build.keychain -security default-keychain -s build.keychain -security unlock-keychain -p p4ssword build.keychain -security import devcert.p12 -k build.keychain -P "$DEV_P12_PASS" -T /usr/bin/codesign -security import distcert.p12 -k build.keychain -P "$DIST_P12_PASS" -T /usr/bin/codesign -security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k p4ssword build.keychain - -mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles -echo "$IOS_PROVISION" | base64 --decode > ~/Library/MobileDevice/Provisioning\ Profiles/profile.mobileprovision -echo "$MAC_PROVISION" | base64 --decode > ~/Library/MobileDevice/Provisioning\ Profiles/mac.provisionprofile diff --git a/.gitignore b/.gitignore index 2a695c12..80b7d304 100644 --- a/.gitignore +++ b/.gitignore @@ -55,3 +55,5 @@ app.*.map.json /macos/notifi.app/ /ios/fastlane/report.xml /macos/fastlane/report.xml +AuthKey_MK4628AYTK.p8 +/.env \ No newline at end of file diff --git a/README.md b/README.md index 268b4766..c7261dc9 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,8 @@ flutter channel master flutter upgrade ``` +# Run locally + ## create .env with the content ``` CODE_ENDPOINT=http://127.0.0.1:9081/code @@ -41,23 +43,23 @@ flutter build macos flutter run -d macos ``` -## Tests +# Tests -### Lint & Test +## Lint & Test ```bash bash ./pre-commit.sh ``` -### Set screenshot asserts +## Set screenshot asserts ``` bash ./test/set-asserts.sh ``` -## Extras +# Extras -### Add pre-commit hook +## Add pre-commit hook ```bash ln -s $(pwd)/pre-commit.sh $(pwd)/.git/hooks/pre-commit @@ -65,13 +67,7 @@ chmod +x $(pwd)/.git/hooks/pre-commit ``` ### fastlane -#### provision profiles -``` -fastlane sigh -p macos -fastlane sigh -p ios -``` -### ### Jetbrains flutter plugin: diff --git a/images/bell.png b/images/bell.png index d8c80f4c..01890653 100644 Binary files a/images/bell.png and b/images/bell.png differ diff --git a/images/sad.png b/images/sad.png index 05ab5d7e..76daa577 100644 Binary files a/images/sad.png and b/images/sad.png differ diff --git a/ios/Podfile b/ios/Podfile index 252d9ec7..9411102b 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -1,5 +1,5 @@ # Uncomment this line to define a global platform for your project -platform :ios, '9.0' +platform :ios, '10.0' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' diff --git a/ios/Podfile.lock b/ios/Podfile.lock index f7d9d9e7..d569f9f7 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -15,17 +15,17 @@ PODS: - FirebaseCoreDiagnostics (~> 7.0) - GoogleUtilities/Environment (~> 7.0) - GoogleUtilities/Logger (~> 7.0) - - FirebaseCoreDiagnostics (7.6.0): - - GoogleDataTransport (~> 8.0) + - FirebaseCoreDiagnostics (7.11.0): + - GoogleDataTransport (~> 8.4) - GoogleUtilities/Environment (~> 7.0) - GoogleUtilities/Logger (~> 7.0) - - nanopb (~> 2.30907.0) - - FirebaseInstallations (7.6.0): + - nanopb (~> 2.30908.0) + - FirebaseInstallations (7.11.0): - FirebaseCore (~> 7.0) - GoogleUtilities/Environment (~> 7.0) - GoogleUtilities/UserDefaults (~> 7.0) - PromisesObjC (~> 1.2) - - FirebaseInstanceID (7.10.0): + - FirebaseInstanceID (7.11.0): - FirebaseCore (~> 7.0) - FirebaseInstallations (~> 7.0) - GoogleUtilities/Environment (~> 7.0) @@ -47,30 +47,32 @@ PODS: - FMDB (2.7.5): - FMDB/standard (= 2.7.5) - FMDB/standard (2.7.5) - - GoogleDataTransport (8.2.0): - - nanopb (~> 2.30907.0) - - GoogleUtilities/AppDelegateSwizzler (7.2.2): + - GoogleDataTransport (8.4.0): + - GoogleUtilities/Environment (~> 7.2) + - nanopb (~> 2.30908.0) + - PromisesObjC (~> 1.2) + - GoogleUtilities/AppDelegateSwizzler (7.3.1): - GoogleUtilities/Environment - GoogleUtilities/Logger - GoogleUtilities/Network - - GoogleUtilities/Environment (7.2.2): + - GoogleUtilities/Environment (7.3.1): - PromisesObjC (~> 1.2) - - GoogleUtilities/Logger (7.2.2): + - GoogleUtilities/Logger (7.3.1): - GoogleUtilities/Environment - - GoogleUtilities/Network (7.2.2): + - GoogleUtilities/Network (7.3.1): - GoogleUtilities/Logger - "GoogleUtilities/NSData+zlib" - GoogleUtilities/Reachability - - "GoogleUtilities/NSData+zlib (7.2.2)" - - GoogleUtilities/Reachability (7.2.2): + - "GoogleUtilities/NSData+zlib (7.3.1)" + - GoogleUtilities/Reachability (7.3.1): - GoogleUtilities/Logger - - GoogleUtilities/UserDefaults (7.2.2): + - GoogleUtilities/UserDefaults (7.3.1): - GoogleUtilities/Logger - - nanopb (2.30907.0): - - nanopb/decode (= 2.30907.0) - - nanopb/encode (= 2.30907.0) - - nanopb/decode (2.30907.0) - - nanopb/encode (2.30907.0) + - nanopb (2.30908.0): + - nanopb/decode (= 2.30908.0) + - nanopb/encode (= 2.30908.0) + - nanopb/decode (2.30908.0) + - nanopb/encode (2.30908.0) - package_info (0.0.1): - Flutter - path_provider (0.0.1): @@ -78,6 +80,8 @@ PODS: - "permission_handler (4.4.0+hotfix.4)": - Flutter - PromisesObjC (1.2.12) + - share (0.0.1): + - Flutter - sqflite (0.0.2): - Flutter - FMDB (>= 2.7.5) @@ -94,6 +98,7 @@ DEPENDENCIES: - package_info (from `.symlinks/plugins/package_info/ios`) - path_provider (from `.symlinks/plugins/path_provider/ios`) - permission_handler (from `.symlinks/plugins/permission_handler/ios`) + - share (from `.symlinks/plugins/share/ios`) - sqflite (from `.symlinks/plugins/sqflite/ios`) - url_launcher (from `.symlinks/plugins/url_launcher/ios`) @@ -130,6 +135,8 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/path_provider/ios" permission_handler: :path: ".symlinks/plugins/permission_handler/ios" + share: + :path: ".symlinks/plugins/share/ios" sqflite: :path: ".symlinks/plugins/sqflite/ios" url_launcher: @@ -140,25 +147,26 @@ SPEC CHECKSUMS: firebase_core: 91b27774a52f41f8b58484a75edf71197ac01c59 firebase_messaging: caf0273c76e54f0a10dfe5048ac47b89e75bb78a FirebaseCore: 4d3c72622ce0e2106aaa07bb4b2935ba2c370972 - FirebaseCoreDiagnostics: ee1184d51da3293335b83355aad20f537acc24cf - FirebaseInstallations: 6e4e77396559bc2ae0504823837ed737b1c7e47f - FirebaseInstanceID: 5ad92c898e1328b66e8dd58811964d6fe4d334c3 + FirebaseCoreDiagnostics: 68ad972f99206cef818230f3f3179d52ccfb7f8c + FirebaseInstallations: a58d4f72ec5861840b84df489f2668d970df558a + FirebaseInstanceID: ad5135045a498d7775903efd39762d2cdfa1be27 FirebaseMessaging: 68d1bcb14880189558a8ae57167abe0b7e417232 Flutter: 434fef37c0980e73bb6479ef766c45957d4b510c flutter_app_badger: 65de4d6f0c34a891df49e6cfb8a1c0496426fa68 flutter_local_notifications: 0c0b1ae97e741e1521e4c1629a459d04b9aec743 flutter_secure_storage: 7953c38a04c3fdbb00571bcd87d8e3b5ceb9daec FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a - GoogleDataTransport: 1024b1a4dfbd7a0e92cb20d7e0a6f1fb66b449a4 - GoogleUtilities: 31c5b01f978a70c6cff2afc6272b3f1921614b43 - nanopb: 59221d7f958fb711001e6a449489542d92ae113e + GoogleDataTransport: cd9db2180fcecd8da1b561aea31e3e56cf834aa7 + GoogleUtilities: e1d9ed4e544fc32a93e00e721400cbc3f377200d + nanopb: a0ba3315591a9ae0a16a309ee504766e90db0c96 package_info: 873975fc26034f0b863a300ad47e7f1ac6c7ec62 path_provider: abfe2b5c733d04e238b0d8691db0cfd63a27a93c permission_handler: 8278954f2382902f63f00dd8828769c0bd6d511b PromisesObjC: 3113f7f76903778cf4a0586bd1ab89329a0b7b97 + share: 0b2c3e82132f5888bccca3351c504d0003b3b410 sqflite: 6d358c025f5b867b29ed92fc697fd34924e11904 url_launcher: 6fef411d543ceb26efce54b05a0a40bfd74cbbef -PODFILE CHECKSUM: a75497545d4391e2d394c3668e20cfb1c2bbd4aa +PODFILE CHECKSUM: fe0e1ee7f3d1f7d00b11b474b62dd62134535aea COCOAPODS: 1.10.1 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 907f9425..a714d6c6 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -486,7 +486,7 @@ CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; @@ -547,8 +547,8 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CODE_SIGN_IDENTITY = "Apple Development"; - CODE_SIGN_STYLE = Automatic; + CODE_SIGN_IDENTITY = "iPhone Distribution"; + CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 0.1.0; DEVELOPMENT_TEAM = Z28DW76Y3W; ENABLE_BITCODE = NO; @@ -561,7 +561,7 @@ MARKETING_VERSION = 0.1.0; PRODUCT_BUNDLE_IDENTIFIER = it.notifi.notifi; PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; + PROVISIONING_PROFILE_SPECIFIER = "match AppStore it.notifi.notifi"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/1024.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/1024.png index 14230990..f1123ee6 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/1024.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/1024.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/120-2.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/120-2.png index 6b3fabed..b443e1f0 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/120-2.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/120-2.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/120.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/120.png index 6b3fabed..b443e1f0 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/120.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/120.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/152.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/152.png index 09af21dc..f93ff0df 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/152.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/152.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/167.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/167.png index a683cf89..353ef68c 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/167.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/167.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/180.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/180.png index 38738e85..c5f608ad 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/180.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/180.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/20.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/20.png index ee5de57c..2d371726 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/20.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/20.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/29.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/29.png index 507722b4..4f7e438d 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/29.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/29.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/40-2.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/40-2.png index 7c7f5f79..81545403 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/40-2.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/40-2.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/40-3.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/40-3.png index 7c7f5f79..81545403 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/40-3.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/40-3.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/40.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/40.png index 7c7f5f79..81545403 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/40.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/40.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/58-2.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/58-2.png index fa83f61e..8aa4e412 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/58-2.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/58-2.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/58.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/58.png index fa83f61e..8aa4e412 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/58.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/58.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/60.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/60.png index 28b44b2c..92b98a18 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/60.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/60.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/76.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/76.png index 49da770c..48214f9b 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/76.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/76.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/80-2.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/80-2.png index b4afe933..eed7897c 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/80-2.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/80-2.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/80.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/80.png index b4afe933..eed7897c 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/80.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/80.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/87.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/87.png index ed08cd58..656a7d45 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/87.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/87.png differ diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index a140dcc1..59ba6337 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -23,23 +23,23 @@ LSRequiresIPhoneOS NSAppleMusicUsageDescription - We don't access apple music + We don't access apple music NSBonjourServices _dartobservatory._tcp NSCalendarsUsageDescription - We don't access your calendar + We don't access your calendar NSContactsUsageDescription - We don't access your contacts + We don't access your contacts NSLocationAlwaysUsageDescription - We don't use location data + We don't use location data NSLocationWhenInUseUsageDescription - We don't use location data + We don't use location data NSMotionUsageDescription - We don't access motion + We don't access motion NSSpeechRecognitionUsageDescription - We don't access speech recognition + We don't access speech recognition UIBackgroundModes fetch @@ -63,5 +63,9 @@ UIViewControllerBasedStatusBarAppearance + BGTaskSchedulerPermittedIdentifiers + + it.notifi.notifi + diff --git a/ios/fastlane/Fastfile b/ios/fastlane/Fastfile index be6b5058..5897ecb7 100644 --- a/ios/fastlane/Fastfile +++ b/ios/fastlane/Fastfile @@ -10,36 +10,62 @@ # https://docs.fastlane.tools/plugins/available-plugins #edit_items.append(EditItem(link_id=link_id, product_id=str(product_id_tag["id"]))) -# Uncomment the line if you want fastlane to automatically update itself -# update_fastlane +update_fastlane default_platform(:ios) +cocoapods( + clean_install: true, +) platform :ios do desc "Upload build to test flight" lane :tfdeploy do - build_ios_app( - export_method: "app-store", - export_options: { - provisioningProfiles: { - "it.notifi.notifi" => "iOS App Store" - } - } + + create_keychain( + name: "kc", + password: "p4ssword", + default_keychain: false, + unlock: true, + timeout: 3600, + lock_when_sleeps: false + ) + + app_store_connect_api_key( + key_id: "MK4628AYTK", + issuer_id: "69a6de80-d5bc-47e3-e053-5b8c7c11a4d1", + key_filepath: "../AuthKey_MK4628AYTK.p8", + duration: 1200 + ) + + match(type: "development", readonly: true, keychain_name: "kc", keychain_password: "p4ssword") + match(type: "appstore", readonly: true, keychain_name: "kc", keychain_password: "p4ssword") + + build_app( + workspace: "Runner.xcworkspace", + export_method: "app-store", + xcargs: { + PROVISIONING_PROFILE_SPECIFIER: ENV["sigh_it.notifi.notifi_appstore"] + } ) upload_to_testflight end desc "Upload build to app store" lane :asdeploy do - get_push_certificate + + app_store_connect_api_key( + key_id: "MK4628AYTK", + issuer_id: "69a6de80-d5bc-47e3-e053-5b8c7c11a4d1", + key_filepath: "../AuthKey_MK4628AYTK.p8", + duration: 1200, + ) + + match("appstore") + build_ios_app( - export_method: "app-store", - export_options: { - provisioningProfiles: { - "it.notifi.notifi" => "iOS App Store" - } - } + export_method: "app-store" ) + upload_to_app_store end end diff --git a/ios/fastlane/Matchfile b/ios/fastlane/Matchfile new file mode 100644 index 00000000..e08ae512 --- /dev/null +++ b/ios/fastlane/Matchfile @@ -0,0 +1,13 @@ +git_url("https://github.com/maxisme/match") + +storage_mode("git") + +type("development") # The default type, can be: appstore, adhoc, enterprise or development + +# app_identifier(["tools.fastlane.app", "tools.fastlane.app2"]) +# username("user@fastlane.tools") # 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/lib/notifications/notifications_table.dart b/lib/notifications/notifications_table.dart index e88458db..a9340526 100644 --- a/lib/notifications/notifications_table.dart +++ b/lib/notifications/notifications_table.dart @@ -1,3 +1,5 @@ +import 'dart:io'; + import 'package:flutter/cupertino.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; @@ -11,6 +13,7 @@ import 'package:notifi/utils/icons.dart'; import 'package:notifi/utils/pallete.dart'; import 'package:notifi/utils/utils.dart'; import 'package:provider/provider.dart'; +import 'package:share/share.dart'; import 'package:toast/toast.dart'; class NotificationTable extends StatefulWidget { @@ -96,9 +99,13 @@ class NotificationTableState extends State Container(padding: const EdgeInsets.only(top: 20.0)), SelectableText(credentials, textAlign: TextAlign.center, onTap: () { - Clipboard.setData(ClipboardData(text: credentials)); - Toast.show('Copied $credentials', context, - gravity: Toast.BOTTOM); + if (Platform.isIOS) { + Share.share('notifi credentials: $credentials'); + } else { + Clipboard.setData(ClipboardData(text: credentials)); + Toast.show('Copied $credentials', context, + gravity: Toast.BOTTOM); + } }, style: const TextStyle( color: MyColour.red, fontWeight: FontWeight.w900)) diff --git a/lib/notifications/notifis.dart b/lib/notifications/notifis.dart index 6ace7a51..ee28ef99 100644 --- a/lib/notifications/notifis.dart +++ b/lib/notifications/notifis.dart @@ -50,6 +50,10 @@ class Notifications extends ChangeNotifier { MenuBarIcon.set('grey'); } + if (canBadge) { + FlutterAppBadger.updateBadgeCount(cnt); + } + return cnt; } diff --git a/lib/screens/settings.dart b/lib/screens/settings.dart index 7829ae91..db2ba403 100644 --- a/lib/screens/settings.dart +++ b/lib/screens/settings.dart @@ -13,9 +13,10 @@ import 'package:notifi/screens/utils/appbar_title.dart'; import 'package:notifi/user.dart'; import 'package:notifi/utils/icons.dart'; import 'package:notifi/utils/pallete.dart'; -import 'package:notifi/utils/version.dart'; import 'package:notifi/utils/utils.dart'; +import 'package:notifi/utils/version.dart'; import 'package:provider/provider.dart'; +import 'package:share/share.dart'; import 'package:toast/toast.dart'; import 'package:url_launcher/url_launcher.dart'; @@ -77,21 +78,29 @@ class SettingsScreenState extends State { Consumer( builder: (BuildContext context, User user, Widget child) { final String credentials = user.getCredentials(); + + SettingOption credentialsSettingWidget = SettingOption( + 'Copy Credentials $credentials', Akaricons.clipboard, + onTapCallback: () { + Clipboard.setData(ClipboardData(text: credentials)); + showToast('Copied $credentials', context, gravity: Toast.CENTER); + }); + if (Platform.isIOS) { + credentialsSettingWidget = SettingOption( + 'Share Credentials $credentials', Akaricons.clipboard, + onTapCallback: () { + Share.share('notifi credentials: $credentials'); + }); + } + return Column(children: [ Container(padding: const EdgeInsets.only(top: 20.0)), - if (credentials != null) - SettingOption( - 'How Do I Receive Notifications?', Akaricons.question, - onTapCallback: () async { - await openUrl('https://notifi.it?c=$credentials#how-to'); - }), SettingOption( - 'Copy Credentials $credentials', Akaricons.clipboard, - onTapCallback: () { - Clipboard.setData(ClipboardData(text: credentials)); - showToast('Copied $credentials', context, - gravity: Toast.CENTER); - }) + 'How Do I Receive Notifications?', Akaricons.question, + onTapCallback: () async { + await openUrl('https://notifi.it?c=$credentials#how-to'); + }), + credentialsSettingWidget ]); }), SettingOption('Create New Credentials', Akaricons.arrowClockwise, @@ -247,7 +256,7 @@ class SettingOption extends StatelessWidget { Widget setting; if (switchCallback == null) { setting = Container( - padding: const EdgeInsets.only(left: 15, right: 15, top: 10), + padding: const EdgeInsets.only(top: 10), child: ElevatedButton( style: ButtonStyle( backgroundColor: MaterialStateProperty.all(MyColour.offWhite), diff --git a/logo/Your_App_Icon.psd b/logo/Your_App_Icon.psd index 473d7617..2aca6e6f 100644 Binary files a/logo/Your_App_Icon.psd and b/logo/Your_App_Icon.psd differ diff --git a/logo/after-ps-save.sh b/logo/after-ps-save.sh index 0ec44a51..e7c7de1d 100644 --- a/logo/after-ps-save.sh +++ b/logo/after-ps-save.sh @@ -5,7 +5,9 @@ mv Your_App_Icon-assets/menu.png ../macos/Runner/Assets.xcassets/menu_icon.image mv Your_App_Icon-assets/menu_red.png ../macos/Runner/Assets.xcassets/red_menu_icon.imageset/ # ios +# brew install imagemagick mv Your_App_Icon-assets/AppIcon.appiconset/* ../ios/Runner/Assets.xcassets/AppIcon.appiconset/ +(cd ../ios/Runner/Assets.xcassets/AppIcon.appiconset/ && for file in *.png; do convert -flatten -alpha deactivate $file $file; done) # flutter mv Your_App_Icon-assets/sad.png ../images/ diff --git a/macos/Runner.xcodeproj/project.pbxproj b/macos/Runner.xcodeproj/project.pbxproj index fe6f2d5a..d3e2eafa 100644 --- a/macos/Runner.xcodeproj/project.pbxproj +++ b/macos/Runner.xcodeproj/project.pbxproj @@ -426,16 +426,18 @@ CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Manual; COMBINE_HIDPI_IMAGES = YES; - DEVELOPMENT_TEAM = Z28DW76Y3W; - ENABLE_HARDENED_RUNTIME = YES; + CURRENT_PROJECT_VERSION = 0.1.1; + DEVELOPMENT_TEAM = ""; + ENABLE_HARDENED_RUNTIME = NO; INFOPLIST_FILE = Runner/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.11; + MARKETING_VERSION = 0.1.1; PRODUCT_BUNDLE_IDENTIFIER = it.notifi.notifi; - PROVISIONING_PROFILE_SPECIFIER = "it.notifi.notifi AppStore"; + PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_VERSION = 5.0; }; name = Profile; @@ -527,9 +529,10 @@ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; - CODE_SIGN_IDENTITY = "-"; + CODE_SIGN_IDENTITY = ""; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_HARDENED_RUNTIME = YES; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -557,16 +560,18 @@ CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Manual; COMBINE_HIDPI_IMAGES = YES; - DEVELOPMENT_TEAM = Z28DW76Y3W; - ENABLE_HARDENED_RUNTIME = YES; + CURRENT_PROJECT_VERSION = 0.1.1; + DEVELOPMENT_TEAM = ""; + ENABLE_HARDENED_RUNTIME = NO; INFOPLIST_FILE = Runner/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.11; + MARKETING_VERSION = 0.1.1; PRODUCT_BUNDLE_IDENTIFIER = it.notifi.notifi; - PROVISIONING_PROFILE_SPECIFIER = "it.notifi.notifi AppStore"; + PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; }; @@ -582,15 +587,18 @@ CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Manual; COMBINE_HIDPI_IMAGES = YES; - DEVELOPMENT_TEAM = Z28DW76Y3W; + CURRENT_PROJECT_VERSION = 0.1.1; + DEVELOPMENT_TEAM = ""; + ENABLE_HARDENED_RUNTIME = YES; INFOPLIST_FILE = Runner/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.11; + MARKETING_VERSION = 0.1.1; PRODUCT_BUNDLE_IDENTIFIER = it.notifi.notifi; - PROVISIONING_PROFILE_SPECIFIER = "it.notifi.notifi AppStore"; + PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_VERSION = 5.0; }; name = Release; diff --git a/macos/Runner/AnimateMenuIcon.swift b/macos/Runner/AnimateMenuIcon.swift index f52fbba9..b52382a6 100644 --- a/macos/Runner/AnimateMenuIcon.swift +++ b/macos/Runner/AnimateMenuIcon.swift @@ -29,6 +29,7 @@ class Animater { @objc func _animateBell() { let icon = NSImage(named: .red) icon?.size = menuImageSize + icon?.isTemplate = false let angle = String(angles.popLast() ?? "") if angle != "" { diff --git a/macos/Runner/AppDelegate.swift b/macos/Runner/AppDelegate.swift index 0b1340df..39d04907 100644 --- a/macos/Runner/AppDelegate.swift +++ b/macos/Runner/AppDelegate.swift @@ -22,7 +22,6 @@ class AppDelegate: FlutterAppDelegate { if let button = statusBarItem.button { let image = NSImage(named: .red) - image?.isTemplate = true image?.size = menuImageSize button.image = image button.action = #selector(togglePopover(_:)) @@ -41,10 +40,13 @@ class AppDelegate: FlutterAppDelegate { switch call.method { case "red_menu_icon": menu_image = NSImage(named: .red) + menu_image?.isTemplate = false case "grey_menu_icon": menu_image = NSImage(named: .grey) + menu_image?.isTemplate = true case "error_menu_icon": menu_image = NSImage(named: .error) + menu_image?.isTemplate = true case "animate": if let button = self.statusBarItem.button { if menuBarAnimater != nil { @@ -66,7 +68,6 @@ class AppDelegate: FlutterAppDelegate { if (menu_image != nil) { if let button = statusBarItem.button { menu_image?.size = menuImageSize - menu_image?.isTemplate = true button.image = menu_image result(0) // success } diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/128.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/128.png index bab1f592..0826fe2d 100644 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/128.png and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/128.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/128@2x.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/128@2x.png index faab2290..e68f9f6b 100644 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/128@2x.png and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/128@2x.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/16.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/16.png index 3c51fbe0..9da6f4ef 100644 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/16.png and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/16.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/16@2x.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/16@2x.png index 9d8e60e2..c8b0ed59 100644 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/16@2x.png and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/16@2x.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/256.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/256.png index faab2290..e68f9f6b 100644 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/256.png and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/256.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/256@2x.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/256@2x.png index 1591d68f..57ef9412 100644 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/256@2x.png and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/256@2x.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/32.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/32.png index 9d8e60e2..c8b0ed59 100644 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/32.png and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/32.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/32@2x.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/32@2x.png index ed26e63e..d748f6ba 100644 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/32@2x.png and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/32@2x.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/512.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/512.png index 1591d68f..57ef9412 100644 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/512.png and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/512.png differ diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/512@2x.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/512@2x.png index f321fd89..8f50a9f4 100644 Binary files a/macos/Runner/Assets.xcassets/AppIcon.appiconset/512@2x.png and b/macos/Runner/Assets.xcassets/AppIcon.appiconset/512@2x.png differ diff --git a/macos/Runner/Assets.xcassets/menu_error_icon.imageset/error_menu.png b/macos/Runner/Assets.xcassets/menu_error_icon.imageset/error_menu.png index 5dda2e37..37724fc9 100644 Binary files a/macos/Runner/Assets.xcassets/menu_error_icon.imageset/error_menu.png and b/macos/Runner/Assets.xcassets/menu_error_icon.imageset/error_menu.png differ diff --git a/macos/Runner/Assets.xcassets/menu_icon.imageset/menu.png b/macos/Runner/Assets.xcassets/menu_icon.imageset/menu.png index d1e18370..a7306fbd 100644 Binary files a/macos/Runner/Assets.xcassets/menu_icon.imageset/menu.png and b/macos/Runner/Assets.xcassets/menu_icon.imageset/menu.png differ diff --git a/macos/Runner/Assets.xcassets/red_menu_icon.imageset/menu_red.png b/macos/Runner/Assets.xcassets/red_menu_icon.imageset/menu_red.png index 2d639584..81dc6cd0 100644 Binary files a/macos/Runner/Assets.xcassets/red_menu_icon.imageset/menu_red.png and b/macos/Runner/Assets.xcassets/red_menu_icon.imageset/menu_red.png differ diff --git a/macos/Runner/Info.plist b/macos/Runner/Info.plist index a7d3ded3..5d37d88c 100644 --- a/macos/Runner/Info.plist +++ b/macos/Runner/Info.plist @@ -17,9 +17,9 @@ CFBundlePackageType APPL CFBundleShortVersionString - $(FLUTTER_BUILD_NAME) + $(MARKETING_VERSION) CFBundleVersion - $(FLUTTER_BUILD_NUMBER) + $(CURRENT_PROJECT_VERSION) LSApplicationCategoryType public.app-category.developer-tools LSMinimumSystemVersion diff --git a/macos/Runner/Release.entitlements b/macos/Runner/Release.entitlements index 7a2230dc..c4e18f26 100644 --- a/macos/Runner/Release.entitlements +++ b/macos/Runner/Release.entitlements @@ -4,6 +4,18 @@ com.apple.security.app-sandbox + com.apple.security.cs.allow-dyld-environment-variables + + com.apple.security.cs.allow-jit + + com.apple.security.cs.allow-unsigned-executable-memory + + com.apple.security.cs.debugger + + com.apple.security.cs.disable-executable-page-protection + + com.apple.security.cs.disable-library-validation + com.apple.security.network.client com.apple.security.network.server diff --git a/macos/fastlane/Fastfile b/macos/fastlane/Fastfile index efe021e0..ce857572 100644 --- a/macos/fastlane/Fastfile +++ b/macos/fastlane/Fastfile @@ -13,22 +13,67 @@ # Uncomment the line if you want fastlane to automatically update itself # update_fastlane - +team_id("Z28DW76Y3W") default_platform(:mac) platform :mac do - desc "Upload build to test flight" + lane :keychain do + + create_keychain( + name: "kc", + password: "p4ssword", + default_keychain: false, + unlock: true, + timeout: 3600, + lock_when_sleeps: false + ) + + app_store_connect_api_key( + key_id: "MK4628AYTK", + issuer_id: "69a6de80-d5bc-47e3-e053-5b8c7c11a4d1", + key_filepath: "../AuthKey_MK4628AYTK.p8", + duration: 1200 + ) + + begin + match(type: "mac_installer_distribution", keychain_name: "kc", keychain_password: "p4ssword") + rescue => ex + UI.error(ex) + end + match(keychain_name: "kc", keychain_password: "p4ssword") + + end + + lane :build do + create_keychain( + name: "my-keychain2", + password: "p4ssword", + default_keychain: false, + unlock: true, + timeout: 3600, + lock_when_sleeps: false + ) + + app_store_connect_api_key( + key_id: "MK4628AYTK", + issuer_id: "69a6de80-d5bc-47e3-e053-5b8c7c11a4d1", + key_filepath: "../AuthKey_MK4628AYTK.p8", + duration: 1200 + ) + + match(type: "mac_installer_distribution", keychain_name: "my-keychain2", keychain_password: "p4ssword") + + # https://docs.fastlane.tools/actions/build_mac_app/ build_mac_app( - export_method: "mac-application", export_options: { - provisioningProfiles: { - "it.notifi.notifi" => "it.notifi.notifi AppStore" - } + method: "app-store", }, - output_name: "notifi.ipa" + export_team_id: CredentialsManager::AppfileConfig.try_fetch_value(:team_id) ) + + upload_to_app_store end end diff --git a/macos/fastlane/Matchfile b/macos/fastlane/Matchfile new file mode 100644 index 00000000..e08ae512 --- /dev/null +++ b/macos/fastlane/Matchfile @@ -0,0 +1,13 @@ +git_url("https://github.com/maxisme/match") + +storage_mode("git") + +type("development") # The default type, can be: appstore, adhoc, enterprise or development + +# app_identifier(["tools.fastlane.app", "tools.fastlane.app2"]) +# username("user@fastlane.tools") # 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/macos/fastlane/README.md b/macos/fastlane/README.md index 2db1cba6..eb8d3771 100644 --- a/macos/fastlane/README.md +++ b/macos/fastlane/README.md @@ -16,11 +16,16 @@ or alternatively using `brew install fastlane` # Available Actions ## Mac +### mac keychain +``` +fastlane mac keychain +``` + ### mac build ``` fastlane mac build ``` -Upload build to test flight + ---- diff --git a/plugins/url_launcher_linux/cmake_install.cmake b/plugins/url_launcher_linux/cmake_install.cmake deleted file mode 100644 index 769164b8..00000000 --- a/plugins/url_launcher_linux/cmake_install.cmake +++ /dev/null @@ -1,39 +0,0 @@ -# Install script for directory: /home/maximilian/Documents/work/notifi/linux/flutter/ephemeral/.plugin_symlinks/url_launcher_linux/linux - -# Set the install prefix -if(NOT DEFINED CMAKE_INSTALL_PREFIX) - set(CMAKE_INSTALL_PREFIX "/home/maximilian/Documents/work/notifi/bundle") -endif() -string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") - -# Set the install configuration name. -if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) - if(BUILD_TYPE) - string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" - CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") - else() - set(CMAKE_INSTALL_CONFIG_NAME "Debug") - endif() - message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") -endif() - -# Set the component getting installed. -if(NOT CMAKE_INSTALL_COMPONENT) - if(COMPONENT) - message(STATUS "Install component: \"${COMPONENT}\"") - set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") - else() - set(CMAKE_INSTALL_COMPONENT) - endif() -endif() - -# Install shared libraries without execute permission? -if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) - set(CMAKE_INSTALL_SO_NO_EXE "1") -endif() - -# Is this installation the result of a crosscompile? -if(NOT DEFINED CMAKE_CROSSCOMPILING) - set(CMAKE_CROSSCOMPILING "FALSE") -endif() - diff --git a/pubspec.lock b/pubspec.lock index 62c305d8..b5cf3c9a 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -56,14 +56,14 @@ packages: name: build_config url: "https://pub.dartlang.org" source: hosted - version: "0.4.6" + version: "0.4.7" cached_network_image: dependency: "direct main" description: name: cached_network_image url: "https://pub.dartlang.org" source: hosted - version: "2.5.0" + version: "2.5.1" characters: dependency: transitive description: @@ -236,7 +236,7 @@ packages: name: flutter_cache_manager url: "https://pub.dartlang.org" source: hosted - version: "2.1.1" + version: "2.1.2" flutter_dotenv: dependency: "direct main" description: @@ -257,7 +257,7 @@ packages: name: flutter_local_notifications url: "https://pub.dartlang.org" source: hosted - version: "4.0.1+1" + version: "4.0.1+2" flutter_local_notifications_platform_interface: dependency: transitive description: @@ -304,7 +304,7 @@ packages: name: glob url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "2.0.1" http: dependency: transitive description: @@ -346,7 +346,7 @@ packages: name: json_annotation url: "https://pub.dartlang.org" source: hosted - version: "4.0.0" + version: "4.0.1" json_serializable: dependency: "direct main" description: @@ -374,7 +374,7 @@ packages: name: logging url: "https://pub.dartlang.org" source: hosted - version: "1.0.0" + version: "1.0.1" matcher: dependency: transitive description: @@ -389,6 +389,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.3.0" + mime: + dependency: transitive + description: + name: mime + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0" nested: dependency: transitive description: @@ -430,7 +437,7 @@ packages: name: path_provider url: "https://pub.dartlang.org" source: hosted - version: "1.6.27" + version: "1.6.28" path_provider_linux: dependency: transitive description: @@ -507,7 +514,7 @@ packages: name: process url: "https://pub.dartlang.org" source: hosted - version: "4.1.0" + version: "4.2.1" provider: dependency: "direct main" description: @@ -557,6 +564,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.2.4" + share: + dependency: "direct main" + description: + name: share + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.1" sky_engine: dependency: transitive description: flutter @@ -589,7 +603,7 @@ packages: name: sqflite_common url: "https://pub.dartlang.org" source: hosted - version: "1.0.3+1" + version: "1.0.3+3" stack_trace: dependency: transitive description: @@ -736,7 +750,7 @@ packages: name: win32 url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "2.0.5" xdg_directories: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 32c7a442..9e820b20 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -45,6 +45,7 @@ dependencies: package_info: ^2.0.0 path_provider: ^1.6.27 provider: ^5.0.0 + share: ^2.0.1 sqflite: ^1.3.2+3 timeago: ^3.0.2 toast: ^0.1.5 diff --git a/test/golden-asserts/screen/settings.png b/test/golden-asserts/screen/settings.png index 8eca86a1..656f5906 100644 Binary files a/test/golden-asserts/screen/settings.png and b/test/golden-asserts/screen/settings.png differ