From 52cf298ec18cfe4358e251089bdb30393a9fb148 Mon Sep 17 00:00:00 2001 From: yangjie <168149434@qq.com> Date: Sun, 17 Nov 2024 16:00:52 +0800 Subject: [PATCH] core_location_fluttify --- .gitignore | 43 ++ CHANGELOG.md | 14 + LICENSE | 13 + README.md | 14 + android/build.gradle | 37 ++ android/gradle.properties | 4 + .../gradle/wrapper/gradle-wrapper.properties | 5 + android/settings.gradle | 1 + android/src/main/AndroidManifest.xml | 3 + .../CoreLocationFluttifyPlugin.java | 45 ++ core_location_fluttify-0.7.1.tar.gz | Bin 0 -> 55362 bytes example/.gitignore | 43 ++ example/README.md | 16 + example/android/app/build.gradle | 61 ++ .../android/app/src/debug/AndroidManifest.xml | 7 + .../android/app/src/main/AndroidManifest.xml | 31 + .../MainActivity.java | 13 + .../main/res/drawable/launch_background.xml | 12 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 544 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 442 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 721 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 1031 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 1443 bytes .../app/src/main/res/values/styles.xml | 8 + .../app/src/profile/AndroidManifest.xml | 7 + example/android/build.gradle | 29 + example/android/gradle.properties | 4 + .../gradle/wrapper/gradle-wrapper.properties | 6 + example/android/settings.gradle | 15 + example/ios/Flutter/AppFrameworkInfo.plist | 26 + example/ios/Flutter/Debug.xcconfig | 2 + example/ios/Flutter/Release.xcconfig | 2 + example/ios/Podfile | 38 ++ example/ios/Podfile.lock | 29 + example/ios/Runner.xcodeproj/project.pbxproj | 557 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/xcschemes/Runner.xcscheme | 91 +++ .../contents.xcworkspacedata | 10 + example/ios/Runner/AppDelegate.h | 6 + example/ios/Runner/AppDelegate.m | 13 + .../AppIcon.appiconset/Contents.json | 122 ++++ .../Icon-App-1024x1024@1x.png | Bin 0 -> 10932 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 564 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 1588 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 1025 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 1716 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 1920 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 1895 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 3831 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 1888 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 3294 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 3612 bytes .../LaunchImage.imageset/Contents.json | 23 + .../LaunchImage.imageset/LaunchImage.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/README.md | 5 + .../Runner/Base.lproj/LaunchScreen.storyboard | 37 ++ example/ios/Runner/Base.lproj/Main.storyboard | 26 + example/ios/Runner/Info.plist | 47 ++ example/ios/Runner/main.m | 9 + example/lib/main.dart | 24 + example/pubspec.yaml | 63 ++ example/test/widget_test.dart | 1 + ios/Classes/CLFloorHandler.h | 13 + ios/Classes/CLFloorHandler.m | 28 + ios/Classes/CLHeadingHandler.h | 15 + ios/Classes/CLHeadingHandler.m | 60 ++ ios/Classes/CLLocationCoordinate2DHandler.h | 12 + ios/Classes/CLLocationCoordinate2DHandler.m | 101 ++++ ios/Classes/CLLocationHandler.h | 13 + ios/Classes/CLLocationHandler.m | 97 +++ ios/Classes/CLLocationManagerHandler.h | 13 + ios/Classes/CLLocationManagerHandler.m | 41 ++ ios/Classes/CoreLocationFluttifyPlugin.h | 5 + ios/Classes/CoreLocationFluttifyPlugin.m | 55 ++ ios/core_location_fluttify.podspec | 27 + lib/core_location_fluttify.dart | 12 + lib/src/cl_authorization_status.dart | 18 + lib/src/cl_floor.dart | 14 + lib/src/cl_heading.dart | 24 + lib/src/cl_location.dart | 48 ++ lib/src/cl_location_coordinate_2d.dart | 69 +++ lib/src/cl_location_manager.dart | 19 + lib/src/functions.dart | 24 + lib/src/latlng.dart | 36 ++ lib/src/objects.dart | 7 + pubspec.yaml | 28 + test/core_location_fluttify_test.dart | 1 + 93 files changed, 2349 insertions(+) create mode 100644 .gitignore create mode 100644 CHANGELOG.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 android/build.gradle create mode 100644 android/gradle.properties create mode 100644 android/gradle/wrapper/gradle-wrapper.properties create mode 100644 android/settings.gradle create mode 100644 android/src/main/AndroidManifest.xml create mode 100644 android/src/main/java/me/yohom/core_location_fluttify/CoreLocationFluttifyPlugin.java create mode 100644 core_location_fluttify-0.7.1.tar.gz create mode 100644 example/.gitignore create mode 100644 example/README.md create mode 100644 example/android/app/build.gradle create mode 100644 example/android/app/src/debug/AndroidManifest.xml create mode 100644 example/android/app/src/main/AndroidManifest.xml create mode 100644 example/android/app/src/main/java/me/yohom/core_location_fluttify_example/MainActivity.java create mode 100644 example/android/app/src/main/res/drawable/launch_background.xml create mode 100644 example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 example/android/app/src/main/res/values/styles.xml create mode 100644 example/android/app/src/profile/AndroidManifest.xml create mode 100644 example/android/build.gradle create mode 100644 example/android/gradle.properties create mode 100644 example/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 example/android/settings.gradle create mode 100644 example/ios/Flutter/AppFrameworkInfo.plist create mode 100644 example/ios/Flutter/Debug.xcconfig create mode 100644 example/ios/Flutter/Release.xcconfig create mode 100644 example/ios/Podfile create mode 100644 example/ios/Podfile.lock create mode 100644 example/ios/Runner.xcodeproj/project.pbxproj create mode 100644 example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 example/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 example/ios/Runner/AppDelegate.h create mode 100644 example/ios/Runner/AppDelegate.m create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 example/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 example/ios/Runner/Base.lproj/Main.storyboard create mode 100644 example/ios/Runner/Info.plist create mode 100644 example/ios/Runner/main.m create mode 100644 example/lib/main.dart create mode 100644 example/pubspec.yaml create mode 100644 example/test/widget_test.dart create mode 100644 ios/Classes/CLFloorHandler.h create mode 100644 ios/Classes/CLFloorHandler.m create mode 100644 ios/Classes/CLHeadingHandler.h create mode 100644 ios/Classes/CLHeadingHandler.m create mode 100644 ios/Classes/CLLocationCoordinate2DHandler.h create mode 100644 ios/Classes/CLLocationCoordinate2DHandler.m create mode 100644 ios/Classes/CLLocationHandler.h create mode 100644 ios/Classes/CLLocationHandler.m create mode 100644 ios/Classes/CLLocationManagerHandler.h create mode 100644 ios/Classes/CLLocationManagerHandler.m create mode 100644 ios/Classes/CoreLocationFluttifyPlugin.h create mode 100644 ios/Classes/CoreLocationFluttifyPlugin.m create mode 100644 ios/core_location_fluttify.podspec create mode 100644 lib/core_location_fluttify.dart create mode 100644 lib/src/cl_authorization_status.dart create mode 100644 lib/src/cl_floor.dart create mode 100644 lib/src/cl_heading.dart create mode 100644 lib/src/cl_location.dart create mode 100644 lib/src/cl_location_coordinate_2d.dart create mode 100644 lib/src/cl_location_manager.dart create mode 100644 lib/src/functions.dart create mode 100644 lib/src/latlng.dart create mode 100644 lib/src/objects.dart create mode 100644 pubspec.yaml create mode 100644 test/core_location_fluttify_test.dart diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..29a3a50 --- /dev/null +++ b/.gitignore @@ -0,0 +1,43 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.pub-cache/ +.pub/ +/build/ + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..f3c62c9 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,14 @@ +## 0.2.2 +- enhance: CLAuthorizationStatus增加from和to扩展 + +## 0.2.1 +- enhance: 增加LatLng依赖, 统一使用 + +## 0.2.0 +- enhance: 提升依赖 + +## 0.1.1 +- chore: 使用static_frameworks + +## 0.1.0 +- 加入CoreLocation相关逻辑 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..12fde5f --- /dev/null +++ b/LICENSE @@ -0,0 +1,13 @@ +Copyright 2020 yohom + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..be0ff96 --- /dev/null +++ b/README.md @@ -0,0 +1,14 @@ +# core_location_fluttify + +A new Flutter project. + +## Getting Started + +This project is a starting point for a Flutter +[plug-in package](https://flutter.dev/developing-packages/), +a specialized package that includes platform-specific implementation code for +Android and/or iOS. + +For help getting started with Flutter, view our +[online documentation](https://flutter.dev/docs), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/android/build.gradle b/android/build.gradle new file mode 100644 index 0000000..0d14f0d --- /dev/null +++ b/android/build.gradle @@ -0,0 +1,37 @@ +group 'me.yohom.core_location_fluttify' +version '1.0' + +buildscript { + repositories { + google() + mavenCentral() + } + + dependencies { + classpath 'com.android.tools.build:gradle:7.1.2' + } +} + +rootProject.allprojects { + repositories { + google() + mavenCentral() + } +} + +apply plugin: 'com.android.library' + +android { + if (project.android.hasProperty("namespace")) { + namespace = "me.yohom.core_location_fluttify" + } + compileSdkVersion 31 + + defaultConfig { + minSdkVersion 16 + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + lintOptions { + disable 'InvalidPackage' + } +} diff --git a/android/gradle.properties b/android/gradle.properties new file mode 100644 index 0000000..38c8d45 --- /dev/null +++ b/android/gradle.properties @@ -0,0 +1,4 @@ +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 new file mode 100644 index 0000000..cb24abd --- /dev/null +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-all.zip diff --git a/android/settings.gradle b/android/settings.gradle new file mode 100644 index 0000000..828c2eb --- /dev/null +++ b/android/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'core_location_fluttify' diff --git a/android/src/main/AndroidManifest.xml b/android/src/main/AndroidManifest.xml new file mode 100644 index 0000000..0f801d3 --- /dev/null +++ b/android/src/main/AndroidManifest.xml @@ -0,0 +1,3 @@ + + diff --git a/android/src/main/java/me/yohom/core_location_fluttify/CoreLocationFluttifyPlugin.java b/android/src/main/java/me/yohom/core_location_fluttify/CoreLocationFluttifyPlugin.java new file mode 100644 index 0000000..03003fc --- /dev/null +++ b/android/src/main/java/me/yohom/core_location_fluttify/CoreLocationFluttifyPlugin.java @@ -0,0 +1,45 @@ +package me.yohom.core_location_fluttify; + +import androidx.annotation.NonNull; +import io.flutter.embedding.engine.plugins.FlutterPlugin; +import io.flutter.plugin.common.MethodCall; +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; + +/** CoreLocationFluttifyPlugin */ +public class CoreLocationFluttifyPlugin implements FlutterPlugin, MethodCallHandler { + @Override + public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) { + final MethodChannel channel = new MethodChannel(flutterPluginBinding.getFlutterEngine().getDartExecutor(), "core_location_fluttify"); + channel.setMethodCallHandler(new CoreLocationFluttifyPlugin()); + } + + // 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(), "core_location_fluttify"); + channel.setMethodCallHandler(new CoreLocationFluttifyPlugin()); + } + + @Override + public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) { + if (call.method.equals("getPlatformVersion")) { + result.success("Android " + android.os.Build.VERSION.RELEASE); + } else { + result.notImplemented(); + } + } + + @Override + public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) { + } +} diff --git a/core_location_fluttify-0.7.1.tar.gz b/core_location_fluttify-0.7.1.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..877c1090cf73e8fa6eca8391f775d225ff6918ea GIT binary patch literal 55362 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

iN&T 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 H00IL5_78!S literal 0 HcmV?d00001 diff --git a/example/.gitignore b/example/.gitignore new file mode 100644 index 0000000..29a3a50 --- /dev/null +++ b/example/.gitignore @@ -0,0 +1,43 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.pub-cache/ +.pub/ +/build/ + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/example/README.md b/example/README.md new file mode 100644 index 0000000..53bf80f --- /dev/null +++ b/example/README.md @@ -0,0 +1,16 @@ +# core_location_fluttify_example + +Demonstrates how to use the core_location_fluttify plugin. + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook) + +For help getting started with Flutter, view our +[online documentation](https://flutter.dev/docs), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle new file mode 100644 index 0000000..479836c --- /dev/null +++ b/example/android/app/build.gradle @@ -0,0 +1,61 @@ +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 from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" + +android { + compileSdkVersion flutter.compileSdkVersion + + lintOptions { + disable 'InvalidPackage' + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "me.yohom.core_location_fluttify_example" + minSdkVersion 16 + targetSdkVersion flutter.targetSdkVersion + 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 { + 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 new file mode 100644 index 0000000..c608544 --- /dev/null +++ b/example/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/example/android/app/src/main/AndroidManifest.xml b/example/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..b52940b --- /dev/null +++ b/example/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + diff --git a/example/android/app/src/main/java/me/yohom/core_location_fluttify_example/MainActivity.java b/example/android/app/src/main/java/me/yohom/core_location_fluttify_example/MainActivity.java new file mode 100644 index 0000000..f4cd7b2 --- /dev/null +++ b/example/android/app/src/main/java/me/yohom/core_location_fluttify_example/MainActivity.java @@ -0,0 +1,13 @@ +package me.yohom.core_location_fluttify_example; + +import androidx.annotation.NonNull; +import io.flutter.embedding.android.FlutterActivity; +import io.flutter.embedding.engine.FlutterEngine; +import io.flutter.plugins.GeneratedPluginRegistrant; + +public class MainActivity extends FlutterActivity { + @Override + public void 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 new file mode 100644 index 0000000..304732f --- /dev/null +++ b/example/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + 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 new file mode 100644 index 0000000000000000000000000000000000000000..db77bb4b7b0906d62b1847e87f15cdcacf6a4f29 GIT binary patch literal 544 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8bpbvhu0Wd6uZuB!w&u2PAxD2eNXD>P5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..17987b79bb8a35cc66c3c1fd44f5a5526c1b78be GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xx&nMcT!A!W`0S9QKQy;}1Cl^CgaH=;G9cpY;r$Q>i*pfB zP2drbID<_#qf;rPZx^FqH)F_D#*k@@q03KywUtLX8Ua?`H+NMzkczFPK3lFz@i_kW%1NOn0|D2I9n9wzH8m|-tHjsw|9>@K=iMBhxvkv6m8Y-l zytQ?X=U+MF$@3 zt`~i=@j|6y)RWMK--}M|=T`o&^Ni>IoWKHEbBXz7?A@mgWoL>!*SXo`SZH-*HSdS+ yn*9;$7;m`l>wYBC5bq;=U}IMqLzqbYCidGC!)_gkIk_C@Uy!y&wkt5C($~2D>~)O*cj@FGjOCM)M>_ixfudOh)?xMu#Fs z#}Y=@YDTwOM)x{K_j*Q;dPdJ?Mz0n|pLRx{4n|)f>SXlmV)XB04CrSJn#dS5nK2lM zrZ9#~WelCp7&e13Y$jvaEXHskn$2V!!DN-nWS__6T*l;H&Fopn?A6HZ-6WRLFP=R` zqG+CE#d4|IbyAI+rJJ`&x9*T`+a=p|0O(+s{UBcyZdkhj=yS1>AirP+0R;mf2uMgM zC}@~JfByORAh4SyRgi&!(cja>F(l*O+nd+@4m$|6K6KDn_&uvCpV23&>G9HJp{xgg zoq1^2_p9@|WEo z*X_Uko@K)qYYv~>43eQGMdbiGbo>E~Q& zrYBH{QP^@Sti!`2)uG{irBBq@y*$B zi#&(U-*=fp74j)RyIw49+0MRPMRU)+a2r*PJ$L5roHt2$UjExCTZSbq%V!HeS7J$N zdG@vOZB4v_lF7Plrx+hxo7(fCV&}fHq)$ literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..d5f1c8d34e7a88e3f88bea192c3a370d44689c3c GIT binary patch literal 1031 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..4d6372eebdb28e45604e46eeda8dd24651419bc0 GIT binary patch literal 1443 zcmb`G{WsKk6vsdJTdFg%tJav9_E4vzrOaqkWF|A724Nly!y+?N9`YV6wZ}5(X(D_N(?!*n3`|_r0Hc?=PQw&*vnU?QTFY zB_MsH|!j$PP;I}?dppoE_gA(4uc!jV&0!l7_;&p2^pxNo>PEcNJv za5_RT$o2Mf!<+r?&EbHH6nMoTsDOa;mN(wv8RNsHpG)`^ymG-S5By8=l9iVXzN_eG%Xg2@Xeq76tTZ*dGh~Lo9vl;Zfs+W#BydUw zCkZ$o1LqWQO$FC9aKlLl*7x9^0q%0}$OMlp@Kk_jHXOjofdePND+j!A{q!8~Jn+s3 z?~~w@4?egS02}8NuulUA=L~QQfm;MzCGd)XhiftT;+zFO&JVyp2mBww?;QByS_1w! zrQlx%{^cMj0|Bo1FjwY@Q8?Hx0cIPF*@-ZRFpPc#bBw{5@tD(5%sClzIfl8WU~V#u zm5Q;_F!wa$BSpqhN>W@2De?TKWR*!ujY;Yylk_X5#~V!L*Gw~;$%4Q8~Mad z@`-kG?yb$a9cHIApZDVZ^U6Xkp<*4rU82O7%}0jjHlK{id@?-wpN*fCHXyXh(bLt* zPc}H-x0e4E&nQ>y%B-(EL=9}RyC%MyX=upHuFhAk&MLbsF0LP-q`XnH78@fT+pKPW zu72MW`|?8ht^tz$iC}ZwLp4tB;Q49K!QCF3@!iB1qOI=?w z7In!}F~ij(18UYUjnbmC!qKhPo%24?8U1x{7o(+?^Zu0Hx81|FuS?bJ0jgBhEMzf< zCgUq7r2OCB(`XkKcN-TL>u5y#dD6D!)5W?`O5)V^>jb)P)GBdy%t$uUMpf$SNV31$ zb||OojAbvMP?T@$h_ZiFLFVHDmbyMhJF|-_)HX3%m=CDI+ID$0^C>kzxprBW)hw(v zr!Gmda);ICoQyhV_oP5+C%?jcG8v+D@9f?Dk*!BxY}dazmrT@64UrP3hlslANK)bq z$67n83eh}OeW&SV@HG95P|bjfqJ7gw$e+`Hxo!4cx`jdK1bJ>YDSpGKLPZ^1cv$ek zIB?0S<#tX?SJCLWdMd{-ME?$hc7A$zBOdIJ)4!KcAwb=VMov)nK;9z>x~rfT1>dS+ zZ6#`2v@`jgbqq)P22H)Tx2CpmM^o1$B+xT6`(v%5xJ(?j#>Q$+rx_R|7TzDZe{J6q zG1*EcU%tE?!kO%^M;3aM6JN*LAKUVb^xz8-Pxo#jR5(-KBeLJvA@-gxNHx0M-ZJLl z;#JwQoh~9V?`UVo#}{6ka@II>++D@%KqGpMdlQ}?9E*wFcf5(#XQnP$Dk5~%iX^>f z%$y;?M0BLp{O3a(-4A?ewryHrrD%cx#Q^%KY1H zNre$ve+vceSLZcNY4U(RBX&)oZn*Py()h)XkE?PL$!bNb{N5FVI2Y%LKEm%yvpyTP z(1P?z~7YxD~Rf<(a@_y` literal 0 HcmV?d00001 diff --git a/example/android/app/src/main/res/values/styles.xml b/example/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..00fa441 --- /dev/null +++ b/example/android/app/src/main/res/values/styles.xml @@ -0,0 +1,8 @@ + + + + diff --git a/example/android/app/src/profile/AndroidManifest.xml b/example/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 0000000..c608544 --- /dev/null +++ b/example/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/example/android/build.gradle b/example/android/build.gradle new file mode 100644 index 0000000..128d1dc --- /dev/null +++ b/example/android/build.gradle @@ -0,0 +1,29 @@ +buildscript { + repositories { + google() + jcenter() + } + + dependencies { + classpath 'com.android.tools.build:gradle:7.1.2' + } +} + +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 new file mode 100644 index 0000000..38c8d45 --- /dev/null +++ b/example/android/gradle.properties @@ -0,0 +1,4 @@ +org.gradle.jvmargs=-Xmx1536M +android.enableR8=true +android.useAndroidX=true +android.enableJetifier=true diff --git a/example/android/gradle/wrapper/gradle-wrapper.properties b/example/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..cc5527d --- /dev/null +++ b/example/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#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-7.4-all.zip diff --git a/example/android/settings.gradle b/example/android/settings.gradle new file mode 100644 index 0000000..5a2f14f --- /dev/null +++ b/example/android/settings.gradle @@ -0,0 +1,15 @@ +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/ios/Flutter/AppFrameworkInfo.plist b/example/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 0000000..f2872cf --- /dev/null +++ b/example/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + 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 + 9.0 + + diff --git a/example/ios/Flutter/Debug.xcconfig b/example/ios/Flutter/Debug.xcconfig new file mode 100644 index 0000000..e8efba1 --- /dev/null +++ b/example/ios/Flutter/Debug.xcconfig @@ -0,0 +1,2 @@ +#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 new file mode 100644 index 0000000..399e934 --- /dev/null +++ b/example/ios/Flutter/Release.xcconfig @@ -0,0 +1,2 @@ +#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "Generated.xcconfig" diff --git a/example/ios/Podfile b/example/ios/Podfile new file mode 100644 index 0000000..f7d6a5e --- /dev/null +++ b/example/ios/Podfile @@ -0,0 +1,38 @@ +# 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 + 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 new file mode 100644 index 0000000..8324f37 --- /dev/null +++ b/example/ios/Podfile.lock @@ -0,0 +1,29 @@ +PODS: + - core_location_fluttify (0.0.1): + - Flutter + - foundation_fluttify + - Flutter (1.0.0) + - foundation_fluttify (0.0.1): + - Flutter + +DEPENDENCIES: + - core_location_fluttify (from `.symlinks/plugins/core_location_fluttify/ios`) + - Flutter (from `Flutter`) + - foundation_fluttify (from `.symlinks/plugins/foundation_fluttify/ios`) + +EXTERNAL SOURCES: + core_location_fluttify: + :path: ".symlinks/plugins/core_location_fluttify/ios" + Flutter: + :path: Flutter + foundation_fluttify: + :path: ".symlinks/plugins/foundation_fluttify/ios" + +SPEC CHECKSUMS: + core_location_fluttify: 9466a411ea7d22c6349c7e6a767ae4623f01eb1d + Flutter: 50d75fe2f02b26cc09d224853bb45737f8b3214a + foundation_fluttify: 0c45145e3fad1fb99188e4979daed5b24cd9b278 + +PODFILE CHECKSUM: 8e679eca47255a8ca8067c4c67aab20e64cb974d + +COCOAPODS: 1.11.3 diff --git a/example/ios/Runner.xcodeproj/project.pbxproj b/example/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000..20d7354 --- /dev/null +++ b/example/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,557 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; }; + 97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; }; + 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 */; }; + AC2002C8DBE1418FFA69010E /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7FFBD588E04AAE11C10FB004 /* libPods-Runner.a */; }; +/* 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 = ""; }; + 26B46E29A598941486A9F096 /* 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 = ""; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 704ED2183BE6AD8629ACCCE0 /* 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 = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + 7FFBD588E04AAE11C10FB004 /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 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; }; + 97C146F21CF9000F007C117D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 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 = ""; }; + A91F1DDC123D3764D5BE712B /* 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 = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + AC2002C8DBE1418FFA69010E /* libPods-Runner.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 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 */, + ED2ADD548BCA13F5C161F969 /* Pods */, + C8F8BC98647B2FA171955DC1 /* Frameworks */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */, + 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */, + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 97C146F11CF9000F007C117D /* Supporting Files */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + ); + path = Runner; + sourceTree = ""; + }; + 97C146F11CF9000F007C117D /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 97C146F21CF9000F007C117D /* main.m */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + C8F8BC98647B2FA171955DC1 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 7FFBD588E04AAE11C10FB004 /* libPods-Runner.a */, + ); + name = Frameworks; + sourceTree = ""; + }; + ED2ADD548BCA13F5C161F969 /* Pods */ = { + isa = PBXGroup; + children = ( + A91F1DDC123D3764D5BE712B /* Pods-Runner.debug.xcconfig */, + 26B46E29A598941486A9F096 /* Pods-Runner.release.xcconfig */, + 704ED2183BE6AD8629ACCCE0 /* Pods-Runner.profile.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + DAF825A30C6114412FA6E597 /* [CP] Check Pods Manifest.lock */, + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + ); + 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 = 1300; + ORGANIZATIONNAME = "The Chromium Authors"; + TargetAttributes = { + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + DevelopmentTeam = XMYYSUEEKB; + }; + }; + }; + 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"; + }; + 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"; + }; + DAF825A30C6114412FA6E597 /* [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 = ( + 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */, + 97C146F31CF9000F007C117D /* main.m 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 = 9.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; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = XMYYSUEEKB; + 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 = me.yohom.coreLocationFluttifyExample; + PRODUCT_NAME = "$(TARGET_NAME)"; + 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 = 9.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 = 9.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = XMYYSUEEKB; + 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 = me.yohom.coreLocationFluttifyExample; + PRODUCT_NAME = "$(TARGET_NAME)"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = XMYYSUEEKB; + 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 = me.yohom.coreLocationFluttifyExample; + PRODUCT_NAME = "$(TARGET_NAME)"; + 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 new file mode 100644 index 0000000..919434a --- /dev/null +++ b/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000..3db53b6 --- /dev/null +++ b/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/example/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..21a3cc1 --- /dev/null +++ b/example/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/example/ios/Runner/AppDelegate.h b/example/ios/Runner/AppDelegate.h new file mode 100644 index 0000000..36e21bb --- /dev/null +++ b/example/ios/Runner/AppDelegate.h @@ -0,0 +1,6 @@ +#import +#import + +@interface AppDelegate : FlutterAppDelegate + +@end diff --git a/example/ios/Runner/AppDelegate.m b/example/ios/Runner/AppDelegate.m new file mode 100644 index 0000000..70e8393 --- /dev/null +++ b/example/ios/Runner/AppDelegate.m @@ -0,0 +1,13 @@ +#import "AppDelegate.h" +#import "GeneratedPluginRegistrant.h" + +@implementation AppDelegate + +- (BOOL)application:(UIApplication *)application + didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + [GeneratedPluginRegistrant registerWithRegistry:self]; + // Override point for customization after application launch. + return [super application:application didFinishLaunchingWithOptions:launchOptions]; +} + +@end diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..d36b1fa --- /dev/null +++ b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,122 @@ +{ + "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 new file mode 100644 index 0000000000000000000000000000000000000000..dc9ada4725e9b0ddb1deab583e5b5102493aa332 GIT binary patch literal 10932 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 literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..f091b6b0bca859a3f474b03065bef75ba58a9e4c GIT binary patch literal 1588 zcmV-42Fv-0P)C1SqPt}wig>|5Crh^=oyX$BK<}M8eLU3e2hGT;=G|!_SP)7zNI6fqUMB=)y zRAZ>eDe#*r`yDAVgB_R*LB*MAc)8(b{g{9McCXW!lq7r(btRoB9!8B-#AI6JMb~YFBEvdsV)`mEQO^&#eRKx@b&x- z5lZm*!WfD8oCLzfHGz#u7sT0^VLMI1MqGxF^v+`4YYnVYgk*=kU?HsSz{v({E3lb9 z>+xILjBN)t6`=g~IBOelGQ(O990@BfXf(DRI5I$qN$0Gkz-FSc$3a+2fX$AedL4u{ z4V+5Ong(9LiGcIKW?_352sR;LtDPmPJXI{YtT=O8=76o9;*n%_m|xo!i>7$IrZ-{l z-x3`7M}qzHsPV@$v#>H-TpjDh2UE$9g6sysUREDy_R(a)>=eHw-WAyfIN z*qb!_hW>G)Tu8nSw9yn#3wFMiLcfc4pY0ek1}8(NqkBR@t4{~oC>ryc-h_ByH(Cg5 z>ao-}771+xE3um9lWAY1FeQFxowa1(!J(;Jg*wrg!=6FdRX+t_<%z&d&?|Bn){>zm zZQj(aA_HeBY&OC^jj*)N`8fa^ePOU72VpInJoI1?`ty#lvlNzs(&MZX+R%2xS~5Kh zX*|AU4QE#~SgPzOXe9>tRj>hjU@c1k5Y_mW*Jp3fI;)1&g3j|zDgC+}2Q_v%YfDax z!?umcN^n}KYQ|a$Lr+51Nf9dkkYFSjZZjkma$0KOj+;aQ&721~t7QUKx61J3(P4P1 zstI~7-wOACnWP4=8oGOwz%vNDqD8w&Q`qcNGGrbbf&0s9L0De{4{mRS?o0MU+nR_! zrvshUau0G^DeMhM_v{5BuLjb#Hh@r23lDAk8oF(C+P0rsBpv85EP>4CVMx#04MOfG z;P%vktHcXwTj~+IE(~px)3*MY77e}p#|c>TD?sMatC0Tu4iKKJ0(X8jxQY*gYtxsC z(zYC$g|@+I+kY;dg_dE>scBf&bP1Nc@Hz<3R)V`=AGkc;8CXqdi=B4l2k|g;2%#m& z*jfX^%b!A8#bI!j9-0Fi0bOXl(-c^AB9|nQaE`*)Hw+o&jS9@7&Gov#HbD~#d{twV zXd^Tr^mWLfFh$@Dr$e;PBEz4(-2q1FF0}c;~B5sA}+Q>TOoP+t>wf)V9Iy=5ruQa;z)y zI9C9*oUga6=hxw6QasLPnee@3^Rr*M{CdaL5=R41nLs(AHk_=Y+A9$2&H(B7!_pURs&8aNw7?`&Z&xY_Ye z)~D5Bog^td-^QbUtkTirdyK^mTHAOuptDflut!#^lnKqU md>ggs(5nOWAqO?umG&QVYK#ibz}*4>0000U6E9hRK9^#O7(mu>ETqrXGsduA8$)?`v2seloOCza43C{NQ$$gAOH**MCn0Q?+L7dl7qnbRdqZ8LSVp1ItDxhxD?t@5_yHg6A8yI zC*%Wgg22K|8E#!~cTNYR~@Y9KepMPrrB8cABapAFa=`H+UGhkXUZV1GnwR1*lPyZ;*K(i~2gp|@bzp8}og7e*#% zEnr|^CWdVV!-4*Y_7rFvlww2Ze+>j*!Z!pQ?2l->4q#nqRu9`ELo6RMS5=br47g_X zRw}P9a7RRYQ%2Vsd0Me{_(EggTnuN6j=-?uFS6j^u69elMypu?t>op*wBx<=Wx8?( ztpe^(fwM6jJX7M-l*k3kEpWOl_Vk3@(_w4oc}4YF4|Rt=2V^XU?#Yz`8(e?aZ@#li0n*=g^qOcVpd-Wbok=@b#Yw zqn8u9a)z>l(1kEaPYZ6hwubN6i<8QHgsu0oE) ziJ(p;Wxm>sf!K+cw>R-(^Y2_bahB+&KI9y^);#0qt}t-$C|Bo71lHi{_+lg#f%RFy z0um=e3$K3i6K{U_4K!EX?F&rExl^W|G8Z8;`5z-k}OGNZ0#WVb$WCpQu-_YsiqKP?BB# vzVHS-CTUF4Ozn5G+mq_~Qqto~ahA+K`|lyv3(-e}00000NkvXXu0mjfd`9t{ literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..d0ef06e7edb86cdfe0d15b4b0d98334a86163658 GIT binary patch literal 1716 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 literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..c8f9ed8f5cee1c98386d13b17e89f719e83555b2 GIT binary patch literal 1895 zcmV-t2blPYP)FQtfgmafE#=YDCq`qUBt#QpG%*H6QHY765~R=q zZ6iudfM}q!Pz#~9JgOi8QJ|DSu?1-*(kSi1K4#~5?#|rh?sS)(-JQqX*}ciXJ56_H zdw=^s_srbAdqxlvGyrgGet#6T7_|j;95sL%MtM;q86vOxKM$f#puR)Bjv9Zvz9-di zXOTSsZkM83)E9PYBXC<$6(|>lNLVBb&&6y{NByFCp%6+^ALR@NCTse_wqvNmSWI-m z!$%KlHFH2omF!>#%1l3LTZg(s7eof$7*xB)ZQ0h?ejh?Ta9fDv59+u#MokW+1t8Zb zgHv%K(u9G^Lv`lh#f3<6!JVTL3(dCpxHbnbA;kKqQyd1~^Xe0VIaYBSWm6nsr;dFj z4;G-RyL?cYgsN1{L4ZFFNa;8)Rv0fM0C(~Tkit94 zz#~A)59?QjD&pAPSEQ)p8gP|DS{ng)j=2ux)_EzzJ773GmQ_Cic%3JJhC0t2cx>|v zJcVusIB!%F90{+}8hG3QU4KNeKmK%T>mN57NnCZ^56=0?&3@!j>a>B43pi{!u z7JyDj7`6d)qVp^R=%j>UIY6f+3`+qzIc!Y_=+uN^3BYV|o+$vGo-j-Wm<10%A=(Yk^beI{t%ld@yhKjq0iNjqN4XMGgQtbKubPM$JWBz}YA65k%dm*awtC^+f;a-x4+ddbH^7iDWGg&N0n#MW{kA|=8iMUiFYvMoDY@sPC#t$55gn6ykUTPAr`a@!(;np824>2xJthS z*ZdmT`g5-`BuJs`0LVhz+D9NNa3<=6m;cQLaF?tCv8)zcRSh66*Z|vXhG@$I%U~2l z?`Q zykI#*+rQ=z6Jm=Bui-SfpDYLA=|vzGE(dYm=OC8XM&MDo7ux4UF1~0J1+i%aCUpRe zt3L_uNyQ*cE(38Uy03H%I*)*Bh=Lb^Xj3?I^Hnbeq72(EOK^Y93CNp*uAA{5Lc=ky zx=~RKa4{iTm{_>_vSCm?$Ej=i6@=m%@VvAITnigVg{&@!7CDgs908761meDK5azA} z4?=NOH|PdvabgJ&fW2{Mo$Q0CcD8Qc84%{JPYt5EiG{MdLIAeX%T=D7NIP4%Hw}p9 zg)==!2Lbp#j{u_}hMiao9=!VSyx0gHbeCS`;q&vzeq|fs`y&^X-lso(Ls@-706qmA z7u*T5PMo_w3{se1t2`zWeO^hOvTsohG_;>J0wVqVe+n)AbQCx)yh9;w+J6?NF5Lmo zecS@ieAKL8%bVd@+-KT{yI|S}O>pYckUFs;ry9Ow$CD@ztz5K-*D$^{i(_1llhSh^ zEkL$}tsQt5>QA^;QgjgIfBDmcOgi5YDyu?t6vSnbp=1+@6D& z5MJ}B8q;bRlVoxasyhcUF1+)o`&3r0colr}QJ3hcSdLu;9;td>kf@Tcn<@9sIx&=m z;AD;SCh95=&p;$r{Xz3iWCO^MX83AGJ(yH&eTXgv|0=34#-&WAmw{)U7OU9!Wz^!7 zZ%jZFi@JR;>Mhi7S>V7wQ176|FdW2m?&`qa(ScO^CFPR80HucLHOTy%5s*HR0^8)i h0WYBP*#0Ks^FNSabJA*5${_#%002ovPDHLkV1oKhTl@e3 literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..75b2d164a5a98e212cca15ea7bf2ab5de5108680 GIT binary patch literal 3831 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 literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..c4df70d39da7941ef3f6dcb7f06a192d8dcb308d GIT binary patch literal 1888 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 iW8Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 0000000..89c2725 --- /dev/null +++ b/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -0,0 +1,5 @@ +# 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 new file mode 100644 index 0000000..f2e259c --- /dev/null +++ b/example/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/example/ios/Runner/Base.lproj/Main.storyboard b/example/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 0000000..f3c2851 --- /dev/null +++ b/example/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/example/ios/Runner/Info.plist b/example/ios/Runner/Info.plist new file mode 100644 index 0000000..b6fc1a5 --- /dev/null +++ b/example/ios/Runner/Info.plist @@ -0,0 +1,47 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + core_location_fluttify_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 + + CADisableMinimumFrameDurationOnPhone + + + diff --git a/example/ios/Runner/main.m b/example/ios/Runner/main.m new file mode 100644 index 0000000..dff6597 --- /dev/null +++ b/example/ios/Runner/main.m @@ -0,0 +1,9 @@ +#import +#import +#import "AppDelegate.h" + +int main(int argc, char* argv[]) { + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } +} diff --git a/example/lib/main.dart b/example/lib/main.dart new file mode 100644 index 0000000..996abab --- /dev/null +++ b/example/lib/main.dart @@ -0,0 +1,24 @@ +import 'package:flutter/material.dart'; + +void main() => runApp(MyApp()); + +class MyApp extends StatefulWidget { + @override + _MyAppState createState() => _MyAppState(); +} + +class _MyAppState extends State { + @override + Widget build(BuildContext context) { + return MaterialApp( + home: Scaffold( + appBar: AppBar( + title: const Text('Plugin example app'), + ), + body: Center( + child: Text('Running on:\n'), + ), + ), + ); + } +} diff --git a/example/pubspec.yaml b/example/pubspec.yaml new file mode 100644 index 0000000..d98ac4f --- /dev/null +++ b/example/pubspec.yaml @@ -0,0 +1,63 @@ +name: core_location_fluttify_example +description: Demonstrates how to use the core_location_fluttify plugin. +publish_to: 'none' + +environment: + sdk: ">=2.12.0 <3.0.0" + +dependencies: + flutter: + sdk: flutter + + # The following adds the Cupertino Icons font to your application. + # Use with the CupertinoIcons class for iOS style icons. + cupertino_icons: ^0.1.2 + +dev_dependencies: + flutter_test: + sdk: flutter + + core_location_fluttify: + path: ../ + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter. +flutter: + + # The following line ensures that the Material Icons font is + # included with your application, so that you can use the icons in + # the material Icons class. + uses-material-design: true + + # To add assets to your application, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware. + + # For details regarding adding assets from package dependencies, see + # https://flutter.dev/assets-and-images/#from-packages + + # To add custom fonts to your application, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts from package dependencies, + # see https://flutter.dev/custom-fonts/#from-packages diff --git a/example/test/widget_test.dart b/example/test/widget_test.dart new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/example/test/widget_test.dart @@ -0,0 +1 @@ + diff --git a/ios/Classes/CLFloorHandler.h b/ios/Classes/CLFloorHandler.h new file mode 100644 index 0000000..16b7e74 --- /dev/null +++ b/ios/Classes/CLFloorHandler.h @@ -0,0 +1,13 @@ +// +// Created by Yohom Bao on 2019/11/22. +// + +#import +#import +#import "CoreLocationFluttifyPlugin.h" + +NS_ASSUME_NONNULL_BEGIN + +void CLFloorHandler(NSString *method, id args, FlutterResult methodResult); + +NS_ASSUME_NONNULL_END diff --git a/ios/Classes/CLFloorHandler.m b/ios/Classes/CLFloorHandler.m new file mode 100644 index 0000000..768dfba --- /dev/null +++ b/ios/Classes/CLFloorHandler.m @@ -0,0 +1,28 @@ +// +// Created by Yohom Bao on 2019/11/22. +// + +#import +#import "CLFloorHandler.h" + +extern NSMutableDictionary *STACK; +extern NSMutableDictionary *HEAP; +extern BOOL enableLog; + +void CLFloorHandler(NSString *method, id rawArgs, FlutterResult methodResult) { + // CLFloor获取level + if ([@"CLFloor::get_level" isEqualToString:method]) { + NSDictionary *args = (NSDictionary *) rawArgs; + + CLFloor *__this__ = (CLFloor *) args[@"__this__"]; + if (__this__ != nil && (NSNull *) __this__ != [NSNull null]) { + methodResult(@(__this__.level)); + } else { + methodResult([FlutterError errorWithCode:@"目标对象为null" + message:@"目标对象为null" + details:@"目标对象为null"]); + } + } else { + methodResult(FlutterMethodNotImplemented); + } +} diff --git a/ios/Classes/CLHeadingHandler.h b/ios/Classes/CLHeadingHandler.h new file mode 100644 index 0000000..a6d45d7 --- /dev/null +++ b/ios/Classes/CLHeadingHandler.h @@ -0,0 +1,15 @@ +// +// CLHeadingHandler.h +// foundation_fluttify +// +// Created by Yohom Bao on 2019/12/11. +// + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +void CLHeadingHandler(NSString* method, id args, FlutterResult methodResult); + +NS_ASSUME_NONNULL_END diff --git a/ios/Classes/CLHeadingHandler.m b/ios/Classes/CLHeadingHandler.m new file mode 100644 index 0000000..5ad2997 --- /dev/null +++ b/ios/Classes/CLHeadingHandler.m @@ -0,0 +1,60 @@ +// +// CLHeadingHandler.m +// foundation_fluttify +// +// Created by Yohom Bao on 2019/12/11. +// + +#import "CLHeadingHandler.h" +#import + +extern NSMutableDictionary *STACK; +extern NSMutableDictionary *HEAP; +extern BOOL enableLog; + +void CLHeadingHandler(NSString *method, id rawArgs, FlutterResult methodResult) { + if ([@"CLHeading::getMagneticHeading" isEqualToString:method]) { + NSDictionary *args = (NSDictionary *) rawArgs; + + CLHeading *__this__ = (CLHeading *) args[@"__this__"]; + if (__this__ != nil && (NSNull *) __this__ != [NSNull null]) { + CLLocationDirection magneticHeading = [__this__ magneticHeading]; + + methodResult(@(magneticHeading)); + } else { + methodResult([FlutterError errorWithCode:@"目标对象为null" + message:@"目标对象为null" + details:@"目标对象为null"]); + } + } + if ([@"CLHeading::getTrueHeading" isEqualToString:method]) { + NSDictionary *args = (NSDictionary *) rawArgs; + + CLHeading *__this__ = (CLHeading *) args[@"__this__"]; + if (__this__ != nil && (NSNull *) __this__ != [NSNull null]) { + CLLocationDirection trueHeading = [__this__ trueHeading]; + + methodResult(@(trueHeading)); + } else { + methodResult([FlutterError errorWithCode:@"目标对象为null" + message:@"目标对象为null" + details:@"目标对象为null"]); + } + } + if ([@"CLHeading::getHeadingAccuracy" isEqualToString:method]) { + NSDictionary *args = (NSDictionary *) rawArgs; + + CLHeading *__this__ = (CLHeading *) args[@"__this__"]; + if (__this__ != nil && (NSNull *) __this__ != [NSNull null]) { + CLLocationDirection headingAccuracy = [__this__ headingAccuracy]; + + methodResult(@(headingAccuracy)); + } else { + methodResult([FlutterError errorWithCode:@"目标对象为null" + message:@"目标对象为null" + details:@"目标对象为null"]); + } + } else { + methodResult(FlutterMethodNotImplemented); + } +} diff --git a/ios/Classes/CLLocationCoordinate2DHandler.h b/ios/Classes/CLLocationCoordinate2DHandler.h new file mode 100644 index 0000000..d7df2f7 --- /dev/null +++ b/ios/Classes/CLLocationCoordinate2DHandler.h @@ -0,0 +1,12 @@ +// +// Created by Yohom Bao on 2019/11/22. +// + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +void CLLocationCoordinate2DHandler(NSString* method, id args, FlutterResult methodResult); + +NS_ASSUME_NONNULL_END diff --git a/ios/Classes/CLLocationCoordinate2DHandler.m b/ios/Classes/CLLocationCoordinate2DHandler.m new file mode 100644 index 0000000..15dd0b6 --- /dev/null +++ b/ios/Classes/CLLocationCoordinate2DHandler.m @@ -0,0 +1,101 @@ +// +// Created by Yohom Bao on 2019/11/22. +// + +#import +#import "CLLocationCoordinate2DHandler.h" + +extern NSMutableDictionary *STACK; +extern NSMutableDictionary *HEAP; +extern BOOL enableLog; + +void CLLocationCoordinate2DHandler(NSString *method, id rawArgs, FlutterResult methodResult) { + if ([@"CLLocationCoordinate2D::get_latitude" isEqualToString:method]) { + NSDictionary *args = (NSDictionary *) rawArgs; + + NSValue *dataValue = (NSValue *) args[@"__this__"]; + if (dataValue != nil && (NSNull *) dataValue != [NSNull null]) { + CLLocationCoordinate2D _structValue; + [dataValue getValue:&_structValue]; + + methodResult(@(_structValue.latitude)); + } else { + methodResult([FlutterError errorWithCode:@"目标对象为null" + message:@"目标对象为null" + details:@"目标对象为null"]); + } + } else if ([@"CLLocationCoordinate2D::get_longitude" isEqualToString:method]) { + NSDictionary *args = (NSDictionary *) rawArgs; + + NSValue *dataValue = (NSValue *) args[@"__this__"]; + if (dataValue != nil && (NSNull *) dataValue != [NSNull null]) { + CLLocationCoordinate2D _structValue; + [dataValue getValue:&_structValue]; + + methodResult(@(_structValue.longitude)); + } else { + methodResult([FlutterError errorWithCode:@"目标对象为null" + message:@"目标对象为null" + details:@"目标对象为null"]); + } + } else if ([@"CLLocationCoordinate2D::get_latitude_batch" isEqualToString:method]) { + NSArray *> *args = (NSArray *> *) rawArgs; + + NSMutableArray *result = [NSMutableArray arrayWithCapacity:args.count]; + + for (NSUInteger i = 0; i < args.count; i++) { + NSValue *dataValue = (NSValue *) args[i][@"__this__"]; + CLLocationCoordinate2D _structValue; + [dataValue getValue:&_structValue]; + + [result addObject:@(_structValue.latitude)]; + } + + methodResult(result); + } else if ([@"CLLocationCoordinate2D::get_longitude_batch" isEqualToString:method]) { + NSArray *> *args = (NSArray *> *) rawArgs; + + NSMutableArray *result = [NSMutableArray arrayWithCapacity:args.count]; + + for (NSUInteger i = 0; i < args.count; i++) { + NSValue *dataValue = (NSValue *) args[i][@"__this__"]; + CLLocationCoordinate2D _structValue; + [dataValue getValue:&_structValue]; + + [result addObject:@(_structValue.longitude)]; + } + + methodResult(result); + } else if ([@"CLLocationCoordinate2D::createCLLocationCoordinate2D" isEqualToString:method]) { + NSDictionary *args = (NSDictionary *) rawArgs; + + CLLocationDegrees latitude = [args[@"latitude"] doubleValue]; + CLLocationDegrees longitude = [args[@"longitude"] doubleValue]; + + CLLocationCoordinate2D data = CLLocationCoordinate2DMake(latitude, longitude); + + NSValue *dataValue = [NSValue value:&data withObjCType:@encode(CLLocationCoordinate2D)]; + + methodResult(dataValue); + } else if ([@"CLLocationCoordinate2D::create_batchCLLocationCoordinate2D" isEqualToString:method]) { + NSDictionary *args = (NSDictionary *) rawArgs; + + NSArray *latitudeBatch = (NSArray *) args[@"latitude_batch"]; + NSArray *longitudeBatch = (NSArray *) args[@"longitude_batch"]; + + NSMutableArray *resultBatch = [NSMutableArray arrayWithCapacity:latitudeBatch.count]; + for (NSUInteger i = 0; i < latitudeBatch.count; i++) { + CLLocationDegrees latitude = [latitudeBatch[i] doubleValue]; + CLLocationDegrees longitude = [longitudeBatch[i] doubleValue]; + + CLLocationCoordinate2D data = CLLocationCoordinate2DMake(latitude, longitude); + + NSValue *dataValue = [NSValue value:&data withObjCType:@encode(CLLocationCoordinate2D)]; + [resultBatch addObject:dataValue]; + } + + methodResult(resultBatch); + } else { + methodResult(FlutterMethodNotImplemented); + } +} diff --git a/ios/Classes/CLLocationHandler.h b/ios/Classes/CLLocationHandler.h new file mode 100644 index 0000000..b3fa7f6 --- /dev/null +++ b/ios/Classes/CLLocationHandler.h @@ -0,0 +1,13 @@ +// +// Created by Yohom Bao on 2019/11/22. +// + +#import +#import +#import "CoreLocationFluttifyPlugin.h" + +NS_ASSUME_NONNULL_BEGIN + +void CLLocationHandler(NSString* method, id args, FlutterResult methodResult); + +NS_ASSUME_NONNULL_END diff --git a/ios/Classes/CLLocationHandler.m b/ios/Classes/CLLocationHandler.m new file mode 100644 index 0000000..7dfb8d1 --- /dev/null +++ b/ios/Classes/CLLocationHandler.m @@ -0,0 +1,97 @@ +// +// Created by Yohom Bao on 2019/11/22. +// + +#import +#import "CLLocationHandler.h" + +extern NSMutableDictionary *STACK; +extern NSMutableDictionary *HEAP; +extern BOOL enableLog; + +void CLLocationHandler(NSString *method, id rawArgs, FlutterResult methodResult) { + if ([@"CLLocation::get_coordinate" isEqualToString:method]) { + NSDictionary *args = (NSDictionary *) rawArgs; + + CLLocation *__this__ = (CLLocation *) args[@"__this__"]; + if (__this__ != nil && (NSNull *) __this__ != [NSNull null]) { + CLLocationCoordinate2D data = __this__.coordinate; + NSValue *dataValue = [NSValue value:&data withObjCType:@encode(CLLocationCoordinate2D)]; + + methodResult(dataValue); + } else { + methodResult([FlutterError errorWithCode:@"目标对象为null" + message:@"目标对象为null" + details:@"目标对象为null"]); + } + } else if ([@"CLLocation::get_altitude" isEqualToString:method]) { + NSDictionary *args = (NSDictionary *) rawArgs; + + CLLocation *__this__ = (CLLocation *) args[@"__this__"]; + if (__this__ != nil && (NSNull *) __this__ != [NSNull null]) { + methodResult(@(__this__.altitude)); + } else { + methodResult([FlutterError errorWithCode:@"目标对象为null" + message:@"目标对象为null" + details:@"目标对象为null"]); + } + } else if ([@"CLLocation::get_horizontalAccuracy" isEqualToString:method]) { + NSDictionary *args = (NSDictionary *) rawArgs; + + CLLocation *__this__ = (CLLocation *) args[@"__this__"]; + if (__this__ != nil && (NSNull *) __this__ != [NSNull null]) { + methodResult(@(__this__.horizontalAccuracy)); + } else { + methodResult([FlutterError errorWithCode:@"目标对象为null" + message:@"目标对象为null" + details:@"目标对象为null"]); + } + } else if ([@"CLLocation::get_verticalAccuracy" isEqualToString:method]) { + NSDictionary *args = (NSDictionary *) rawArgs; + + CLLocation *__this__ = (CLLocation *) args[@"__this__"]; + if (__this__ != nil && (NSNull *) __this__ != [NSNull null]) { + methodResult(@(__this__.verticalAccuracy)); + } else { + methodResult([FlutterError errorWithCode:@"目标对象为null" + message:@"目标对象为null" + details:@"目标对象为null"]); + } + } else if ([@"CLLocation::get_course" isEqualToString:method]) { + NSDictionary *args = (NSDictionary *) rawArgs; + + CLLocation *__this__ = (CLLocation *) args[@"__this__"]; + if (__this__ != nil && (NSNull *) __this__ != [NSNull null]) { + methodResult(@(__this__.course)); + } else { + methodResult([FlutterError errorWithCode:@"目标对象为null" + message:@"目标对象为null" + details:@"目标对象为null"]); + } + } else if ([@"CLLocation::get_speed" isEqualToString:method]) { + NSDictionary *args = (NSDictionary *) rawArgs; + + CLLocation *__this__ = (CLLocation *) args[@"__this__"]; + if (__this__ != nil && (NSNull *) __this__ != [NSNull null]) { + methodResult(@(__this__.speed)); + } else { + methodResult([FlutterError errorWithCode:@"目标对象为null" + message:@"目标对象为null" + details:@"目标对象为null"]); + } + } else if ([@"CLLocation::get_floor" isEqualToString:method]) { + NSDictionary *args = (NSDictionary *) rawArgs; + + CLLocation *__this__ = (CLLocation *) args[@"__this__"]; + if (__this__ != nil && (NSNull *) __this__ != [NSNull null]) { + CLFloor *floor = __this__.floor; + methodResult(floor); + } else { + methodResult([FlutterError errorWithCode:@"目标对象为null" + message:@"目标对象为null" + details:@"目标对象为null"]); + } + } else { + methodResult(FlutterMethodNotImplemented); + } +} diff --git a/ios/Classes/CLLocationManagerHandler.h b/ios/Classes/CLLocationManagerHandler.h new file mode 100644 index 0000000..f7f9ead --- /dev/null +++ b/ios/Classes/CLLocationManagerHandler.h @@ -0,0 +1,13 @@ +// +// Created by Yohom Bao on 2019/11/22. +// + +#import +#import +#import "CoreLocationFluttifyPlugin.h" + +NS_ASSUME_NONNULL_BEGIN + +void CLLocationManagerHandler(NSString* method, id args, FlutterResult methodResult); + +NS_ASSUME_NONNULL_END diff --git a/ios/Classes/CLLocationManagerHandler.m b/ios/Classes/CLLocationManagerHandler.m new file mode 100644 index 0000000..7da3cde --- /dev/null +++ b/ios/Classes/CLLocationManagerHandler.m @@ -0,0 +1,41 @@ +// +// Created by Yohom Bao on 2019/11/22. +// + +#import +#import "CLLocationManagerHandler.h" + +extern NSMutableDictionary *HEAP; +extern BOOL enableLog; + +void CLLocationManagerHandler(NSString *method, id rawArgs, FlutterResult methodResult) { + if ([@"CLLocationManager::requestAlwaysAuthorization" isEqualToString:method]) { + NSDictionary *args = (NSDictionary *) rawArgs; + + CLLocationManager *__this__ = (CLLocationManager *) args[@"__this__"]; + if (__this__ != nil && (NSNull *) __this__ != [NSNull null]) { + [__this__ requestAlwaysAuthorization]; + methodResult(@"success"); + } else { + methodResult([FlutterError errorWithCode:@"目标对象为null" + message:@"目标对象为null" + details:@"目标对象为null"]); + } + } + else if ([@"CLLocationManager::requestWhenInUseAuthorization" isEqualToString:method]) { + NSDictionary *args = (NSDictionary *) rawArgs; + + CLLocationManager *__this__ = (CLLocationManager *) args[@"__this__"]; + if (__this__ != nil && (NSNull *) __this__ != [NSNull null]) { + [__this__ requestWhenInUseAuthorization]; + + methodResult(@"success"); + } else { + methodResult([FlutterError errorWithCode:@"目标对象为null" + message:@"目标对象为null" + details:@"目标对象为null"]); + } + } else { + methodResult(FlutterMethodNotImplemented); + } +} diff --git a/ios/Classes/CoreLocationFluttifyPlugin.h b/ios/Classes/CoreLocationFluttifyPlugin.h new file mode 100644 index 0000000..cc67172 --- /dev/null +++ b/ios/Classes/CoreLocationFluttifyPlugin.h @@ -0,0 +1,5 @@ +#import + +@interface CoreLocationFluttifyPlugin : NSObject +- (instancetype) initWithRegistrar:(NSObject*) registrar; +@end diff --git a/ios/Classes/CoreLocationFluttifyPlugin.m b/ios/Classes/CoreLocationFluttifyPlugin.m new file mode 100644 index 0000000..8306cdc --- /dev/null +++ b/ios/Classes/CoreLocationFluttifyPlugin.m @@ -0,0 +1,55 @@ +#import "CoreLocationFluttifyPlugin.h" +#import "CLLocationCoordinate2DHandler.h" +#import "CLLocationHandler.h" +#import "CLFloorHandler.h" +#import "CLLocationManagerHandler.h" +#import "CLHeadingHandler.h" +#import "FluttifyMessageCodec.h" + +// Container for Dart side random access objects +extern NSMutableDictionary *HEAP; + +// whether enable log or not +extern BOOL enableLog; + +@implementation CoreLocationFluttifyPlugin { + NSObject *_registrar; +} + ++ (void)registerWithRegistrar:(NSObject *)registrar { + NSString* _channelName = @"com.fluttify/core_location_method"; + + FlutterMethodChannel *channel = [FlutterMethodChannel + methodChannelWithName:_channelName + binaryMessenger:[registrar messenger] + codec:[FlutterStandardMethodCodec codecWithReaderWriter:[[FluttifyReaderWriter alloc] init]]]; + CoreLocationFluttifyPlugin *instance = [[CoreLocationFluttifyPlugin alloc] initWithRegistrar:registrar]; + [registrar addMethodCallDelegate:instance channel:channel]; +} + +- (instancetype)initWithRegistrar:(NSObject *)registrar { + self = [super init]; + if (self) { + _registrar = registrar; + } + return self; +} + +- (void)handleMethodCall:(FlutterMethodCall *)methodCall result:(FlutterResult)methodResult { + id rawArgs = [methodCall arguments]; + if ([methodCall.method hasPrefix:@"CLLocationCoordinate2D"]) { + CLLocationCoordinate2DHandler(methodCall.method, rawArgs, methodResult); + } else if ([methodCall.method hasPrefix:@"CLLocation"]) { + CLLocationHandler(methodCall.method, rawArgs, methodResult); + } else if ([methodCall.method hasPrefix:@"CLFloor"]) { + CLFloorHandler(methodCall.method, rawArgs, methodResult); + } else if ([methodCall.method hasPrefix:@"CLLocationManager"]) { + CLLocationManagerHandler(methodCall.method, rawArgs, methodResult); + } else if ([methodCall.method hasPrefix:@"CLHeadingHandler"]) { + CLHeadingHandler(methodCall.method, rawArgs, methodResult); + } else { + methodResult(FlutterMethodNotImplemented); + } +} + +@end diff --git a/ios/core_location_fluttify.podspec b/ios/core_location_fluttify.podspec new file mode 100644 index 0000000..d1b69ac --- /dev/null +++ b/ios/core_location_fluttify.podspec @@ -0,0 +1,27 @@ +# +# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html. +# Run `pod lib lint core_location_fluttify.podspec' to validate before publishing. +# +Pod::Spec.new do |s| + s.name = 'core_location_fluttify' + s.version = '0.0.1' + s.summary = 'A new Flutter project.' + s.description = <<-DESC +A new Flutter project. + DESC + s.homepage = 'http://example.com' + s.license = { :file => '../LICENSE' } + s.author = { 'Your Company' => 'email@example.com' } + s.source = { :path => '.' } + s.source_files = 'Classes/**/*' + s.public_header_files = 'Classes/**/*.h' + s.dependency 'Flutter' + s.platform = :ios, '8.0' + s.dependency 'foundation_fluttify' + + # 系统framework + s.frameworks = ["CoreLocation"] + s.static_framework = true + # 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' } +end diff --git a/lib/core_location_fluttify.dart b/lib/core_location_fluttify.dart new file mode 100644 index 0000000..432959a --- /dev/null +++ b/lib/core_location_fluttify.dart @@ -0,0 +1,12 @@ +library core_location_fluttify; + +export 'package:foundation_fluttify/foundation_fluttify.dart'; + +export 'src/cl_authorization_status.dart'; +export 'src/cl_floor.dart'; +export 'src/cl_heading.dart'; +export 'src/cl_location.dart'; +export 'src/cl_location_coordinate_2d.dart'; +export 'src/cl_location_manager.dart'; +export 'src/functions.dart'; +export 'src/latlng.dart'; diff --git a/lib/src/cl_authorization_status.dart b/lib/src/cl_authorization_status.dart new file mode 100644 index 0000000..ee443b0 --- /dev/null +++ b/lib/src/cl_authorization_status.dart @@ -0,0 +1,18 @@ +enum CLAuthorizationStatus { + kCLAuthorizationStatusNotDetermined, + kCLAuthorizationStatusRestricted, + kCLAuthorizationStatusDenied, + kCLAuthorizationStatusAuthorizedAlways, + kCLAuthorizationStatusAuthorizedWhenInUse, + kCLAuthorizationStatusAuthorized, +} + +extension CLAuthorizationStatusToX on CLAuthorizationStatus { + int toValue() => index; +} + +extension CLAuthorizationStatusFromX on int { + CLAuthorizationStatus toCLAuthorizationStatus() { + return CLAuthorizationStatus.values[this]; + } +} diff --git a/lib/src/cl_floor.dart b/lib/src/cl_floor.dart new file mode 100644 index 0000000..973d31e --- /dev/null +++ b/lib/src/cl_floor.dart @@ -0,0 +1,14 @@ +// ignore_for_file: non_constant_identifier_names +import 'package:foundation_fluttify/foundation_fluttify.dart'; + +import 'objects.dart'; + +class CLFloor extends NSObject { + @override + final String tag__ = 'core_location_fluttify'; + + Future get level { + return kCLMethodChannel + .invokeMethod('CLFloor::get_level', {'__this__': this}); + } +} diff --git a/lib/src/cl_heading.dart b/lib/src/cl_heading.dart new file mode 100644 index 0000000..15713ed --- /dev/null +++ b/lib/src/cl_heading.dart @@ -0,0 +1,24 @@ +// ignore_for_file: non_constant_identifier_names +import 'package:foundation_fluttify/foundation_fluttify.dart'; + +import 'objects.dart'; + +class CLHeading extends Ref { + @override + final String tag__ = 'core_location_fluttify'; + + Future get magneticHeading { + return kCLMethodChannel + .invokeMethod('CLHeading::getMagneticHeading', {'__this__': this}); + } + + Future get trueHeading { + return kCLMethodChannel + .invokeMethod('CLHeading::getTrueHeading', {'__this__': this}); + } + + Future get headingAccuracy { + return kCLMethodChannel + .invokeMethod('CLHeading::getHeadingAccuracy', {'__this__': this}); + } +} diff --git a/lib/src/cl_location.dart b/lib/src/cl_location.dart new file mode 100644 index 0000000..60580b3 --- /dev/null +++ b/lib/src/cl_location.dart @@ -0,0 +1,48 @@ +import 'package:foundation_fluttify/foundation_fluttify.dart'; + +import 'cl_floor.dart'; +import 'cl_location_coordinate_2d.dart'; +// ignore_for_file: non_constant_identifier_names +import 'objects.dart'; + +class CLLocation extends NSObject { + @override + final String tag__ = 'core_location_fluttify'; + + Future get coordinate async { + final result = await kCLMethodChannel + .invokeMethod('CLLocation::get_coordinate', {'__this__': this}); + return CLLocationCoordinate2D()..refId = result?.refId; + } + + Future get altitude { + return kCLMethodChannel + .invokeMethod('CLLocation::get_altitude', {'__this__': this}); + } + + Future get horizontalAccuracy { + return kCLMethodChannel + .invokeMethod('CLLocation::get_horizontalAccuracy', {'__this__': this}); + } + + Future get verticalAccuracy { + return kCLMethodChannel + .invokeMethod('CLLocation::get_verticalAccuracy', {'__this__': this}); + } + + Future get course { + return kCLMethodChannel + .invokeMethod('CLLocation::get_course', {'__this__': this}); + } + + Future get speed { + return kCLMethodChannel + .invokeMethod('CLLocation::get_speed', {'__this__': this}); + } + + Future get floor async { + final result = await kCLMethodChannel + .invokeMethod('CLLocation::get_floor', {'__this__': this}); + return CLFloor()..refId = result?.refId; + } +} diff --git a/lib/src/cl_location_coordinate_2d.dart b/lib/src/cl_location_coordinate_2d.dart new file mode 100644 index 0000000..db7476a --- /dev/null +++ b/lib/src/cl_location_coordinate_2d.dart @@ -0,0 +1,69 @@ +// ignore_for_file: non_constant_identifier_names +import 'package:foundation_fluttify/foundation_fluttify.dart'; + +import 'objects.dart'; + +class CLLocationCoordinate2D extends Ref { + @override + final String tag__ = 'core_location_fluttify'; + + static Future create( + double latitude, + double longitude, + ) async { + final result = await kCLMethodChannel.invokeMethod( + 'CLLocationCoordinate2D::createCLLocationCoordinate2D', + {'latitude': latitude, 'longitude': longitude}, + ); + return CLLocationCoordinate2D()..refId = result?.refId; + } + + // ignore: non_constant_identifier_names + static Future> create_batch( + List latitudeBatch, + List longitudeBatch, + ) async { + final resultBatch = await kCLMethodChannel.invokeListMethod( + 'CLLocationCoordinate2D::create_batchCLLocationCoordinate2D', + { + 'latitude_batch': latitudeBatch, + 'longitude_batch': longitudeBatch, + }, + ); + return resultBatch! + .map((it) => CLLocationCoordinate2D()..refId = it.refId) + .toList(); + } + + Future get latitude { + return kCLMethodChannel.invokeMethod( + 'CLLocationCoordinate2D::get_latitude', {'__this__': this}); + } + + Future get longitude { + return kCLMethodChannel.invokeMethod( + 'CLLocationCoordinate2D::get_longitude', {'__this__': this}); + } +} + +extension CLLocationCoordinate2DListX on List { + Future?> get latitudeBatch async { + final result = await kCLMethodChannel.invokeListMethod( + 'CLLocationCoordinate2D::get_latitude_batch', + [ + for (final __item__ in this) {'__this__': __item__} + ], + ); + return result; + } + + Future?> get longitudeBatch async { + final result = await kCLMethodChannel.invokeListMethod( + 'CLLocationCoordinate2D::get_longitude_batch', + [ + for (final __item__ in this) {'__this__': __item__} + ], + ); + return result; + } +} diff --git a/lib/src/cl_location_manager.dart b/lib/src/cl_location_manager.dart new file mode 100644 index 0000000..cbf0286 --- /dev/null +++ b/lib/src/cl_location_manager.dart @@ -0,0 +1,19 @@ +// ignore_for_file: non_constant_identifier_names +import 'package:foundation_fluttify/foundation_fluttify.dart'; + +import 'objects.dart'; + +class CLLocationManager extends NSObject { + @override + final String tag__ = 'core_location_fluttify'; + + Future requestAlwaysAuthorization() async { + await kCLMethodChannel.invokeMethod( + 'CLLocationManager::requestAlwaysAuthorization', {'__this__': this}); + } + + Future requestWhenInUseAuthorization() async { + await kCLMethodChannel.invokeMethod( + 'CLLocationManager::requestWhenInUseAuthorization', {'__this__': this}); + } +} diff --git a/lib/src/functions.dart b/lib/src/functions.dart new file mode 100644 index 0000000..9685c34 --- /dev/null +++ b/lib/src/functions.dart @@ -0,0 +1,24 @@ +import 'package:foundation_fluttify/foundation_fluttify.dart'; + +import 'cl_heading.dart'; +import 'cl_location.dart'; +import 'cl_location_coordinate_2d.dart'; +import 'cl_location_manager.dart'; + +T? CoreLocationFluttifyAndroidAs(dynamic __this__) { + return null; +} + +T? CoreLocationFluttifyIOSAs(dynamic __this__) { + if (T == CLLocation) { + return (CLLocation()..refId = (__this__ as Ref).refId) as T; + } else if (T == CLHeading) { + return (CLHeading()..refId = (__this__ as Ref).refId) as T; + } else if (T == CLLocationCoordinate2D) { + return (CLLocationCoordinate2D()..refId = (__this__ as Ref).refId) as T; + } else if (T == CLLocationManager) { + return (CLLocationManager()..refId = (__this__ as Ref).refId) as T; + } else { + return null; + } +} diff --git a/lib/src/latlng.dart b/lib/src/latlng.dart new file mode 100644 index 0000000..bb76578 --- /dev/null +++ b/lib/src/latlng.dart @@ -0,0 +1,36 @@ +class LatLng { + final double latitude; + final double longitude; + + LatLng(this.latitude, this.longitude) + : assert(latitude >= -90 && latitude <= 90, '纬度范围为[-90, 90]!'), + assert(longitude >= -180 && longitude <= 180, '经度范围为[-180, 180]!'); + + static LatLng? fromJson(Map? json) { + if (json == null || json.isEmpty) return null; + return LatLng(json['latitude'], json['longitude']); + } + + Map toJson() { + return { + 'latitude': latitude, + 'longitude': longitude, + }; + } + + @override + bool operator ==(Object other) => + identical(this, other) || + other is LatLng && + runtimeType == other.runtimeType && + latitude == other.latitude && + longitude == other.longitude; + + @override + int get hashCode => latitude.hashCode ^ longitude.hashCode; + + @override + String toString() { + return 'LatLng{latitude: $latitude, longitude: $longitude}'; + } +} diff --git a/lib/src/objects.dart b/lib/src/objects.dart new file mode 100644 index 0000000..c35f683 --- /dev/null +++ b/lib/src/objects.dart @@ -0,0 +1,7 @@ +import 'package:core_location_fluttify/core_location_fluttify.dart'; +import 'package:flutter/services.dart'; + +const kCLMethodChannel = MethodChannel( + "com.fluttify/core_location_method", + StandardMethodCodec(FluttifyMessageCodec()), +); diff --git a/pubspec.yaml b/pubspec.yaml new file mode 100644 index 0000000..3f8df3b --- /dev/null +++ b/pubspec.yaml @@ -0,0 +1,28 @@ +name: core_location_fluttify +description: A new Flutter project. +version: 0.7.1 +author: yohom +homepage: https://github.com/fluttify-project/core_location_fluttify + +environment: + sdk: ">=2.12.0 <3.0.0" + flutter: ">=2.0.0" + +dependencies: + flutter: + sdk: flutter + foundation_fluttify: + path: ..\foundation_fluttify + +dev_dependencies: + flutter_test: + sdk: flutter + +flutter: + plugin: + platforms: + android: + package: me.yohom.core_location_fluttify + pluginClass: CoreLocationFluttifyPlugin + ios: + pluginClass: CoreLocationFluttifyPlugin \ No newline at end of file diff --git a/test/core_location_fluttify_test.dart b/test/core_location_fluttify_test.dart new file mode 100644 index 0000000..ab73b3a --- /dev/null +++ b/test/core_location_fluttify_test.dart @@ -0,0 +1 @@ +void main() {}