From 4aa7ed3d142901d4b3960e8fdb82534c4dff4fd1 Mon Sep 17 00:00:00 2001 From: Sergey Yuryev Date: Wed, 20 Oct 2021 13:41:19 +0300 Subject: [PATCH] add cordova ios platform --- .circleci/config.yml | 5 +- examples/AlanBasicExample/.gitignore | 1 - examples/AlanBasicExample/package-lock.json | 499 ++++ examples/AlanBasicExample/package.json | 4 +- .../AlanBasicExample/platforms/ios/.gitignore | 5 + .../project.pbxproj | 502 ++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcschemes/AlanBasicExample.xcscheme | 91 + .../UserInterfaceState.xcuserstate | Bin 0 -> 25769 bytes .../xcschemes/xcschememanagement.plist | 14 + .../platforms/ios/AlanBasicExample/.gitignore | 5 + .../AlanBasicExample-Info.plist | 54 + .../AlanBasicExample-Prefix.pch | 26 + .../ios/AlanBasicExample/Bridging-Header.h | 28 + .../CDVLaunchScreen.storyboard | 65 + .../AlanBasicExample/Classes/AppDelegate.h | 33 + .../AlanBasicExample/Classes/AppDelegate.m | 39 + .../Classes/MainViewController.h | 40 + .../Classes/MainViewController.m | 112 + .../Classes/MainViewController.xib | 138 ++ .../AlanBasicExample/Entitlements-Debug.plist | 24 + .../Entitlements-Release.plist | 24 + .../AppIcon.appiconset/Contents.json | 241 ++ .../AppIcon.appiconset/icon-1024.png | Bin 0 -> 35783 bytes .../AppIcon.appiconset/icon-20.png | Bin 0 -> 476 bytes .../AppIcon.appiconset/icon-20@2x.png | Bin 0 -> 934 bytes .../AppIcon.appiconset/icon-20@3x.png | Bin 0 -> 1417 bytes .../AppIcon.appiconset/icon-24@2x.png | Bin 0 -> 1136 bytes .../AppIcon.appiconset/icon-27.5@2x.png | Bin 0 -> 1325 bytes .../AppIcon.appiconset/icon-29.png | Bin 0 -> 723 bytes .../AppIcon.appiconset/icon-29@2x.png | Bin 0 -> 1367 bytes .../AppIcon.appiconset/icon-29@3x.png | Bin 0 -> 2065 bytes .../AppIcon.appiconset/icon-40.png | Bin 0 -> 934 bytes .../AppIcon.appiconset/icon-40@2x.png | Bin 0 -> 1892 bytes .../AppIcon.appiconset/icon-44@2x.png | Bin 0 -> 2069 bytes .../AppIcon.appiconset/icon-50.png | Bin 0 -> 1173 bytes .../AppIcon.appiconset/icon-50@2x.png | Bin 0 -> 2270 bytes .../AppIcon.appiconset/icon-60@2x.png | Bin 0 -> 2712 bytes .../AppIcon.appiconset/icon-60@3x.png | Bin 0 -> 4304 bytes .../AppIcon.appiconset/icon-72.png | Bin 0 -> 1681 bytes .../AppIcon.appiconset/icon-72@2x.png | Bin 0 -> 3315 bytes .../AppIcon.appiconset/icon-76.png | Bin 0 -> 1764 bytes .../AppIcon.appiconset/icon-76@2x.png | Bin 0 -> 3518 bytes .../AppIcon.appiconset/icon-83.5@2x.png | Bin 0 -> 3842 bytes .../AppIcon.appiconset/icon-86@2x.png | Bin 0 -> 4022 bytes .../AppIcon.appiconset/icon-98@2x.png | Bin 0 -> 4744 bytes .../AppIcon.appiconset/icon.png | Bin 0 -> 1376 bytes .../AppIcon.appiconset/icon@2x.png | Bin 0 -> 2568 bytes .../BackgroundColor.colorset/Contents.json | 15 + .../Images.xcassets/Contents.json | 6 + .../LaunchStoryboard.imageset/Contents.json | 872 +++++++ .../Scripts/copy-www-build-step.sh | 63 + .../platforms/ios/AlanBasicExample/config.xml | 61 + .../platforms/ios/AlanBasicExample/main.m | 35 + .../ios/CordovaLib/Classes/Private/CDVDebug.h | 25 + .../Classes/Private/CDVJSON_private.h | 31 + .../Classes/Private/CDVJSON_private.m | 99 + .../Classes/Private/CDVPlugin+Private.h | 24 + .../ios/CordovaLib/Classes/Public/CDV.h | 30 + .../Classes/Public/CDVAppDelegate.h | 28 + .../Classes/Public/CDVAppDelegate.m | 97 + .../Classes/Public/CDVAvailability.h | 118 + .../Public/CDVAvailabilityDeprecated.h | 26 + .../Classes/Public/CDVCommandDelegate.h | 49 + .../Classes/Public/CDVCommandDelegateImpl.h | 36 + .../Classes/Public/CDVCommandDelegateImpl.m | 181 ++ .../Classes/Public/CDVCommandQueue.h | 39 + .../Classes/Public/CDVCommandQueue.m | 194 ++ .../Classes/Public/CDVConfigParser.h | 30 + .../Classes/Public/CDVConfigParser.m | 81 + .../Classes/Public/CDVInvokedUrlCommand.h | 52 + .../Classes/Public/CDVInvokedUrlCommand.m | 116 + .../Classes/Public/CDVPlugin+Resources.h | 39 + .../Classes/Public/CDVPlugin+Resources.m | 38 + .../ios/CordovaLib/Classes/Public/CDVPlugin.h | 74 + .../ios/CordovaLib/Classes/Public/CDVPlugin.m | 199 ++ .../Classes/Public/CDVPluginResult.h | 83 + .../Classes/Public/CDVPluginResult.m | 203 ++ .../Public/CDVScreenOrientationDelegate.h | 28 + .../ios/CordovaLib/Classes/Public/CDVTimer.h | 27 + .../ios/CordovaLib/Classes/Public/CDVTimer.m | 123 + .../Classes/Public/CDVURLSchemeHandler.h | 34 + .../Classes/Public/CDVURLSchemeHandler.m | 137 ++ .../Classes/Public/CDVViewController.h | 78 + .../Classes/Public/CDVViewController.m | 819 +++++++ .../Classes/Public/CDVWebViewEngineProtocol.h | 41 + .../Public/CDVWebViewProcessPoolFactory.h | 27 + .../Public/CDVWebViewProcessPoolFactory.m | 49 + .../CordovaLib/Classes/Public/CDVWhitelist.h | 34 + .../CordovaLib/Classes/Public/CDVWhitelist.m | 285 +++ .../Public/NSDictionary+CordovaPreferences.h | 35 + .../Public/NSDictionary+CordovaPreferences.m | 92 + .../Public/NSMutableArray+QueueAdditions.h | 29 + .../Public/NSMutableArray+QueueAdditions.m | 58 + .../CordovaLib.xcodeproj/project.pbxproj | 811 +++++++ .../xcschemes/xcschememanagement.plist | 19 + .../ios/CordovaLib/CordovaLib_Prefix.pch | 22 + .../platforms/ios/CordovaLib/VERSION | 1 + .../platforms/ios/CordovaLib/cordova.js | 2104 +++++++++++++++++ .../AlanBasicExample/platforms/ios/Podfile | 8 + .../platforms/ios/cordova/Api.js | 706 ++++++ .../platforms/ios/cordova/apple_ios_version | 27 + .../platforms/ios/cordova/apple_osx_version | 27 + .../platforms/ios/cordova/apple_xcode_version | 32 + .../platforms/ios/cordova/build | 66 + .../ios/cordova/build-debug.xcconfig | 32 + .../ios/cordova/build-extras.xcconfig | 0 .../ios/cordova/build-release.xcconfig | 33 + .../platforms/ios/cordova/build.bat | 19 + .../platforms/ios/cordova/build.xcconfig | 45 + .../platforms/ios/cordova/check_reqs | 32 + .../platforms/ios/cordova/check_reqs.bat | 25 + .../platforms/ios/cordova/clean | 52 + .../platforms/ios/cordova/clean.bat | 19 + .../platforms/ios/cordova/defaults.xml | 65 + .../ios/cordova/lib/BridgingHeader.js | 123 + .../platforms/ios/cordova/lib/Podfile.js | 418 ++++ .../platforms/ios/cordova/lib/PodsJson.js | 209 ++ .../platforms/ios/cordova/lib/build.js | 442 ++++ .../platforms/ios/cordova/lib/check_reqs.js | 168 ++ .../platforms/ios/cordova/lib/clean.js | 47 + .../platforms/ios/cordova/lib/list-devices | 28 + .../cordova/lib/list-emulator-build-targets | 26 + .../ios/cordova/lib/list-emulator-images | 28 + .../ios/cordova/lib/list-started-emulators | 28 + .../platforms/ios/cordova/lib/listDevices.js | 42 + .../cordova/lib/listEmulatorBuildTargets.js | 96 + .../ios/cordova/lib/listEmulatorImages.js | 30 + .../ios/cordova/lib/listStartedEmulators.js | 50 + .../ios/cordova/lib/plugman/pluginHandlers.js | 387 +++ .../platforms/ios/cordova/lib/prepare.js | 1151 +++++++++ .../platforms/ios/cordova/lib/projectFile.js | 139 ++ .../platforms/ios/cordova/lib/run.js | 260 ++ .../platforms/ios/cordova/lib/start-emulator | 30 + .../platforms/ios/cordova/lib/versions.js | 119 + .../platforms/ios/cordova/log | 23 + .../platforms/ios/cordova/log.bat | 19 + .../platforms/ios/cordova/loggingHelper.js | 30 + .../platforms/ios/cordova/run | 66 + .../platforms/ios/cordova/run.bat | 19 + .../platforms/ios/cordova/version | 31 + .../platforms/ios/cordova/version.bat | 26 + .../AlanBasicExample/platforms/ios/ios.json | 43 + .../ios/platform_www/cordova-js-src/exec.js | 159 ++ .../platform_www/cordova-js-src/platform.js | 39 + .../cordova-js-src/plugin/ios/console.js | 186 ++ .../cordova-js-src/plugin/ios/launchscreen.js | 33 + .../cordova-js-src/plugin/ios/logger.js | 348 +++ .../cordova-js-src/plugin/ios/wkwebkit.js | 42 + .../platforms/ios/platform_www/cordova.js | 2104 +++++++++++++++++ .../ios/platform_www/cordova_plugins.js | 16 + .../platforms/ios/pods-debug.xcconfig | 20 + .../platforms/ios/pods-release.xcconfig | 20 + .../AlanBasicExample/platforms/ios/pods.json | 5 + 155 files changed, 17994 insertions(+), 6 deletions(-) create mode 100644 examples/AlanBasicExample/platforms/ios/.gitignore create mode 100755 examples/AlanBasicExample/platforms/ios/AlanBasicExample.xcodeproj/project.pbxproj create mode 100644 examples/AlanBasicExample/platforms/ios/AlanBasicExample.xcworkspace/contents.xcworkspacedata create mode 100644 examples/AlanBasicExample/platforms/ios/AlanBasicExample.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 examples/AlanBasicExample/platforms/ios/AlanBasicExample.xcworkspace/xcshareddata/xcschemes/AlanBasicExample.xcscheme create mode 100644 examples/AlanBasicExample/platforms/ios/AlanBasicExample.xcworkspace/xcuserdata/sergeyyuryev.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 examples/AlanBasicExample/platforms/ios/AlanBasicExample.xcworkspace/xcuserdata/sergeyyuryev.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 examples/AlanBasicExample/platforms/ios/AlanBasicExample/.gitignore create mode 100644 examples/AlanBasicExample/platforms/ios/AlanBasicExample/AlanBasicExample-Info.plist create mode 100644 examples/AlanBasicExample/platforms/ios/AlanBasicExample/AlanBasicExample-Prefix.pch create mode 100644 examples/AlanBasicExample/platforms/ios/AlanBasicExample/Bridging-Header.h create mode 100644 examples/AlanBasicExample/platforms/ios/AlanBasicExample/CDVLaunchScreen.storyboard create mode 100644 examples/AlanBasicExample/platforms/ios/AlanBasicExample/Classes/AppDelegate.h create mode 100644 examples/AlanBasicExample/platforms/ios/AlanBasicExample/Classes/AppDelegate.m create mode 100644 examples/AlanBasicExample/platforms/ios/AlanBasicExample/Classes/MainViewController.h create mode 100644 examples/AlanBasicExample/platforms/ios/AlanBasicExample/Classes/MainViewController.m create mode 100644 examples/AlanBasicExample/platforms/ios/AlanBasicExample/Classes/MainViewController.xib create mode 100644 examples/AlanBasicExample/platforms/ios/AlanBasicExample/Entitlements-Debug.plist create mode 100644 examples/AlanBasicExample/platforms/ios/AlanBasicExample/Entitlements-Release.plist create mode 100644 examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/Contents.json create mode 100644 examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/icon-1024.png create mode 100644 examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/icon-20.png create mode 100644 examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/icon-20@2x.png create mode 100644 examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/icon-20@3x.png create mode 100644 examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/icon-24@2x.png create mode 100644 examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/icon-27.5@2x.png create mode 100644 examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/icon-29.png create mode 100644 examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/icon-29@2x.png create mode 100644 examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/icon-29@3x.png create mode 100644 examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/icon-40.png create mode 100644 examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/icon-40@2x.png create mode 100644 examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/icon-44@2x.png create mode 100644 examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/icon-50.png create mode 100644 examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/icon-50@2x.png create mode 100644 examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/icon-60@2x.png create mode 100644 examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/icon-60@3x.png create mode 100644 examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/icon-72.png create mode 100644 examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/icon-72@2x.png create mode 100644 examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/icon-76.png create mode 100644 examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/icon-76@2x.png create mode 100644 examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/icon-83.5@2x.png create mode 100644 examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/icon-86@2x.png create mode 100644 examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/icon-98@2x.png create mode 100644 examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/icon.png create mode 100644 examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/icon@2x.png create mode 100644 examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/BackgroundColor.colorset/Contents.json create mode 100644 examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/Contents.json create mode 100644 examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/LaunchStoryboard.imageset/Contents.json create mode 100755 examples/AlanBasicExample/platforms/ios/AlanBasicExample/Scripts/copy-www-build-step.sh create mode 100644 examples/AlanBasicExample/platforms/ios/AlanBasicExample/config.xml create mode 100644 examples/AlanBasicExample/platforms/ios/AlanBasicExample/main.m create mode 100644 examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Private/CDVDebug.h create mode 100644 examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Private/CDVJSON_private.h create mode 100644 examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Private/CDVJSON_private.m create mode 100644 examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Private/CDVPlugin+Private.h create mode 100644 examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDV.h create mode 100644 examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVAppDelegate.h create mode 100644 examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVAppDelegate.m create mode 100644 examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVAvailability.h create mode 100644 examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVAvailabilityDeprecated.h create mode 100644 examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVCommandDelegate.h create mode 100644 examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVCommandDelegateImpl.h create mode 100644 examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVCommandDelegateImpl.m create mode 100644 examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVCommandQueue.h create mode 100644 examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVCommandQueue.m create mode 100644 examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVConfigParser.h create mode 100644 examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVConfigParser.m create mode 100644 examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVInvokedUrlCommand.h create mode 100644 examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVInvokedUrlCommand.m create mode 100644 examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVPlugin+Resources.h create mode 100644 examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVPlugin+Resources.m create mode 100644 examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVPlugin.h create mode 100644 examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVPlugin.m create mode 100644 examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVPluginResult.h create mode 100644 examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVPluginResult.m create mode 100644 examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVScreenOrientationDelegate.h create mode 100644 examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVTimer.h create mode 100644 examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVTimer.m create mode 100644 examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVURLSchemeHandler.h create mode 100644 examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVURLSchemeHandler.m create mode 100644 examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVViewController.h create mode 100644 examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVViewController.m create mode 100644 examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVWebViewEngineProtocol.h create mode 100644 examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVWebViewProcessPoolFactory.h create mode 100644 examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVWebViewProcessPoolFactory.m create mode 100644 examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVWhitelist.h create mode 100644 examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVWhitelist.m create mode 100644 examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/NSDictionary+CordovaPreferences.h create mode 100644 examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/NSDictionary+CordovaPreferences.m create mode 100644 examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/NSMutableArray+QueueAdditions.h create mode 100644 examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/NSMutableArray+QueueAdditions.m create mode 100644 examples/AlanBasicExample/platforms/ios/CordovaLib/CordovaLib.xcodeproj/project.pbxproj create mode 100644 examples/AlanBasicExample/platforms/ios/CordovaLib/CordovaLib.xcodeproj/xcuserdata/sergeyyuryev.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 examples/AlanBasicExample/platforms/ios/CordovaLib/CordovaLib_Prefix.pch create mode 100644 examples/AlanBasicExample/platforms/ios/CordovaLib/VERSION create mode 100644 examples/AlanBasicExample/platforms/ios/CordovaLib/cordova.js create mode 100644 examples/AlanBasicExample/platforms/ios/Podfile create mode 100644 examples/AlanBasicExample/platforms/ios/cordova/Api.js create mode 100755 examples/AlanBasicExample/platforms/ios/cordova/apple_ios_version create mode 100755 examples/AlanBasicExample/platforms/ios/cordova/apple_osx_version create mode 100755 examples/AlanBasicExample/platforms/ios/cordova/apple_xcode_version create mode 100755 examples/AlanBasicExample/platforms/ios/cordova/build create mode 100644 examples/AlanBasicExample/platforms/ios/cordova/build-debug.xcconfig create mode 100644 examples/AlanBasicExample/platforms/ios/cordova/build-extras.xcconfig create mode 100644 examples/AlanBasicExample/platforms/ios/cordova/build-release.xcconfig create mode 100755 examples/AlanBasicExample/platforms/ios/cordova/build.bat create mode 100644 examples/AlanBasicExample/platforms/ios/cordova/build.xcconfig create mode 100755 examples/AlanBasicExample/platforms/ios/cordova/check_reqs create mode 100755 examples/AlanBasicExample/platforms/ios/cordova/check_reqs.bat create mode 100755 examples/AlanBasicExample/platforms/ios/cordova/clean create mode 100755 examples/AlanBasicExample/platforms/ios/cordova/clean.bat create mode 100644 examples/AlanBasicExample/platforms/ios/cordova/defaults.xml create mode 100644 examples/AlanBasicExample/platforms/ios/cordova/lib/BridgingHeader.js create mode 100644 examples/AlanBasicExample/platforms/ios/cordova/lib/Podfile.js create mode 100644 examples/AlanBasicExample/platforms/ios/cordova/lib/PodsJson.js create mode 100644 examples/AlanBasicExample/platforms/ios/cordova/lib/build.js create mode 100644 examples/AlanBasicExample/platforms/ios/cordova/lib/check_reqs.js create mode 100644 examples/AlanBasicExample/platforms/ios/cordova/lib/clean.js create mode 100755 examples/AlanBasicExample/platforms/ios/cordova/lib/list-devices create mode 100755 examples/AlanBasicExample/platforms/ios/cordova/lib/list-emulator-build-targets create mode 100755 examples/AlanBasicExample/platforms/ios/cordova/lib/list-emulator-images create mode 100755 examples/AlanBasicExample/platforms/ios/cordova/lib/list-started-emulators create mode 100644 examples/AlanBasicExample/platforms/ios/cordova/lib/listDevices.js create mode 100644 examples/AlanBasicExample/platforms/ios/cordova/lib/listEmulatorBuildTargets.js create mode 100644 examples/AlanBasicExample/platforms/ios/cordova/lib/listEmulatorImages.js create mode 100644 examples/AlanBasicExample/platforms/ios/cordova/lib/listStartedEmulators.js create mode 100644 examples/AlanBasicExample/platforms/ios/cordova/lib/plugman/pluginHandlers.js create mode 100644 examples/AlanBasicExample/platforms/ios/cordova/lib/prepare.js create mode 100644 examples/AlanBasicExample/platforms/ios/cordova/lib/projectFile.js create mode 100644 examples/AlanBasicExample/platforms/ios/cordova/lib/run.js create mode 100755 examples/AlanBasicExample/platforms/ios/cordova/lib/start-emulator create mode 100644 examples/AlanBasicExample/platforms/ios/cordova/lib/versions.js create mode 100755 examples/AlanBasicExample/platforms/ios/cordova/log create mode 100755 examples/AlanBasicExample/platforms/ios/cordova/log.bat create mode 100644 examples/AlanBasicExample/platforms/ios/cordova/loggingHelper.js create mode 100755 examples/AlanBasicExample/platforms/ios/cordova/run create mode 100755 examples/AlanBasicExample/platforms/ios/cordova/run.bat create mode 100755 examples/AlanBasicExample/platforms/ios/cordova/version create mode 100755 examples/AlanBasicExample/platforms/ios/cordova/version.bat create mode 100644 examples/AlanBasicExample/platforms/ios/ios.json create mode 100644 examples/AlanBasicExample/platforms/ios/platform_www/cordova-js-src/exec.js create mode 100644 examples/AlanBasicExample/platforms/ios/platform_www/cordova-js-src/platform.js create mode 100644 examples/AlanBasicExample/platforms/ios/platform_www/cordova-js-src/plugin/ios/console.js create mode 100644 examples/AlanBasicExample/platforms/ios/platform_www/cordova-js-src/plugin/ios/launchscreen.js create mode 100644 examples/AlanBasicExample/platforms/ios/platform_www/cordova-js-src/plugin/ios/logger.js create mode 100644 examples/AlanBasicExample/platforms/ios/platform_www/cordova-js-src/plugin/ios/wkwebkit.js create mode 100644 examples/AlanBasicExample/platforms/ios/platform_www/cordova.js create mode 100644 examples/AlanBasicExample/platforms/ios/platform_www/cordova_plugins.js create mode 100644 examples/AlanBasicExample/platforms/ios/pods-debug.xcconfig create mode 100644 examples/AlanBasicExample/platforms/ios/pods-release.xcconfig create mode 100644 examples/AlanBasicExample/platforms/ios/pods.json diff --git a/.circleci/config.yml b/.circleci/config.yml index 4221906..bb8e284 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -85,12 +85,9 @@ jobs: - run: name: Install Dependencies command: cd examples/AlanBasicExample && npm install - - run: - name: Add platfrom iOS - command: sudo cd examples/AlanBasicExample && cordova platform add ios - run: name: Build AlanBasicExample for iOS - command: sudo cd examples/AlanBasicExample && cordova build ios + command: cd examples/AlanBasicExample && cordova build ios - save_cache: key: node-modules-cache paths: diff --git a/examples/AlanBasicExample/.gitignore b/examples/AlanBasicExample/.gitignore index 07727ce..a8ed252 100644 --- a/examples/AlanBasicExample/.gitignore +++ b/examples/AlanBasicExample/.gitignore @@ -1,4 +1,3 @@ node_modules/ -platforms/ios plugins/ www/ diff --git a/examples/AlanBasicExample/package-lock.json b/examples/AlanBasicExample/package-lock.json index 164ead6..d70e4b1 100644 --- a/examples/AlanBasicExample/package-lock.json +++ b/examples/AlanBasicExample/package-lock.json @@ -9,6 +9,43 @@ "resolved": "https://registry.npmjs.org/@alan-ai/cordova-plugin-alan-voice/-/cordova-plugin-alan-voice-1.6.1.tgz", "integrity": "sha512-XxEMtqaIwSmcGZeF5iHkd9FSMK2wnaCmMDPoztW6dXWLhy2ydbtFYgrWNBzZeouGy5zjXbJIEXCroVZ4hjfCug==" }, + "@netflix/nerror": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@netflix/nerror/-/nerror-1.1.3.tgz", + "integrity": "sha512-b+MGNyP9/LXkapreJzNUzcvuzZslj/RGgdVVJ16P2wSlYatfLycPObImqVJSmNAdyeShvNeM/pl3sVZsObFueg==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "extsprintf": "^1.4.0", + "lodash": "^4.17.15" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -32,6 +69,18 @@ "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=" }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true + }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -47,6 +96,15 @@ "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.48.tgz", "integrity": "sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w==" }, + "bplist-creator": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.0.8.tgz", + "integrity": "sha512-Za9JKzD6fjLC16oX2wsXfc+qBEhJBJB1YPInoAQpMLhDuj5aVOv1baGeIQSq1Fr3OCqzvsoQcSBSwGId/Ja2PA==", + "dev": true, + "requires": { + "stream-buffers": "~2.2.0" + } + }, "bplist-parser": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.1.1.tgz", @@ -64,6 +122,15 @@ "concat-map": "0.0.1" } }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, "compare-func": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-1.3.4.tgz", @@ -112,6 +179,150 @@ "which": "^1.3.0" } }, + "cordova-ios": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/cordova-ios/-/cordova-ios-6.2.0.tgz", + "integrity": "sha512-sLjZg2QBI1SpQVwfe0MSn89YNVkBGLW9Q1vcFJBsqKBrhvoEOJ5Ytq0gwqdhgTOGzlwJUfxC6OHM3jcsRjtYrw==", + "dev": true, + "requires": { + "cordova-common": "^4.0.2", + "fs-extra": "^9.1.0", + "ios-sim": "^8.0.2", + "nopt": "^5.0.0", + "plist": "^3.0.1", + "semver": "^7.3.4", + "unorm": "^1.6.0", + "which": "^2.0.2", + "xcode": "^3.0.1", + "xml-escape": "^1.1.0" + }, + "dependencies": { + "bplist-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", + "dev": true, + "requires": { + "big-integer": "^1.6.44" + } + }, + "cordova-common": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cordova-common/-/cordova-common-4.0.2.tgz", + "integrity": "sha512-od7aNShyuBajzPY83mUEO8tERwwWdFklXETHiXP5Ft87CWeo/tSuwNPFztyTy8XYc74yXdogXKPTJeUHuVzB8Q==", + "dev": true, + "requires": { + "@netflix/nerror": "^1.1.3", + "ansi": "^0.3.1", + "bplist-parser": "^0.2.0", + "cross-spawn": "^7.0.1", + "elementtree": "^0.1.7", + "endent": "^1.4.1", + "fast-glob": "^3.2.2", + "fs-extra": "^9.0.0", + "glob": "^7.1.6", + "plist": "^3.0.1", + "q": "^1.5.1", + "read-chunk": "^3.2.0", + "strip-bom": "^4.0.0", + "underscore": "^1.9.2" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, "cordova-plugin-whitelist": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/cordova-plugin-whitelist/-/cordova-plugin-whitelist-1.3.4.tgz", @@ -161,11 +372,48 @@ "objectorarray": "^1.0.4" } }, + "extsprintf": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.0.tgz", + "integrity": "sha1-4mifjzVvrWLMplo6kcXfX5VRaS8=", + "dev": true + }, + "fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, "fast-json-parse": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/fast-json-parse/-/fast-json-parse-1.0.3.tgz", "integrity": "sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw==" }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, "fs-extra": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", @@ -194,6 +442,15 @@ "path-is-absolute": "^1.0.0" } }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, "graceful-fs": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", @@ -213,6 +470,56 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "ios-sim": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/ios-sim/-/ios-sim-8.0.2.tgz", + "integrity": "sha512-P7nEG771bfd+JoMRjnis1gpZOkjTUUxu+4Ek1Z+eoaEEoT9byllU9pxfQ8Df7hL3gSkIQxNwTSLhos2I8tWUQA==", + "dev": true, + "requires": { + "bplist-parser": "^0.0.6", + "nopt": "1.0.9", + "plist": "^3.0.1", + "simctl": "^2" + }, + "dependencies": { + "bplist-parser": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.0.6.tgz", + "integrity": "sha1-ONo0cYF9+dRKs4kuJ3B7u9daEbk=", + "dev": true + }, + "nopt": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.9.tgz", + "integrity": "sha1-O8DXy6e/sNWmdtvtfA6+SKT9RU4=", + "dev": true, + "requires": { + "abbrev": "1" + } + } + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, "is-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", @@ -231,6 +538,37 @@ "graceful-fs": "^4.1.6" } }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -285,6 +623,18 @@ "os-tmpdir": "^1.0.0" } }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -295,6 +645,18 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" }, + "picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, "plist": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.1.tgz", @@ -318,6 +680,37 @@ "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "read-chunk": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-3.2.0.tgz", + "integrity": "sha512-CEjy9LCzhmD7nUpJ1oVOE6s/hBkejlcJEgLQHVnQznOSilOPb+kpKktlLfFDK3/WP43+F80xkUTM2VOkYoSYvQ==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "with-open-file": "^0.1.6" + } + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, "sax": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.1.4.tgz", @@ -346,6 +739,52 @@ "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.5.3.tgz", "integrity": "sha1-xUmCuZbHbvDB5rWfvcWCX1txMRM=" }, + "simctl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simctl/-/simctl-2.0.0.tgz", + "integrity": "sha512-5rB7rN4N3b0z0nFdy9eczVssXqrv2aAgdVRksPVqVoiDtvXmfzNvebp3EMdId2sAUzXIflarQlx4P0hjVQEzKQ==", + "dev": true, + "requires": { + "shelljs": "^0.2.6", + "tail": "^0.4.0" + }, + "dependencies": { + "shelljs": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.2.6.tgz", + "integrity": "sha1-kEktcv/MgVmXa6umL7D2iE8MM3g=", + "dev": true + } + } + }, + "simple-plist": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.1.1.tgz", + "integrity": "sha512-pKMCVKvZbZTsqYR6RKgLfBHkh2cV89GXcA/0CVPje3sOiNOnXA8+rp/ciAMZ7JRaUdLzlEM6JFfUn+fS6Nt3hg==", + "dev": true, + "requires": { + "bplist-creator": "0.0.8", + "bplist-parser": "0.2.0", + "plist": "^3.0.1" + }, + "dependencies": { + "bplist-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", + "dev": true, + "requires": { + "big-integer": "^1.6.44" + } + } + } + }, + "stream-buffers": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", + "integrity": "sha1-kdX1Ew0c75bc+n9yaUUYh0HQnuQ=", + "dev": true + }, "string.prototype.codepointat": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/string.prototype.codepointat/-/string.prototype.codepointat-0.2.1.tgz", @@ -356,6 +795,21 @@ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" }, + "tail": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/tail/-/tail-0.4.0.tgz", + "integrity": "sha1-0p3nJ1DMmdseBTr/E8NZ7PtxMAI=", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, "underscore": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.11.0.tgz", @@ -366,6 +820,18 @@ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" }, + "unorm": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz", + "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==", + "dev": true + }, + "uuid": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", + "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", + "dev": true + }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -374,11 +840,38 @@ "isexe": "^2.0.0" } }, + "with-open-file": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/with-open-file/-/with-open-file-0.1.7.tgz", + "integrity": "sha512-ecJS2/oHtESJ1t3ZfMI3B7KIDKyfN0O16miWxdn30zdh66Yd3LsRFebXZXq6GU4xfxLf6nVxp9kIqElb5fqczA==", + "dev": true, + "requires": { + "p-finally": "^1.0.0", + "p-try": "^2.1.0", + "pify": "^4.0.1" + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, + "xcode": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/xcode/-/xcode-3.0.1.tgz", + "integrity": "sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==", + "dev": true, + "requires": { + "simple-plist": "^1.1.0", + "uuid": "^7.0.3" + } + }, + "xml-escape": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xml-escape/-/xml-escape-1.1.0.tgz", + "integrity": "sha1-OQTBQ/qOs6ADDsZG0pAqLxtwbEQ=", + "dev": true + }, "xmlbuilder": { "version": "9.0.7", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", @@ -388,6 +881,12 @@ "version": "0.1.31", "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz", "integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true } } } diff --git a/examples/AlanBasicExample/package.json b/examples/AlanBasicExample/package.json index d6fb3bc..522eb53 100644 --- a/examples/AlanBasicExample/package.json +++ b/examples/AlanBasicExample/package.json @@ -17,6 +17,7 @@ "cordova-android": "^8.1.0" }, "devDependencies": { + "cordova-ios": "^6.2.0", "cordova-plugin-whitelist": "^1.3.4" }, "cordova": { @@ -25,7 +26,8 @@ "cordova-plugin-alan-voice": {} }, "platforms": [ - "android" + "android", + "ios" ] } } \ No newline at end of file diff --git a/examples/AlanBasicExample/platforms/ios/.gitignore b/examples/AlanBasicExample/platforms/ios/.gitignore new file mode 100644 index 0000000..cc76483 --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/.gitignore @@ -0,0 +1,5 @@ +*.mode1v3 +*.perspectivev3 +*.pbxuser +.DS_Store +build/ diff --git a/examples/AlanBasicExample/platforms/ios/AlanBasicExample.xcodeproj/project.pbxproj b/examples/AlanBasicExample/platforms/ios/AlanBasicExample.xcodeproj/project.pbxproj new file mode 100755 index 0000000..79981d9 --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/AlanBasicExample.xcodeproj/project.pbxproj @@ -0,0 +1,502 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 52; + objects = { + +/* Begin PBXBuildFile section */ + 0207DA581B56EA530066E2B4 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0207DA571B56EA530066E2B4 /* Images.xcassets */; }; + 03C1F64602F44855BFBC7176 /* AlanVoice.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D52F47D6C9444B881F2055C /* AlanVoice.m */; }; + 1D3623260D0F684500981E51 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D3623250D0F684500981E51 /* AppDelegate.m */; }; + 1D60589B0D05DD56006BFB54 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; }; + 301BF552109A68D80062928A /* libCordova.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 301BF535109A57CC0062928A /* libCordova.a */; settings = {ATTRIBUTES = (Required, ); }; }; + 302D95F114D2391D003F00A1 /* MainViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 302D95EF14D2391D003F00A1 /* MainViewController.m */; }; + 302D95F214D2391D003F00A1 /* MainViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 302D95F014D2391D003F00A1 /* MainViewController.xib */; }; + 46EDB6F7B51D4DA19920F6BD /* AlanSDK.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 894142233D354985976491E6 /* AlanSDK.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + 6AFF5BF91D6E424B00AB3073 /* CDVLaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6AFF5BF81D6E424B00AB3073 /* CDVLaunchScreen.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 301BF534109A57CC0062928A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 301BF52D109A57CC0062928A /* CordovaLib.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = D2AAC07E0554694100DB518D; + remoteInfo = CordovaLib; + }; + 301BF550109A68C00062928A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 301BF52D109A57CC0062928A /* CordovaLib.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = D2AAC07D0554694100DB518D; + remoteInfo = CordovaLib; + }; + 907D8123214C687600058A10 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 301BF52D109A57CC0062928A /* CordovaLib.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = C0C01EB21E3911D50056E6CB; + remoteInfo = Cordova; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + E5FF65D36CA14F35AF6CC04E /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 46EDB6F7B51D4DA19920F6BD /* AlanSDK.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 0207DA571B56EA530066E2B4 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = AlanBasicExample/Images.xcassets; sourceTree = SOURCE_ROOT; }; + 1D3623240D0F684500981E51 /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + 1D3623250D0F684500981E51 /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + 1D6058910D05DD3D006BFB54 /* AlanBasicExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AlanBasicExample.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 301BF52D109A57CC0062928A /* CordovaLib.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = CordovaLib.xcodeproj; path = CordovaLib/CordovaLib.xcodeproj; sourceTree = ""; }; + 301BF56E109A69640062928A /* www */ = {isa = PBXFileReference; lastKnownFileType = folder; path = www; sourceTree = SOURCE_ROOT; }; + 302D95EE14D2391D003F00A1 /* MainViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MainViewController.h; sourceTree = ""; }; + 302D95EF14D2391D003F00A1 /* MainViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MainViewController.m; sourceTree = ""; }; + 302D95F014D2391D003F00A1 /* MainViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MainViewController.xib; sourceTree = ""; }; + 3047A50F1AB8059700498E2A /* build-debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = "build-debug.xcconfig"; path = "cordova/build-debug.xcconfig"; sourceTree = SOURCE_ROOT; }; + 3047A5101AB8059700498E2A /* build-release.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = "build-release.xcconfig"; path = "cordova/build-release.xcconfig"; sourceTree = SOURCE_ROOT; }; + 3047A5111AB8059700498E2A /* build.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = build.xcconfig; path = cordova/build.xcconfig; sourceTree = SOURCE_ROOT; }; + 32CA4F630368D1EE00C91783 /* AlanBasicExample-Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "AlanBasicExample-Prefix.pch"; sourceTree = ""; }; + 332BF9BA9C7149B49B9C70CD /* AlanVersion.h */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.c.h; name = AlanVersion.h; path = "cordova-plugin-alan-voice/AlanVersion.h"; sourceTree = ""; }; + 34A4A69241C341B08FF4CCE0 /* AlanVoice.h */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.c.h; name = AlanVoice.h; path = "cordova-plugin-alan-voice/AlanVoice.h"; sourceTree = ""; }; + 6AFF5BF81D6E424B00AB3073 /* CDVLaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = CDVLaunchScreen.storyboard; path = AlanBasicExample/CDVLaunchScreen.storyboard; sourceTree = SOURCE_ROOT; }; + 7D52F47D6C9444B881F2055C /* AlanVoice.m */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.c.objc; name = AlanVoice.m; path = "cordova-plugin-alan-voice/AlanVoice.m"; sourceTree = ""; }; + 894142233D354985976491E6 /* AlanSDK.framework */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = wrapper.framework; name = AlanSDK.framework; path = "AlanBasicExample/Plugins/cordova-plugin-alan-voice/AlanSDK.framework"; sourceTree = ""; }; + 8D1107310486CEB800E47090 /* AlanBasicExample-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = "AlanBasicExample-Info.plist"; path = "AlanBasicExample/AlanBasicExample-Info.plist"; plistStructureDefinitionIdentifier = "com.apple.xcode.plist.structure-definition.iphone.info-plist"; sourceTree = SOURCE_ROOT; }; + EB87FDF31871DA8E0020F90C /* www */ = {isa = PBXFileReference; lastKnownFileType = folder; name = www; path = ../../www; sourceTree = ""; }; + EB87FDF41871DAF40020F90C /* config.xml */ = {isa = PBXFileReference; lastKnownFileType = text.xml; name = config.xml; path = ../../config.xml; sourceTree = ""; }; + ED33DF2A687741AEAF9F8254 /* Bridging-Header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "Bridging-Header.h"; sourceTree = ""; }; + F840E1F0165FE0F500CFE078 /* config.xml */ = {isa = PBXFileReference; lastKnownFileType = text.xml; name = config.xml; path = AlanBasicExample/config.xml; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 1D60588F0D05DD3D006BFB54 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 301BF552109A68D80062928A /* libCordova.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 080E96DDFE201D6D7F000001 /* Classes */ = { + isa = PBXGroup; + children = ( + 302D95EE14D2391D003F00A1 /* MainViewController.h */, + 302D95EF14D2391D003F00A1 /* MainViewController.m */, + 302D95F014D2391D003F00A1 /* MainViewController.xib */, + 1D3623240D0F684500981E51 /* AppDelegate.h */, + 1D3623250D0F684500981E51 /* AppDelegate.m */, + ); + name = Classes; + path = AlanBasicExample/Classes; + sourceTree = SOURCE_ROOT; + }; + 19C28FACFE9D520D11CA2CBB /* Products */ = { + isa = PBXGroup; + children = ( + 1D6058910D05DD3D006BFB54 /* AlanBasicExample.app */, + ); + name = Products; + sourceTree = ""; + }; + 29B97314FDCFA39411CA2CEA /* CustomTemplate */ = { + isa = PBXGroup; + children = ( + EB87FDF41871DAF40020F90C /* config.xml */, + EB87FDF31871DA8E0020F90C /* www */, + EB87FDF11871DA420020F90C /* Staging */, + 301BF52D109A57CC0062928A /* CordovaLib.xcodeproj */, + 080E96DDFE201D6D7F000001 /* Classes */, + 307C750510C5A3420062BCA9 /* Plugins */, + 29B97315FDCFA39411CA2CEA /* Other Sources */, + 29B97317FDCFA39411CA2CEA /* Resources */, + 29B97323FDCFA39411CA2CEA /* Frameworks */, + 19C28FACFE9D520D11CA2CBB /* Products */, + ); + name = CustomTemplate; + sourceTree = ""; + }; + 29B97315FDCFA39411CA2CEA /* Other Sources */ = { + isa = PBXGroup; + children = ( + 32CA4F630368D1EE00C91783 /* AlanBasicExample-Prefix.pch */, + 29B97316FDCFA39411CA2CEA /* main.m */, + ED33DF2A687741AEAF9F8254 /* Bridging-Header.h */, + ); + name = "Other Sources"; + path = AlanBasicExample; + sourceTree = ""; + }; + 29B97317FDCFA39411CA2CEA /* Resources */ = { + isa = PBXGroup; + children = ( + 0207DA571B56EA530066E2B4 /* Images.xcassets */, + 3047A50E1AB8057F00498E2A /* config */, + 8D1107310486CEB800E47090 /* AlanBasicExample-Info.plist */, + 6AFF5BF81D6E424B00AB3073 /* CDVLaunchScreen.storyboard */, + ); + name = Resources; + path = AlanBasicExample/Resources; + sourceTree = ""; + }; + 29B97323FDCFA39411CA2CEA /* Frameworks */ = { + isa = PBXGroup; + children = ( + 894142233D354985976491E6 /* AlanSDK.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 301BF52E109A57CC0062928A /* Products */ = { + isa = PBXGroup; + children = ( + 301BF535109A57CC0062928A /* libCordova.a */, + 907D8124214C687600058A10 /* Cordova.framework */, + ); + name = Products; + sourceTree = ""; + }; + 3047A50E1AB8057F00498E2A /* config */ = { + isa = PBXGroup; + children = ( + 3047A50F1AB8059700498E2A /* build-debug.xcconfig */, + 3047A5101AB8059700498E2A /* build-release.xcconfig */, + 3047A5111AB8059700498E2A /* build.xcconfig */, + ); + name = config; + sourceTree = ""; + }; + 307C750510C5A3420062BCA9 /* Plugins */ = { + isa = PBXGroup; + children = ( + 7D52F47D6C9444B881F2055C /* AlanVoice.m */, + 34A4A69241C341B08FF4CCE0 /* AlanVoice.h */, + 332BF9BA9C7149B49B9C70CD /* AlanVersion.h */, + ); + name = Plugins; + path = AlanBasicExample/Plugins; + sourceTree = SOURCE_ROOT; + }; + EB87FDF11871DA420020F90C /* Staging */ = { + isa = PBXGroup; + children = ( + F840E1F0165FE0F500CFE078 /* config.xml */, + 301BF56E109A69640062928A /* www */, + ); + name = Staging; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 1D6058900D05DD3D006BFB54 /* AlanBasicExample */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "AlanBasicExample" */; + buildPhases = ( + 304B58A110DAC018002A0835 /* Copy www directory */, + 1D60588D0D05DD3D006BFB54 /* Resources */, + 1D60588E0D05DD3D006BFB54 /* Sources */, + 1D60588F0D05DD3D006BFB54 /* Frameworks */, + E5FF65D36CA14F35AF6CC04E /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 301BF551109A68C00062928A /* PBXTargetDependency */, + ); + name = AlanBasicExample; + productName = AlanBasicExample; + productReference = 1D6058910D05DD3D006BFB54 /* AlanBasicExample.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 29B97313FDCFA39411CA2CEA /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1130; + }; + buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "AlanBasicExample" */; + compatibilityVersion = "Xcode 11.0"; + developmentRegion = en; + hasScannedForEncodings = 1; + knownRegions = ( + en, + Base, + ); + mainGroup = 29B97314FDCFA39411CA2CEA /* CustomTemplate */; + projectDirPath = ""; + projectReferences = ( + { + ProductGroup = 301BF52E109A57CC0062928A /* Products */; + ProjectRef = 301BF52D109A57CC0062928A /* CordovaLib.xcodeproj */; + }, + ); + projectRoot = ""; + targets = ( + 1D6058900D05DD3D006BFB54 /* AlanBasicExample */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXReferenceProxy section */ + 301BF535109A57CC0062928A /* libCordova.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libCordova.a; + remoteRef = 301BF534109A57CC0062928A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 907D8124214C687600058A10 /* Cordova.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = Cordova.framework; + remoteRef = 907D8123214C687600058A10 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; +/* End PBXReferenceProxy section */ + +/* Begin PBXResourcesBuildPhase section */ + 1D60588D0D05DD3D006BFB54 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 302D95F214D2391D003F00A1 /* MainViewController.xib in Resources */, + 0207DA581B56EA530066E2B4 /* Images.xcassets in Resources */, + 6AFF5BF91D6E424B00AB3073 /* CDVLaunchScreen.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 304B58A110DAC018002A0835 /* Copy www directory */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Copy www directory"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"$SRCROOT/AlanBasicExample/Scripts/copy-www-build-step.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 1D60588E0D05DD3D006BFB54 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 1D60589B0D05DD56006BFB54 /* main.m in Sources */, + 1D3623260D0F684500981E51 /* AppDelegate.m in Sources */, + 302D95F114D2391D003F00A1 /* MainViewController.m in Sources */, + 03C1F64602F44855BFBC7176 /* AlanVoice.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 301BF551109A68C00062928A /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = CordovaLib; + targetProxy = 301BF550109A68C00062928A /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 1D6058940D05DD3E006BFB54 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 3047A50F1AB8059700498E2A /* build-debug.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + COPY_PHASE_STRIP = NO; + DEVELOPMENT_TEAM = 32A9L53S2G; + EXCLUDED_ARCHS = ""; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "\"AlanBasicExample/Plugins/cordova-plugin-alan-voice\"", + ); + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "AlanBasicExample/AlanBasicExample-Prefix.pch"; + GCC_THUMB_SUPPORT = NO; + GCC_VERSION = ""; + INFOPLIST_FILE = "AlanBasicExample/AlanBasicExample-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = app.alan.cordovaexample; + PRODUCT_NAME = "$(TARGET_NAME)"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_WORKSPACE = NO; + }; + name = Debug; + }; + 1D6058950D05DD3E006BFB54 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 3047A5101AB8059700498E2A /* build-release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = YES; + DEVELOPMENT_TEAM = ""; + EXCLUDED_ARCHS = ""; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "\"AlanBasicExample/Plugins/cordova-plugin-alan-voice\"", + ); + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "AlanBasicExample/AlanBasicExample-Prefix.pch"; + GCC_THUMB_SUPPORT = NO; + GCC_VERSION = ""; + INFOPLIST_FILE = "AlanBasicExample/AlanBasicExample-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; + LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = app.alan.cordovaexample; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_WORKSPACE = NO; + }; + name = Release; + }; + C01FCF4F08A954540054247B /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 3047A5111AB8059700498E2A /* build.xcconfig */; + buildSettings = { + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + 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_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_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; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = c99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_THUMB_SUPPORT = NO; + GCC_VERSION = ""; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SKIP_INSTALL = NO; + WK_WEB_VIEW_ONLY = 1; + }; + name = Debug; + }; + C01FCF5008A954540054247B /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 3047A5111AB8059700498E2A /* build.xcconfig */; + buildSettings = { + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + 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_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_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; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = c99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_THUMB_SUPPORT = NO; + GCC_VERSION = ""; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + SDKROOT = iphoneos; + SKIP_INSTALL = NO; + WK_WEB_VIEW_ONLY = 1; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 1D6058960D05DD3E006BFB54 /* Build configuration list for PBXNativeTarget "AlanBasicExample" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1D6058940D05DD3E006BFB54 /* Debug */, + 1D6058950D05DD3E006BFB54 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + C01FCF4E08A954540054247B /* Build configuration list for PBXProject "AlanBasicExample" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C01FCF4F08A954540054247B /* Debug */, + C01FCF5008A954540054247B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; +} diff --git a/examples/AlanBasicExample/platforms/ios/AlanBasicExample.xcworkspace/contents.xcworkspacedata b/examples/AlanBasicExample/platforms/ios/AlanBasicExample.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..4ec6d9b --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/AlanBasicExample.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/examples/AlanBasicExample/platforms/ios/AlanBasicExample.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/examples/AlanBasicExample/platforms/ios/AlanBasicExample.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/AlanBasicExample.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/examples/AlanBasicExample/platforms/ios/AlanBasicExample.xcworkspace/xcshareddata/xcschemes/AlanBasicExample.xcscheme b/examples/AlanBasicExample/platforms/ios/AlanBasicExample.xcworkspace/xcshareddata/xcschemes/AlanBasicExample.xcscheme new file mode 100644 index 0000000..95bc613 --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/AlanBasicExample.xcworkspace/xcshareddata/xcschemes/AlanBasicExample.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/AlanBasicExample/platforms/ios/AlanBasicExample.xcworkspace/xcuserdata/sergeyyuryev.xcuserdatad/UserInterfaceState.xcuserstate b/examples/AlanBasicExample/platforms/ios/AlanBasicExample.xcworkspace/xcuserdata/sergeyyuryev.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..6ef5557fab6edf71bfbf6189da97fcfd7e1d321a GIT binary patch literal 25769 zcmeIacVJUh*gt;GU2SDF-HYy)HkGzX)1*mDOS9UhZQ9TgHZ`=NL`qYV6sUlnt0E3? z?@3!k1r!tzwi5ge}BAU+vJ{epR=Cx%+EP< zx;k85pF*(@VMHMsF^EMR3PR^i%~<60cwO$!X&DYr>pT~HYs&DsyQXHi=UnJ)^?Ab) zzG6*_EVQn%#@XX+)B7vEi-J)|bED7Ua}vBMjEX>`&}bBcVo@AAA5B2HC=cZ$1yZ5{ zq(T-{jcQOWvZ6Xvk8Ef%YCw&s6}2HJnv2@eJmf;%Xc1bBmY^QA99@PkM^~e3&~@l~ zbPKv2twFu04?Ti5q0Q(~^cdQLwxY+;PV_q3h2BN`(R=6s`Vf7DzC+)mAJC8J82Slq zN57zd&?$^C#uTP8gIUbs5PTjUgX3^KPQc@EBG%zzT!JU!Qe1{7;c~3U25iJ8Y{pf% z2G`-qxB)lfCOjR_z_W1+cH+6X6T5L2z8YVHSK-z8T6`V89^Zg(#5dua@h$ic^eVmw z-;3|VYw$+=Fn$z2iJ!vH;_diF{1Sc*zlC?DwRo{Pvuehl!8)H1(b#=rpl;Fs*Y-)?9>!$Dm9auOSMz;C>OPW z@=`vko4SM|6i;1BT}E9_T}jmO9N2#sUHtIR*d1@#1 z0`&^@Dz%r|NA0KHqYhA?Q(sVDQeRO=sH4;|>L==V>JRE~I*1OYL+JD9QFIg?O~=zI zbS9loD`+KMLQkYiX+3SGXV5e0S@dkWg}#7x&~xZkx{dCn-Eucoh| zucNQ0AEY0m*V7y5jr7CxBlISEGyN$282tpjo!&veM88b$qTi->(|hQ>^gj9{`Vjpw z{Tux|{RjOg{TF?LK1u&g|3jZ*5W_H|n95|hkiG1*Kxqh}0^kufo5 zrh=(tsu&AX&D1f?jGdXnOl4*>ElfKzk8v>z84q(ca}BeKS z+|Jy`tYOwM4=|gU&CH|BW6T!j8Rl8$CFV8eb>;x`KJx){kol1Lh&jak$Q)ySVt!_R zVSZ(fGruu^G5;{9Sc+xY5OxeZmJMfP*jP4=O=mOMOm;k*#h%ZWuoKx*wv3&`ma}@+ z#x}Bcb{adAZDHrIPIewUpY3E9vOabRyOibGOWDiVYuHunYW8~e2KFxYZgvfOKf8|I z%s$FK#%^JsWM5@>vG1^Z+4tCk>>>7Z_6zn0_Gk7N_ILIV_9Xi^M{^7p%*nV2E|yE; z(zt9cms4;Wu9z$5D!59nio1YwaC5j;u8nhYbGdeI9_QjN*M;lwcG>TliX9>HtuQe8SYu`dG1B-CGIuu zZEg>@zd56`yQ5<-8iU57P$WYUD0)g=W8Qpck9Ru!^~)T4Mr((|>+M5fD4bA)?n99% ziZDDzB(p`9q1705I+da#*K9Nu9)DCYr`fX1Ojl!TH|3Q8p`;Ybh(CL!cJGU@@8jxtat8V^;n zQ6?Ep#*ixV4^)YPzY}H))Lorz?!^@z#{y@ItZZm=O^!K6cc;(e?&xrOTJ$=tS*_J; za@D#bb#7syTAiy?6dH0hDsz!hrLQPd7>inD;|D0h+XjbcioGioi4yY~)Ws}3_XptpDReh@ur24>24DXsOZm?CiyJL>S zV+pj{B8wd?6MHnIC}!!>0>y+Bt$O){l%>i-1$-{jDV8q}%x@toLpcv2HPWCWq(wSZ zj7rc%R7%E@P$DB?B%DN$ND@V&AA;E}M|xyHMr1-}_*Mxs97`6EPO^}Ah!4IkCKFm@ zGU!d?Jon-{$0Ap|1I8*n8u+UBIAO$LP^;PJ>Tvm7PVW>~n{S>}&C==Z0(Iv03|1R> zQ>-@A?s6_RIp=h@x5JXjBCO5@Zck68$I&%!@M)kA11-#g=FDv_Ki!bP@SD&Kl(P;s zBRiUcrlM(RI*B9kB!P@0i6m(qnu%ti*-(4|a*$+_OY~6OOr{INOqts1Zgb`V-5QrK zZ=jEP0}I$9OE^oF3gE}Hm)5%5y)ZwG&JLIdXWIZ}(Cw8TcXyXm0G0sMN<2#o7O%J4 z=?#qXLgYp{Ytekvffk@nl0s5R8cAP^y3j)8L0u$+j3-&}8%7mb;p*@?JtAuwdaN)) zuqL24wGOXupeMrP7Fl$2=iCu1$4WGuZOxY9bOQak2rWg?Yu1p=J?LU|2_lG}E(wxO z*r8LUk52E*x<-==_Jq6B;pypvT9;0(YpfTI9f{?K^{3GdtOOMUZLB~mQFJf5f@Jri zD~Vi?N5VE4@tr*&;#Q&6=-L)pJS?iPH*JC$*5K^&IK3c^96~S1`6Q=4j18U>FwrnY zGi=KRbEmm{&IRH~frUXH`t+@>POsP527B8%+uJHg7n|D)obK+N<@GPC1>W&)l0|Z3 z!ebIrGUT}hnvzMz%IdntDKqv21&54o>T>wzO#@DGE~#>L`uffr1=RH&j!uKa>uNPG zaV+Qp5wdvkVj12uHdGciQrpfYU5-w{XcT*=(!Y3p8rDB8 zYWfI-?Y8bY9j?|rGiS{{_jP~bFL6igxK;H^pQE*J&YX1Q|F5sjnO?q7`jTG0qD%bL z+YUXL7uM?hTL1DvED5GvQB8_{iOJ=%s|KrewC^cMOA{f7QP ze`6U=#@RR*E5MDZ!B%izoY;q#<4f@s_zv8Q`|*SL8T(QRN$)HPbW zeL{x^6;D69RZu+vwQ>i#8|Cz&JJDSvkL35Ed(gc^LCOWy8Mm<8>FKdK1Tzy(B#4NeYOH6s|=N0lREK8;P1|NDh5wH=egZp!TK2|s2j7x+tcK>bb^8bg)>>`g(z8Oh#eBlN_S_AEL{B72*wqRyH(U^ zGSniA0;Onh_*&-)MoE)%iBEjLX)b(w4?TgNL{9O0VL==o`m&enNu z5AJ2pxmsO5lgr!H;pl1f3Dl>;bS)5;w8;k@BNGWYBBWT*)^DIU(Oc8N5%G!@Ny%)Z z$*%9}GJ$plo6{*R>f30y7!dI%bfOO7MlyH|Qw%Ko-#xY9vjf*$N#23v<8@GPr$1Og_=ri-5&&fZfqH zxJ$s)6daJDFN(IPp+|fp{j{W3r)wxEk7TPy! zO}ScyQk`qo>P;qtQE9FaeB8h&O%>qz78ELT3zQ~3&^8q2>I(}haw)Gc2wE+ig>{$4{G{M?Mk;s_9g zI22T37!D_PGKEYf)7GNt;FE!8Mv}lE6TC7IglQxDJ0dUUNlwpMJu|721;>82)?;=QL8!y6(@evVwuZb>iPlt2*(83h|m+lUqOYohA zhHM_!0*D&aI(ppQz7|<}m-Ic*9Wl|;Hardh6B{UYIz%F(_JWCx0A4jY=Q^MPF%%_* zuu}YwY(oCVE6nzAdfwSq#}d~9*G1yy@Co}M5Xcg#3yZ!N-->TTp?EUnEN+Jib&Ufv zRO{?)7lUU*p4lB8-A;13#O-(DyJie2>%(`WONTy~Uf<>Hv~)te(JL5);r_X(bw9aZ)v$fLXSOP7~yx*9T!9as#=Mz{)J2 z3&OrQKR;h!es4bfYIpYZbbET7i}C|g=FJyEMEMT*mFsPrpDWlw5X#ASO7SA8cxVJE zAIxnZY_J91e3$#o;=urrH2RnEE5PUAjRhJEta~4RRT%V0MPRVw*TIv0b9xu-Xlb&@ zE#&4F*^K|jp-BCG8}FV0y%p4?z;=BYO#h(|q*{CMUMXBZjGqP zzQlg-VQViwKyD`&2IT8O{3%%RAXz`chw#Vv6MPut=^f-wau>Oq+_MgUhCjz&!0)d> zq~A;KBagxFLy~9@lOz!ASx7*L;s>T)dR7H82K0`oXT7teXM%84s?MJw?2;N+XPang zCxQ~_?r0NKfems!4Nh>@ygrb#LjDCrL7geR zG(eum340%MPSD4VyDM`NTiX&Q@Q z(@|Qo1uQ?R1SVl3RSLFjYd2VEoxU^Zk*(yT5m}JZQwCtcV1Wh2MSX@m4vV_!%tfuD zEdE8clBdZN{zcs;^`>4}R2zA6a8Vn@MSbeOvZzvOmYPL5V0TipsTS%2@+{d-cJxzo zs8*_tJV)Lq9}2s3!m#O=MjhCjfh7uvaj;@?N2uN+Ju`H>Kwvn1KCtn<5}}dFgBiTY zF2P%+qQ(e?T$}`O?CP=`5BQKH{$WC(L z|Fz;v7t$s>Zk?Fw7l_m%>LOvv7gI~99`X`-nY_|ZEv1%G%gL+cHS#){V3(%GE{#6m zwW>y#y&=;c_b*dCf++%Nd1{3)jaQI223%?CD(ZSrDb&>v4PHg9rmm%~BX5$o$S(3W z*-hSAhYP721<6g_0@8avc~_L*dnFkzxzzo7vRTXsT(cXwX~DVv!^} zAE%xOB#8qe`t%*&Pd!OJC5Tb~Wcnrf>D5Ly?E+ikY3f;UUa4ou2ffsGa!`;uL-}dA z$dIB7V1rCuUHW3>P_k`@(DRiJ|&;6rQW7?!!~)Bd``ZBE%GgyFjeq`1Sf2o=nM&; zrb|AOv?s*ai{MKNB?Eq6pqclnLqanjPzNC=^AY)id`Z3{N7h1^=Mw5LIQmtv`@Z(O z`*v_}g?I}fJDiI}7rnu;Slk=1z2b+L`qRi_m>sxqSfThjs9}>6lFzO#FbCoN=wVev z>VlahG5Oa+19H^2)c3+_en*b>f}9X7yf6q9c-CMN;1>S zFFHKzjTkx>ze~=Rc^7evEfy01JS<)- zL z($gijBe)=KOCSs=^{uXZ!5pWDU_uivID}9k05D_7d0~KpVo9V7g^i!QNfworEeB*l zZk}2*(NtYiTi>jjKmjq5Yhf3kj^G${ zu%%e%K!>G%*(AXhkj8^K#l86oWr3>DkHDL{Se$x`2`pvM-2OPz;HDuVGMWV2g-+-+ zdy2HW;*k(HkbtUd91K%6Tg;sT`~%`&5Yu#awmSQCB?B0oy`^ROlk`S`+2#*N1@@Mc zQN0G3xrn{yiu}qd02Rc->a=>C&Q58ynwu>qDGmUG9$wT4aWE0XHx?`kRgp=nRTb!S z3rreKuA;!G&o$^OigL9TDurI9P#OwUiWvZFD}+RYPN7&1BeT}QnhtHN&swtAHaWkc zu?e(HV7aAkNK@>`1tt$K8%jc~A)(>GAvz194i;)K;URSi79KJlMcS#;2KY>BxNm9+ zJf1OgIK*j2$qdC3rADJJC@fSeL`XqAKpW+N%q{|C_Jx4CCXheB4?O?~>n9-x`W__s zj^j}{8uAW#03;~Dg;SPN+B5FcY>>&rqLHKTyBW6wQKM z&8DmATDp$5(HGK}(ktm(={x9q0W187D38zpbYQmhJ@A`;nw%1~I&GkhAT|OycMw_q z@W_NN1#uv_@d5E$LE8YNNLK=W!2(UzK%-V@ww}ijU8Z3v(JU)-dAM^NA9{ka?~v<+@9={1PN0aRZAe!6@;5PATm4H7=E+a>-KbiedTNL6&ULu;K;X9c6%jclo8}ai!4jD;?7bZGH-#t1p2X%UIfMw?V-K2kM8F2SRTuG9M0p& zwe(^@sr1kn@i>~t`8=-R@hnitgP{!i5+Q8CV~7b|D#U&Mn**bMY#CtU@g#o zLNwRv>V%|L7i1(yEEcw^(GBN^9PO}WlSiy$>0Bg1+Cli7Nu@)~mJI|vp-%dlR7BXT zC@}NfbLV=UAlS~N8FGHV8?9pgf}=ivbv33zVhE z6TJmOCiGSwr;!H9hJO9WX=#qD@Mhg-q~&b ztdEq+llt|J=#hmnH3Oi;0Nwrc`vTqf=mR{?<#FCHy3KQ8Do&>uc=HqbsKB&`=}+m; z0PFV!{UzZ2j?iDz-|$$$V3^A4JYS7z2_FSl380Ph;0GCM?ig3X?8! zCX*&|rupAq3%ny|3V|n?9Oisx0+Y++G5L&wQ8EP#@L?s7K@eJaT+QPe9@p~N%Huj7 zgW+de&!{DyWONcwGNl4fP7d&-eSjxt{4Y=bH}GVQz>}~d4FR5nMCh%6?s;M15H0#8oo@swU>CJ*SDa}uY_1xzb27vrE`UnHBJNrNEQ(0z5gN$6Y*L zC}?-j|1#x&15@52Fy*a0V4)=K&fFm|<(>Ev;fKc;3fdih0ZS$Z*1DJJ7ud0n#~r=Q zS{^SrM|OOW*&wjvLjpT?itM;iU`O|e?8xM#mot+4D~k-Yyp?%U;>;&R&h!eL3H}TS zS@&5vb35}qpuLzK;Jo5)vZ0UJ$-Kbh#XMw&hx$g$tCH!w=zrcf8sX?rV8CxM@1UIf znKzlYm|e`<%x)ep;c*X-!N*(5<7M|V?=pLsz05vlKaXLjUCiTadHe{E9~E5Dk&>8a z%`yUjRmvy$lNpkoHZ+N8n+Klvzosw)UUk4{9g?d1&t^y`oxL-9z(o3*90S?ZK{vBy z$j5(4j|3+7W9BP3D9e1p9A-XcK4U&-zF@xO1*RuF<^hk#+Ud7|p!i2|~3iNuTqR6CBs|z(ch)5|+2DMTPA;v(F z;mjflFze4E4w+*qZy@4M{7WOI--a#&6RmL;v3L!SuNI?LEX^_yxCjN~9y>~UV3z>V63I}IRV-L$*9}R6vk`10^D5=x@eMq_p2v&G z0Wtf0bN;D~0rGJy?- zkH;H99t;2G3rv@OPHEr&u`Kkz=a+})I0L!t({kq0Y#Fe1BWq+$teLG~E7>a6!dA02 zY%ObL>v(~+dU*^gsGrB6g6`+>Ivzj3;|F>C5RcdMc*8)_nQai#!bw=fruhJe12A<+ zUYn;HYnvf2)S_=NRyF!l&TO+#H|O*e@<83j`sN0sxuwEVYi_B7yz#($Q%8KyQs-~u ztnbYb-pjxyCmaUr5u%jKmYK|Ub8WrNYOZT)(Kj}ln_6u8rokT07T%bM8=Vfgt|Uc3 z=nWlAgW1^J&}gxnTN=&6z{Gc38k-F!3lufgH&_Py>==pCK$rhBl-dMJ6He<>I@GvB5yqUS=@N)2|5HR7nwl(uK6r)K%g_3{gkT5US*~$dU+N9j#$lZSj0@Wh@C|km zj~^b~0v8G7|AQ?Mke16>Fy(t$Fef(kvY-t&3sUABpb3r6C9MG(m$NIu=wer}peY~Y z@s>XJN)~h_M3EjBsEw0UjTq_zoiZT7{4mI5sW_nM{Xul;nA-qKg}qh`_cZDU?%ZH+ zWN!sI&+KAvW*}+=Hqw(|FZHvxvA44zRG;E87@n^Q?f>Vj5lJ51BS`OidAx0?^66#! z@biN5d4|VN19b3!ANe%;xxh?3z-|cW9*{~min{07es&}KFbj6tb{_BG@pJz^!$Zud zvtvF+fCx(c-YWF_aUKJ5EYPQ?*yqkc>paiy9Mn2HdHnLA){!W`1~4D?b@mMwCL2uZ z7kT{BAjj<%IPP4LKI|T$_Br8;M5GV9U#S281?eN~lLNv&d7sCx4EFk?bL>Z8CO>8m z5A2lyis$TW6nN`P_8WmGzG9ECU-KATptpGZc0YTR{g(ZX$M5j?JstxLaY$gF{Ymmp z-fWQ-EXiFW1aNaZ-0hISDbT3R6(*xLx6r771A96p9GEMBvvOL4QLj`NXpBV#`k{n= zlL+lPgV4F0avMtMghXif8HCQ|C|+PD{^5`?f2Vl-ZZC& zzJVhmTo}Gxmf%1A!9{YAKZyp+$dL3~U=Q|l(OisxojObTzhb_)I4)suxL}GN@WW!b zWMN2Pi@rb7kbdK`0=?eF;}4+MoE(L6Io$ce!4|l^Obm((gA+2qGMdK+VJHH$h0CMM zjZ^|Ar~DJnDLF7W0}~F`|E~ zN14;$iW30T3Q#{;r1aSYNZVGpuS7b^}qJ}mmD7FqMCwy8b0Ko!45TA3Vt7{${ zk#>8P>O95Nz!#8%ZHs(u;*fHshsA{&hen}R7CN^5 z+!C&b110-AkN@EDpFI9c*u28N7@nQ?gPMfnki!e?0_sLMXMbjqA7TnvfHU6m0|SKP zYTXNjgJ=@3H9FhHLm17XlWbS2^aU!F?5HF$E(cA;t>CWUR`U1+Php;72f%0C)!elp zjk#;MRorSGpXBl1JpQMjyNMaytZ6tG=k@?50U{~?UeN%@ zIUAjDG*7zeN&fG(r8Y!JV|uwC4>CC=u#fKG?is1`_j31fYj_GS%cFUUArsOk9g|*d zMJbsSN|B_){d9SK7`^Xwz}tWQ;>6&PCJ&rggIg12aic~@M2<_$%ATMp(x&N3%@u%Z zs&8zXI>UcYnuLl2Y?Ob1(j7(+CD8lef`U2SfEt1O(P9Zbt+5*}2XX?aYHw8Z*qFG4 zk?>Qogz1e3+*t(RU@G8%=6(TVH&y`IjfW=!LJC@%ThRewBLP7)fbxVwL0+YokC)~r z>`EEH*x({G;N(2f9B=G_1BeTnEdo^oWD56;1wb2QGo^M0DGlj%Gzk{EnyXCc&&yXx zcdqpV@=OG2MUe;*Y$wnY`Ze$#m`i}yYZ9JUI30qQ8bI|9sRF1lsY3Lw|P5*du`z2F1Xy{6SytnM|2Xd-W-iX;Rt>NjsiHD z3ftgLnkKkTvjsbFE8I@w!t?P0?8Xc6N;v%aGMwmp3%`xu!3Xd`IKuWZ{uIuueTk32 z$*p9#5Hp?1hI?uz!aX&$R5O6ego`h`sg-ap;Xb(D@^R{ExYF_^fM0)1eJXM509>ra zFBtrPsNV)P{)5~mF!n*bt>-pytGS0ca63-&6vtCRAm?~0n5RP4ahq`=_ZYVY&~Sx3 zbsm||Q=@ol3`Cg37?W@f#lJ{C=_vYtPzh`k(63qlPD!XFVp9LZnoV%jQ>>X@9xRP| z54RmGo*mqCf_xB8f{MP_iun&ez*D2eFeJB=djVKRXrzzZi7uVp1UHxUq&R#jN>#B+ zE9r`t!4N`WAbJAs68AdyCfH2EvtI5ko{|MjrrqE_h&ADu1o#u&UjKP{;q!aw?}wR#%>*ZXzUlEV?sTlOG9r6y*>2)(Dk7kLmvs<68d=PlcC!}_lJHSdMxzM&=aA5 zhn|vQ*?F?jvavFmEL;{T%azs2rpgw`+_IIjRkHhKn`GN$FUsDQeIWZ#c1ZTI?6B-J z*%z|oVPnFg!xF+0!;-^N!_vbhglWRGVU=OFusLC_Fi+Uhu$#he58E8}TG+0z_riV; zI~krBo)mt5xHh~vd}4T6czL)X+!Q`JyfM5vd`kGV@EPH=!dt>G4Zl5nYxu$NQxVY- zF%c;d$_Q12I-)2-7f}*X8ZjwCA7PAG7;#_3u80$n^2jNXD{ay5ln9!Jv7*))~n9`U@F;y{jF^w@ZV`jy)#LSCX9CL9DiMcIiP0YhFn`0h} zc|7LHm~AnKV!nzw67x;W&oQTBsaPg9C^jT^RIEH!6I&8n8apZ06k8En6<6(Q#vY3OB=*zT&tt!gJres( z?6G+uVjCgH)O}sVU9zQ3(J>DCCaXg8?CH|54 zo$>F)e;t1!AtoU%At50#Avqy6Aw8ivVRnKep*6vo;7M4Xa9P5Ngp~`LrO zT$}h%;=aT~iH8$EOZ+17r^J7fP!g5IBymZ>N#`ZSB*i5qBqb&#C#5E(CuJt-lIoLY zCApHWO1dWL_N4ogdXxH-?oZm7^hna?q{ouBCcU2YQPK}dzbE~bbTa9mN=`;!kOe~|oP@}cD4lK)8lEBR#dKPf1MN*R?hHbs^ao&ttW zN_t9WiZ(@`QkP;&X-H{Gaiq9Xx>FXX^rS3Jxjg0Sl)b*(wQy)p)ocdVmo2k1}cc;Fax;J%y>Vee5 zsh_8QnR+Dk*VNxq|498SZA@BpT6$V$T2`7oO_NrdHYrV?W=yM2t4*s*v!ykp@oA5y z9Zvfu?Yp!e(vGF$^ikWrccQ^w?s#*F5SDH+o;W@OCDxGbuZ(|f{P*L3%L>m*$Wmo#vus&&vfNoqvM$P6 zmUVF!$+{}*nyl4X*Ja(1byL>eS?jVM&3ZlSy{u2NKF#_(>&vVoS;w+|&iXa$x2!+1 z{>qNcR%cJmUYLDR_R{R-*;i+;&b}`D#_XH3Z_Qqx{bcsj+0SM_m%TIl#q0ywhqJ%T zK9c=S_P5!8WS^2_IW1@9qvd1eGI_W>Ql2KymmB0Y@~QF`xkKJ6cgj2Do$@ZZNA8m^ zmtQTvM!rgZt^6+ez4A5ke);|K2jrXOkISEwZ<9YGe@(ty{;qtle82o7`N#6Z^3UX7 z$bXRkp2Osf${CXrniG~2n-iZiE+;7`C8r>#B*&CfoA*`T*LgqXoyzC($K=Q7=jJQ& zRr#8HUH-)UN%@9+bADC+jQm;o7v#6*&&_w`cjUYCJ^9`Fi}SC|-;n=Q{%!@Oh*T&Q zM#XH!e1%8RtyrwMNWm*ESFBWAtyraaR`HeM7sW}%DJ7+3mBGp|Wu!7j8Lv!KCMzc> z^OOpuO8J!XW#y~N*OhM-%q(yf%r96_(4|7EF{)5im?~1WM)k1j1=Y){*Hmw+-d4S< z+NV08I;c9NI;=Xb`a|`X>ZIx)uwIx#t}wW8RNo76RHWx;G)?JfFQ z8>)@fCTNqiDO$Odd-IUA4}ttJh7|HRcdhuJuyNmY}?<;<<`2FI8#Yc*d7JpxStoWDW<0auG$t4*jStU6o`6UG<>XM?8 ziV{nSy<|qo>=H-G+!9wwM@eVN@{+4d?knjlxxeJWk_{z~lssCpwdBc?r%Se%>?zq_ za-igck`GHhF8Q?Ni;}NOzA5>(PtCCdEvunB<$(KWT4yRJpRetlU~|D{m~fmrpC7 zS>94Ur+i_#uY7U&Mdi!ON%>{vSCn5_-e10>{8N3XK1XlXcj}kwm+6=5FVU~kuhw6y zzg~ZX{!aZ}`g`>c=(p;h(Z8mDUH^vuE&T`jgZdBkhxA|Qzt2cEz)AObyremg`%}R5zd7^o#`Ev6W=Eu!D z%+H&@GaonqUZI2g)Jzo@SFEhKs$zS^D;2L*j;f5TjH!&T99NlHnN?X;*<3lbaz^Fs zN=IdD<&~AID(|Sgx3af#ZRJCi8!Iej0Ms`XV5S8cA^QuTDz_NwQrUaWe# z>ZpaY#97iTnU-uzj-|+AvQ%2CEmn)o0vS_Ft7WdmWtneTU~yX(TD+EJmdh+xSgx|H zvRrGq&2oq3SXn9HdR}z>#Kd$eD&qkE32=rUR8Z<_4?{3 zt9MlItbVEb)#|sa->u$PeW3b->aVK5u0C4*eN9?TevPt5RimkyU$dmrDE~xd@ zuCDE`-CVn+_KDhUwa?b>sC~8ejoMwcyKBFwJyQEk?a|urYme3bZ4I@CStG5{)?{nC zHPc#PRa>>z5^I^Y+-kAbTI;Qot#hp|>wIg6)oop9z1YfIFSo9=UTs}vz0>-z^=a#F z>mKWV>-*LZtsh%IwSHkeVm)g8zK*J6>w@dfs~cSxS{GgyRTo>AP?uPjTqmz9udAtR zt6N-mZC!ueQ+4mueN*>a-KqMLdVPIWePjIv^{)DkdUw62zPtY7dcOYh`jz!p*RQI- zzyA694{c*@k+uX|qHVk_*QT(kY#N)^X13MZ>TM0SX4_0#i*1h0X=}G#Z`)xzYWu}@ zd@?mTWb)|Ap_9WW$4wqLIeBv0&o z=H}+9%`=*3HMcZ7ny+Zy(7eC-ls(uUW{ + + + + SchemeUserState + + AlanBasicExample.xcscheme_^#shared#^_ + + orderHint + 0 + + + + diff --git a/examples/AlanBasicExample/platforms/ios/AlanBasicExample/.gitignore b/examples/AlanBasicExample/platforms/ios/AlanBasicExample/.gitignore new file mode 100644 index 0000000..cc76483 --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/AlanBasicExample/.gitignore @@ -0,0 +1,5 @@ +*.mode1v3 +*.perspectivev3 +*.pbxuser +.DS_Store +build/ diff --git a/examples/AlanBasicExample/platforms/ios/AlanBasicExample/AlanBasicExample-Info.plist b/examples/AlanBasicExample/platforms/ios/AlanBasicExample/AlanBasicExample-Info.plist new file mode 100644 index 0000000..872f937 --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/AlanBasicExample/AlanBasicExample-Info.plist @@ -0,0 +1,54 @@ + + + + + CFBundleDevelopmentRegion + en_US + CFBundleDisplayName + AlanBasicExample + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0.0 + LSRequiresIPhoneOS + + NSMainNibFile + + NSMainNibFile~ipad + + UILaunchStoryboardName + CDVLaunchScreen + UIRequiresFullScreen + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeRight + + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + + + \ No newline at end of file diff --git a/examples/AlanBasicExample/platforms/ios/AlanBasicExample/AlanBasicExample-Prefix.pch b/examples/AlanBasicExample/platforms/ios/AlanBasicExample/AlanBasicExample-Prefix.pch new file mode 100644 index 0000000..bf249be --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/AlanBasicExample/AlanBasicExample-Prefix.pch @@ -0,0 +1,26 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. + */ +// +// Prefix header for all source files of the 'AlanBasicExample' target in the 'AlanBasicExample' project +// + +#ifdef __OBJC__ + #import + #import +#endif diff --git a/examples/AlanBasicExample/platforms/ios/AlanBasicExample/Bridging-Header.h b/examples/AlanBasicExample/platforms/ios/AlanBasicExample/Bridging-Header.h new file mode 100644 index 0000000..5d8abc9 --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/AlanBasicExample/Bridging-Header.h @@ -0,0 +1,28 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. + */ +// +// Bridging-Header.h +// __PROJECT_NAME__ +// +// Created by ___FULLUSERNAME___ on ___DATE___. +// Copyright ___ORGANIZATIONNAME___ ___YEAR___. All rights reserved. +// +// +// Use this file to import your target's public headers that you would like to expose to Swift. +// + +#import diff --git a/examples/AlanBasicExample/platforms/ios/AlanBasicExample/CDVLaunchScreen.storyboard b/examples/AlanBasicExample/platforms/ios/AlanBasicExample/CDVLaunchScreen.storyboard new file mode 100644 index 0000000..924392e --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/AlanBasicExample/CDVLaunchScreen.storyboard @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/AlanBasicExample/platforms/ios/AlanBasicExample/Classes/AppDelegate.h b/examples/AlanBasicExample/platforms/ios/AlanBasicExample/Classes/AppDelegate.h new file mode 100644 index 0000000..5ba79e4 --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/AlanBasicExample/Classes/AppDelegate.h @@ -0,0 +1,33 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. + */ + +// +// AppDelegate.h +// AlanBasicExample +// +// Created by ___FULLUSERNAME___ on ___DATE___. +// Copyright ___ORGANIZATIONNAME___ ___YEAR___. All rights reserved. +// + +#import +#import + +@interface AppDelegate : CDVAppDelegate {} + +@end diff --git a/examples/AlanBasicExample/platforms/ios/AlanBasicExample/Classes/AppDelegate.m b/examples/AlanBasicExample/platforms/ios/AlanBasicExample/Classes/AppDelegate.m new file mode 100644 index 0000000..8837cad --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/AlanBasicExample/Classes/AppDelegate.m @@ -0,0 +1,39 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. + */ + +// +// AppDelegate.m +// AlanBasicExample +// +// Created by ___FULLUSERNAME___ on ___DATE___. +// Copyright ___ORGANIZATIONNAME___ ___YEAR___. All rights reserved. +// + +#import "AppDelegate.h" +#import "MainViewController.h" + +@implementation AppDelegate + +- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions +{ + self.viewController = [[MainViewController alloc] init]; + return [super application:application didFinishLaunchingWithOptions:launchOptions]; +} + +@end diff --git a/examples/AlanBasicExample/platforms/ios/AlanBasicExample/Classes/MainViewController.h b/examples/AlanBasicExample/platforms/ios/AlanBasicExample/Classes/MainViewController.h new file mode 100644 index 0000000..83e7860 --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/AlanBasicExample/Classes/MainViewController.h @@ -0,0 +1,40 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. + */ + +// +// MainViewController.h +// AlanBasicExample +// +// Created by ___FULLUSERNAME___ on ___DATE___. +// Copyright ___ORGANIZATIONNAME___ ___YEAR___. All rights reserved. +// + +#import +#import +#import + +@interface MainViewController : CDVViewController + +@end + +@interface MainCommandDelegate : CDVCommandDelegateImpl +@end + +@interface MainCommandQueue : CDVCommandQueue +@end diff --git a/examples/AlanBasicExample/platforms/ios/AlanBasicExample/Classes/MainViewController.m b/examples/AlanBasicExample/platforms/ios/AlanBasicExample/Classes/MainViewController.m new file mode 100644 index 0000000..f0eecb8 --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/AlanBasicExample/Classes/MainViewController.m @@ -0,0 +1,112 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. + */ + +// +// MainViewController.h +// AlanBasicExample +// +// Created by ___FULLUSERNAME___ on ___DATE___. +// Copyright ___ORGANIZATIONNAME___ ___YEAR___. All rights reserved. +// + +#import "MainViewController.h" + +@implementation MainViewController + +- (id)initWithNibName:(NSString*)nibNameOrNil bundle:(NSBundle*)nibBundleOrNil +{ + self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; + if (self) { + // Uncomment to override the CDVCommandDelegateImpl used + // _commandDelegate = [[MainCommandDelegate alloc] initWithViewController:self]; + // Uncomment to override the CDVCommandQueue used + // _commandQueue = [[MainCommandQueue alloc] initWithViewController:self]; + } + return self; +} + +- (id)init +{ + self = [super init]; + if (self) { + // Uncomment to override the CDVCommandDelegateImpl used + // _commandDelegate = [[MainCommandDelegate alloc] initWithViewController:self]; + // Uncomment to override the CDVCommandQueue used + // _commandQueue = [[MainCommandQueue alloc] initWithViewController:self]; + } + return self; +} + +- (void)didReceiveMemoryWarning +{ + // Releases the view if it doesn't have a superview. + [super didReceiveMemoryWarning]; + + // Release any cached data, images, etc that aren't in use. +} + +#pragma mark View lifecycle + +- (void)viewWillAppear:(BOOL)animated +{ + // View defaults to full size. If you want to customize the view's size, or its subviews (e.g. webView), + // you can do so here. + + [super viewWillAppear:animated]; +} + +- (void)viewDidLoad +{ + [super viewDidLoad]; + [self.launchView setAlpha:1]; +} + +@end + +@implementation MainCommandDelegate + +/* To override the methods, uncomment the line in the init function(s) + in MainViewController.m + */ + +#pragma mark CDVCommandDelegate implementation + +- (id)getCommandInstance:(NSString*)className +{ + return [super getCommandInstance:className]; +} + +- (NSString*)pathForResource:(NSString*)resourcepath +{ + return [super pathForResource:resourcepath]; +} + +@end + +@implementation MainCommandQueue + +/* To override, uncomment the line in the init function(s) + in MainViewController.m + */ +- (BOOL)execute:(CDVInvokedUrlCommand*)command +{ + return [super execute:command]; +} + +@end diff --git a/examples/AlanBasicExample/platforms/ios/AlanBasicExample/Classes/MainViewController.xib b/examples/AlanBasicExample/platforms/ios/AlanBasicExample/Classes/MainViewController.xib new file mode 100644 index 0000000..e45d65c --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/AlanBasicExample/Classes/MainViewController.xib @@ -0,0 +1,138 @@ + + + + + 1280 + 11C25 + 1919 + 1138.11 + 566.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 916 + + + IBProxyObject + IBUIView + + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + PluginDependencyRecalculationVersion + + + + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 274 + {{0, 20}, {320, 460}} + + + + 3 + MQA + + 2 + + + + IBCocoaTouchFramework + + + + + + + view + + + + 3 + + + + + + 0 + + + + + + 1 + + + + + -1 + + + File's Owner + + + -2 + + + + + + + MainViewController + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + + + 3 + + + + + MainViewController + UIViewController + + IBProjectSource + ./Classes/MainViewController.h + + + + + 0 + IBCocoaTouchFramework + YES + 3 + 916 + + diff --git a/examples/AlanBasicExample/platforms/ios/AlanBasicExample/Entitlements-Debug.plist b/examples/AlanBasicExample/platforms/ios/AlanBasicExample/Entitlements-Debug.plist new file mode 100644 index 0000000..1ed4ae5 --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/AlanBasicExample/Entitlements-Debug.plist @@ -0,0 +1,24 @@ + + + + + + + diff --git a/examples/AlanBasicExample/platforms/ios/AlanBasicExample/Entitlements-Release.plist b/examples/AlanBasicExample/platforms/ios/AlanBasicExample/Entitlements-Release.plist new file mode 100644 index 0000000..1ed4ae5 --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/AlanBasicExample/Entitlements-Release.plist @@ -0,0 +1,24 @@ + + + + + + + diff --git a/examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/Contents.json b/examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..2ce78c1 --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,241 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "icon-20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "icon-20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "icon-29.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "icon-29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "icon-29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "icon-40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "icon-60@2x.png", + "scale" : "3x" + }, + { + "size" : "57x57", + "idiom" : "iphone", + "filename" : "icon.png", + "scale" : "1x" + }, + { + "size" : "57x57", + "idiom" : "iphone", + "filename" : "icon@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "icon-60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "icon-60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "icon-20.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "icon-20@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "icon-29.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "icon-29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "icon-40.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "icon-40@2x.png", + "scale" : "2x" + }, + { + "size" : "50x50", + "idiom" : "ipad", + "filename" : "icon-50.png", + "scale" : "1x" + }, + { + "size" : "50x50", + "idiom" : "ipad", + "filename" : "icon-50@2x.png", + "scale" : "2x" + }, + { + "size" : "72x72", + "idiom" : "ipad", + "filename" : "icon-72.png", + "scale" : "1x" + }, + { + "size" : "72x72", + "idiom" : "ipad", + "filename" : "icon-72@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "icon-76.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "icon-76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "icon-83.5@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "icon-1024.png", + "scale" : "1x" + }, + { + "size" : "24x24", + "idiom" : "watch", + "filename" : "icon-24@2x.png", + "scale" : "2x", + "role" : "notificationCenter", + "subtype" : "38mm" + }, + { + "size" : "27.5x27.5", + "idiom" : "watch", + "filename" : "icon-27.5@2x.png", + "scale" : "2x", + "role" : "notificationCenter", + "subtype" : "42mm" + }, + { + "size" : "29x29", + "idiom" : "watch", + "filename" : "icon-29@2x.png", + "role" : "companionSettings", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "watch", + "filename" : "icon-29@3x.png", + "role" : "companionSettings", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "watch", + "filename" : "icon-40@2x.png", + "scale" : "2x", + "role" : "appLauncher", + "subtype" : "38mm" + }, + { + "size" : "44x44", + "idiom" : "watch", + "filename" : "icon-44@2x.png", + "scale" : "2x", + "role" : "appLauncher", + "subtype" : "40mm" + }, + { + "size" : "50x50", + "idiom" : "watch", + "filename" : "icon-50@2x.png", + "scale" : "2x", + "role" : "appLauncher", + "subtype" : "44mm" + }, + { + "size" : "86x86", + "idiom" : "watch", + "filename" : "icon-86@2x.png", + "scale" : "2x", + "role" : "quickLook", + "subtype" : "38mm" + }, + { + "size" : "98x98", + "idiom" : "watch", + "filename" : "icon-98@2x.png", + "scale" : "2x", + "role" : "quickLook", + "subtype" : "42mm" + }, + { + "size" : "108x108", + "idiom" : "watch", + "scale" : "2x", + "role" : "quickLook", + "subtype" : "44mm" + }, + { + "size" : "1024x1024", + "idiom" : "watch-marketing", + "filename" : "icon-1024.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/icon-1024.png b/examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/icon-1024.png new file mode 100644 index 0000000000000000000000000000000000000000..1b9cbb91e62564ea4f9a26a873fadf7869be5c7e GIT binary patch literal 35783 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

4Yso)e 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 IM6N<$g528OhX4Qo literal 0 HcmV?d00001 diff --git a/examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/icon-20@3x.png b/examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/icon-20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..69ce592c2f97d43ac17001784d6015b4c3ace49c GIT binary patch literal 1417 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 literal 0 HcmV?d00001 diff --git a/examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/icon-29.png b/examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/icon-29.png new file mode 100644 index 0000000000000000000000000000000000000000..5dff98e939b8b63e6919bcb20114444080368ebf GIT binary patch literal 723 zcmV;^0xbQBP)kJ#?!1n3$M|j+AeBfKgp&P+4S2Q(ZktR?^ba%+1cgz`%5Sf@^hua(I4d zaC%NxVl_ceG(Sw>;NaBM)W^risHmx;qN1IipM{K*e}8{_dwX(na#&++Rb6L0MpDQ2 z`qK9Ky7Tv}?DC}M?R(GGv9-9PsIRE2u9ldZj*^%{ij{40MRtDONaFMpn#brF(E&u0&{`MSd)vUCacwO!KB19KQxLmOWvkHdf+3WYfB= z*4}Ehh{esWr5wxuHTCdmJWIqZo;;Kt%&a&NNu{iX+X7j$?*0QQisAO%|ordeC z5_nR4sG3&@lr2LZV=ozm78X(@W?eZ>q-mJz|q$0DQtpm#h=D+E_E(!&4%002ovPDHLk FV1iNtapwR4 literal 0 HcmV?d00001 diff --git a/examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/icon-29@2x.png b/examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/icon-29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..34b390857a255e3efc212451c30ab7e1adb96218 GIT binary patch literal 1367 zcmV-d1*rOoP)~v{r&y(^YgvEz2xNN-rnBk=H|J%x$Eoe@$vER@9)6C!1?+4_xJa^ySuTm zvGw)!?d|R8=;*h%x3#skfPjFrv$Mj&!kU_z($dmNRA4ngOx)buQCed!JV?jK$Kc@L z*4Ea<#Kh0f&pk*~;^N}k+S=LK+0@k3$;ruwhlg5aZ&qPzuCA_5T4g##P(@K)Gd@ep z%gaDaSk2ANVr_P7b9-iRd0%I7QeJ4r#>TR?xn5~=RbOg2Ls4#cfl*v#OIBh+Ph2xT zO}xLun4F@YprDC~iFS5&Sz>HOPFks}tEHu;mX?-&g^YlJf^>9rV{3GAad9j}QOEfF zijbCgdw{g__^z_Gl$o7`i;#kYgZlsfy7TyzGrn0H6u|%Ayk&%%& zdx(31hjDv^XmfmTZ*NXmV>d%j=KcTT{QlAU{iN#gp6Bgu&)3Pz%|C^bQgVH1ae7Z} zcR^TXPgr0*o!k}x00WyzL_t(Y$L-YjchXQ4z;QANLqZ}6(-I6rMv)aj+9FkPF=R@I zwsr5l=O6F8H+ZC{FZB4M=lK1NA3ogs@&dO1{Y%NRqS);ok|>I*s-D37_TwclOA=`0 zhyjwgtyY$Jr0Rue8meEx(k9hDBXua$btN0pR=IowGNPCD+HL8XH&x)7Y&oq#IsA zAks~F8(lEe>D<}e+$E4|u@JbjAqwBY}w{&va+aLo$KZVLLG@H%! z4e|=!fA=g((iqamTjUGax^NO?&_kg-849#ezhM}UZv8L}qs~B29s>P|>jvG_KPU&v z+(xBduU~mqC&5q%Xdl-Nr);$Ru^5rbwMu$kh53`Vj_ZccQRxX7noK@VU!2D*RM~Zd z4Ckm+%)-#sy~LS(lVcoDVL!}DH_+(Cy@%fv)TEDb=`sKY`26m$XiH0i&q-y&0cvIuQd2-)+pgS5wVybLSyaF|Eq?UAeB&)N^qTi8lT9k13McL}CJSQoN-7-ayI36e!6TKv!!2kVi ZzW^wb!%k1@C}scv002ovPDHLkV1kKs%KQKT literal 0 HcmV?d00001 diff --git a/examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/icon-29@3x.png b/examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/icon-29@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..c63fd776663d10c0c8af266db1ad65496a7430df GIT binary patch literal 2065 zcmV+s2=4cZP)2$@4~{u@$vEa`1rQA zw&>{S$jHdOy}j-2?Xt46($dnjw6y*G{lCAzf`WqF+}x|HtIyBS;NajhKTO`<-q_gK zQCnu#*4EV2)UdFylarHWZg??1N-sJ{`uh4kM^xhC;>*j+N>*Xb&COL{YEfQkUT1Nx zuC8`=c1>AiNK;>Vd3jo8Z$eF4S7U88K~HjegJ*JlJxNzPMNoc!fjLA{HbG5ta&mBR za7I#I%*@S|m6eN+m5+~*PFG?>P+LGtRbp&)VQF(lP+LMwSDTxgZ+Cy7qo|IOmn=(H zqNb{yprVkKnpG4#>&_}$;qobph znVx-viHC=Wb$*9yb$?ZFdh-7Ntn~Rz!_K|I#Im)xG^n+yuCh3cnS_dvZ*_bvM^i0C zQOx`Pr1JM_)ZIX{zBPM@NqK}PWpg}Za79*QKT~2VP+dGuT-W^m)cpQi%hW59o;#79 zUu$>ZSXnB|sHnz?3~ zTiL$v`}(1K4rhT9@457*Uif!LXPEIf&pe#Nb<`bo)KULKk^|EJk*T)CU%C1OxXiLc zvMhTbBgzFC|AsXsxUR+i7hBMS3#qymsqt~8Ixh6PYixYEwJxfzYtc8x`t*_{skjh! zU1Eb<(BwjLBW%KfTy`MTT(hH*?fQ_*IcUUnHNc7uxMsWd3oQD471sn3wwN0UR+^aT zL@;tKlIC%#yEsF-!rYx>q^B0*nl&C`hmX3EvlKBf_Yr+5^Z>h%Nee4FbktoOi<5%P zwK8|qLS2ifWeYm$c4WqixQj`4!osJid*%VS820elgaqHP`zSYk8rK)CCQ$d}s0F)_ zUcMh;=(#}Z zVT~N4ZXD_%EVwD%;TZ`F?oLG+B+W7x#_fIHOWjd$F>8ydxH8>BIDBOm1@GP9{{G;| z;Oy*$%2xrd@%4xAdWpMBw_vjcR9rjVLOA?j5Vf?lw101Fe`$mc4yQNt{o2-Zm|B45 zF$=EKqT-s^xB>SFw3JR4-rjxrHeDFOrQy@z*(-5#0p>+rCM>wJiYt-jg4@(nfHIl2 zA75WQUP~8nGq8q*P4Vt0?8d!pT!ZRGhH)_)Xu5M zZ>~>8QT=g&&087x0vp#EQFUd)g8QVu(mKq$wT?f}U|gZM7u>s_;3s+}vvFIKs;&uK z%tm%{5V)`J+6vA`)SmPICkUL@4X8N0$TMV8@EkVcg>gu zw{r?VE>ERU{ybJms0q7sYzy8P$Mujc zfV&jxtF3s@O_MEv8{oKhHg4x^{7h}afkJ~eIjT_a_WL&4wxJjl^g9I{%i%}`tQk!GW8SA^@zcngFL0y{xi>ar&=-2%8tu4_7E zT&vo+T}G}e(Q#{8;?`%u_3Cxp0*oDSqYm4G6C&(Ti;iECZNa7}lPeo_x3Il3sVMDq z3qx)Vu7z!(MNwA$rVR^WAl~(4F`D6)$GN4QO!f z>`hB4{(N?&?pavL=KYGZm9XtD4X&elbXS#Z$zNw&o6TR!DyvSs1<0hq6(f`#IF~Pt zXY1aG{CFwf?WN;7eHvI_fF0d(c6@xixy}W4!t2>(%!1qO6Zx*x!7lJ(34Y&DXIwA5 zUMeFOvF#I*$R9W1F$a#j4P6_H<-HO#*@HZ+;JUtS5wNi zvAp6}^0j6ED4$pStIHdgc2AeDz=7s&5;Ejs~Q*P^l zntu;oaSz0r%tjOJm%m_uUFHt-cMrcnIO+13^cv0sg7qf!Ul*f>JRaE&)8cWtu;g&) vwdQanBp+t^GSHgyF_kYjmhPyd{!zaGIZd{7U%;_w00000NkvXXu0mjfUL!L{ literal 0 HcmV?d00001 diff --git a/examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/icon-40.png b/examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/icon-40.png new file mode 100644 index 0000000000000000000000000000000000000000..4feefdf8c29b772a0a1866d218a8577608749d66 GIT binary patch literal 934 zcmV;X16lluP)lq>?(XyR^XlsA*4Eavw6waqy65NTo12?>czC?L zytcNs+}zy1zrQp-Oz`mV?Ck8Zv9ZI$!>_Ne;Nald+1a_dxnyp5MNe8eMN-q#)4{^S zXmWdBX>(0hVnIw<>FMd--rmT_$hf$;Sz~QZS!7C8V8zA7Sz&8bUT9HWXhu<8KTB3J zK1$5Y%r81e;^N}Y&d$ln$%l=TfryTEdxLU#fPQ{{d3kwoaBw_FQ@Zc-o8IH5rlyaT zn|OYNI73f>&edzX#Gj+5oS>who}P-2l#!8<kCF8}}n zEJ;K`R5;7k(${j@Kp2K$Bo-AUL<}-bfT_X;34>`iA)y!d?(|;n{}S?T24=DgoX78s z&Yt;yNxPosmf&UE>SS3IMZZ59Rn?fL?FY9>88I-n#d(*|zk-Umm`0Tp>8RP9J4@|BM3Ns_eq0I01w58&s>_LXXw3Hn zmE&acuCP}u79T05t4Yh<-3=LeX0--*a91okKfXNyJJQcHiI5sxy3Ifp&g?n0`sus6 z<2X&}Y%Fz1A!Ha8oq^FL;Oywgos8Xj-6hidH`qPLz;Kd*BAj_%t=f~Z?Ybk<`SiBa z>0H5uH3rHD2WF~LYBWAh8jVbgkng92NEb#W9N=yc2Bvb&X6g5@QfWaDuoO>+1BSrD zV>6Y~Gugk9WtlVvCOm9GINgcR$f`PA;Dm!QxZL^GOEiClUZWmdJjFpjg+AX&yW1@v zCi3)1uozI`pty8x>HtHbkWqoNR1ON%g&uCp<<-F3hc9sPwJUA{Chm9gD;M6mw*Uh@Q)mtQaMmI31SQulCk8`{9xwff>2P3KfpAXXpf{?=uls|Ye;V|!<9gJ~ zLsd^tFJCZSPSd)|LqXg(bsv{*YNEhHK^8Y83xGV`nCCy}536ia@bhHcTmS$707*qo IM6N<$g528OhX4Qo literal 0 HcmV?d00001 diff --git a/examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/icon-40@2x.png b/examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/icon-40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..3289736360695edcc307180080e42c019d120dfc GIT binary patch literal 1892 zcmV-q2b=hbP)1Zz3S@f;o;%X(9p@r$*{1nsi~>5va)}Ff8O5S#>U3Fy1I3Bbx>Ml z)z#J6+1bs_%|1$2kdTnq*VklicQimvGCfOIVr(!wM>|GSx3{<3+uLDlbW&VpH9=0l zzrR;tYB)nst*xy~R$)q4V^d#gfPsQqWp8D0c}Y`Wg@uP*XmUqUTwrK%MpIsBa(qx; zX+lq1tE;PQc7JJed~k4ZLQGk8e1vOqc|%QDa&mG-P+dPsRF;;OD@s=^MNy`vr;U}H znVFeQT4gRlPLh(8Mq6mR_x!T-`k|qrjEszNcz$|%dT4NZadB})P+IK%|IhpWmg@3; z-Q{D-)l0Z^|YSG)i!NfMGwydzTrmC(so2P<^ zjyZjbD13=da(+H%bUaO5M6kQFx4A~HxkQ7FR%mi2VQxNFV=Pi(JL~!2000GtNkl^Q2B?L)Xj6ebzg0zUjiXwN*C2imLeP6zIcSVx81F!4< zhI2f}-+3PH9q?%Q-~axpjOMO{o@~Qz&1yFgJH z&a(-6pg7#p!0Q8=DCir`>j9O+py(XpgazXOpxZe3fW||hvlj%J20jrR20=`4R2awGwV^g0yytfXQSs7lt4-MKfbS z3R=^k9C31GQm#rt&?^Aqe0@Drrw8XiH>PoC&XaB|oIs&-KWW8fvvH;0#^h~LRrO&v zc;gJ|$ThMN9=uf?s(yqGhnRg`h>$At{$|>A@W@P=|wf7vD6SUza13J{cpp$ymu~T5WbfNJ0 z_LFbvbOn`8j*Kkb=I^az@ILYYc+A%qG~xDFGAB=YOI)7&g zfk}xhd`x0I&2&I(_8h#&x%#79{M~x40IR1Uc#VGw!Azz)OBOyh%l8LG>;Z6R0#sUi zcZ+|%IZ=l#atB~0lPS=Jr7=VQe858k#xIm$b8y1V5_*nP99bEI$LYe7hXI<%!rA!S zYPAYJWgb1@?`_V(5*+O6ZT{{Olt*@;hrlcYRLH{d_{#qNJ}^ICzxigf3Ob!c;L`J( zZ`Ki5BMVEC$N&Yha6JAxk+^jE^5xAt*FRo{B{3T=ClatvpU}$*?$1V25?NTX7+8tW zgJ3L|pXrJ_RBE0s9Gql=KCm$IVucf3OCP-TKn zvT)3EkxO;rdb>y#4hBt3(1sTV;Da=*fXW>-L3&6B3q7Eob(S;keT6^Pf1Gd|>+7=!Vr09TroGu*DYPFCBfQJ_j)oR)@^(3P~ zCo4S>NvnmTuHF-tqM@2LP8Ke@40?^y6R~TdXv@)iB7s&kq!r14#YtUIq$ljsc3aJ0 zXW`BjY&2WDT7Y=Pn4ZU*=oO5FqI=CoXW`CYGRw`qXb235yrRnMfeO8XV_K`(T<*Ps zTg_%mlgNM#H?QLv1#3L!AG3HJlGfU5w(%UrMx!x~TW&Y^TH5${F(BDpmWb2Hvq766 zs~&G-bz9qwGTPO)SI4~`RTgYKdqA7hXPtB`uWr}05F@R&y}Im}wECPjBhLiQ5VRM! zR@)m#8Ev#zw~BTMngPh3(4=}I_F%Cw&a6=k+9Mv-q&p#a58YvKDiMoLkuiTP?3M)t zvPH!ws%qG(Q&?3+pMpFl2t>2sRAkwtlPoKWUYQF(nVrJjbjlw1X00009D* literal 0 HcmV?d00001 diff --git a/examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/icon-44@2x.png b/examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/icon-44@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..01c5af720c635225bc91e0f7d25d16153ef890bd GIT binary patch literal 2069 zcmV+w2FMdx($e(w^x4_j#Kgq4wY9Uev(C=WzrVlZ!I+qtG(b#-hK5X4VBFl? z*4EZCK1}W^j4Q$;q;^vT<>7Oju(tJ4a7gWX#OWWNmj} zX>wFwYC=w0goK1pTV=7av0Z0zNK{}~VQW81S2{#cVrz6+WpB&N%X@o!YjSx=QeA(5 zf;~xAIz>~qxxI~&mQ7b-L{VHlM^m1jo^*6{MNnKpOjfC>s;jH4jEsy^U1vp3S}s0J zZg+qzM^i0APp0$vrKP2oo1v7Hl!S_qb$o+tc7Q%}e??_+QC(=j`23sh^-I3Wt+BPD zr>r=dr=g*tkdTmifrn0Pc3Wg_PFrXxS!O;|Vdnk*h3N2D%hjErqlu1_hlq)Sf`TG( ze^+UACS!0yTx!_-{=4`5c;M=N-Q{rB-y(>Ve};@tc!DcYUh)0^)cpRB?el%#=P8bw ze1eHJXm|U$+vETM1|~^FK~z}7?bugW8bK7mahP3Lm!%3q5K(NXB#21FSczarF+l{4 ziN11XBxc@)=T+6Pm)A6B0 z?PsO-;A;#HI{8=FfMJluv7Vk$QvYSv)E*p(0!(sq7s23*+uPe$N%>(`p2DF><+7YOQG%>)MNKqJCG_w@MSpIC zX&}k!y~1E9fl=ONMxqlZK^L#7ouZv&o$5`Mno?VI(d>4Ok?~msA(w06mfES)rOM#b z?PTJ1wQCIx4YjqkHk;L2qp=E)LS5GiR?gB+v08+3_!n^j4rsulnZbUn^wCbULV^&V zW$-0{ORm+Y0ZYV%YOpc{^}U2YZ1f31nB93bN8u-Q5!TM22JB_7-FFh^JiE2EHTHS+ z^Vk-hd?+Fa*O%Yz#09|!wGYxobasjwupCswM{Hjjg5WB@T%KQjIWk1*fyd*^{Wm}7 zO7Ik21i+e42yp>!-57&LlF7|S=<#N9j1(~n@mKfIGJ!|fBDxxp7OW5#;7=pa%*@Q@ zJbJV_Gg7L>XcT5&d_y0um*76Oh_19jD-RpE_2~=*&)n^|=>DDFWT}WTF3f#=h~5Jn zhsNn5y8K~HSY&SN!T{7e(R2GAn!htKa98cJ@c_I*7t!UnYr+zCRoGXYfLdArhKXBx z2h>6U!z$jO4+MTn7vc9Sny{A*>}zO&;5CU?(Sz$Zs?EaTJ-)7fgdjYji}3p;O&GC( zeQg8z{5g2B-v$VL`XU+?3<5*@g$Z7G#Hj~hLYYd0QD7-s|52RX2pxBxG< zM=q2VIpoHL4d&L19N2BAZrhW1q&(x{gs1AsVb^amaB=~R-SEYDsJserC`SkGZZz-; zl7YkFx_oK_+i{YhS7ChV)>a%tdcQDL_MKUnJP#_RUBogU#IvTBk zPC$)~jqp8(-@|MX-Gg>6ERlh!3-DoI6xCk*_|WMFXNzihV3i>UV(3I%{w7vO*n*uxf)XwE*H zZmzfp+w}CaY_pXP?C|M;rM*Sm%szXbIZJ#S$kk$ z?AA|a&Saa&$w8tH7`3sJTgzrTVqKMPgd^6G$u_ZpyJdrpTG@@bk?n}Z1}iMWT8PCu zvN_eoaDyHfx!AK@%uL2&g~N-mT5rT+lbIWI5sn(9!$oFxg$H5a*o{h8I2VJF0WP`4 zI)wPJMWJq@3kHs@?VFg;Dm+IzL_id zYr=NL=|+eCh;X$u_Sy6>R~#$0=KMz>?xiTZ_4y)6>nIreWlw zE$vez9kAOZDXocy?!sEGiCb>1(A|(|RV0%eaa_C#S2)^e^>;hCb^EQ2(Xb1z0&!R2 zl@yn+E|8AaaEqn`bv~COc>(6%3XnbKpvz^~k;@fSJmBJ6!Iw>5rzDBGk|d|sL|yKh z)nD>VI+JC$n=F_wLl)g3h`4;Z$_&RH_iy_Hkdn3H{I~P^00000NkvXXu0mjfqoWxl literal 0 HcmV?d00001 diff --git a/examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/icon-50.png b/examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/icon-50.png new file mode 100644 index 0000000000000000000000000000000000000000..81f93f16cbfa35875a8e49fd016efc26cbd8892f GIT binary patch literal 1173 zcmV;G1Zw+losIYs*V`n0sP+}zyk?CkLH@VdIXxVX5swziLtkMi>J=jZ3Vyu8uT z(f9ZF>FMddzP@;Pc;VsU?(Xiw!osq$vSDg;u&}UKVr(`*O~u8RMN>g4yO<6fbQ_9N9#>U34udmtJ*|)mBsj8}PdV+0s ze`;}hVr+F#T4XpxPrLK@|BYz2E;#_Fodhpv5OS%j7-wGvBTx4~GB! zWk!_4VMh6UCX^d>w-7l_6tMz>iPLGmOHdq%Fx*`udIH9@S#YZ>t22&`#{xn;nUmTy zVxTC_{17q$Vakw#2; zJT8~TI$R@0yb?R^cGa2seU<~)V}E=EvWF%t7VG+DxZzMrCi!Dk4Tavk40Tmio%PxC z0n5^K9Sf`OZQ>FBYbaE&zZle2xV+3heew*EZ8(ktkY0kNL`lge{{ZJ`hS<(-MiZK>`(_Y5IIX z(^2*k9m}@G>xd)C^U9%r7kw@7UTd0Gp;5PAXj*39!^oCXM?@G&rM1fLA{bc|vB5}y z@Shn|ltV-wERyME8i*|$r6&@IbiJ^M{?k1;R={u2$0(^(I#b@psrQ!Ek6|QGBoGsf zWCUSnr`T*}s|R7fKMr4t6^mesKzuMFAW|$gv)QGv;9~`X5`h?z$ov-7aM&M@qYoGv zJQ6e!2!%(o*W=OZu}0%-EP|qekOCvc$z%-23jaFRcrvk}W3^lcQb~MwyLY-g7P|Y? zYlo560g*5uil1t=>dM`{H9LrwKoXQYEfmA?qgu_1o+~^i_}f~|-U`?(E}kM0qf~9% zr#IfUZl?BjRWgzYXO4y2qa(Ynqft8?Gjk;3U<5yU3A$_+zrZ+1gc8k8DaI3uNlvp! nk$;gy%+stySuyi`1tel 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 literal 0 HcmV?d00001 diff --git a/examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/icon-60@2x.png b/examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/icon-60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..1e794a481aa55e1827ab0cdef14f8fc9d443d501 GIT binary patch literal 2712 zcmV;J3TO3+P)O`e{f`}_Nvnw!GH!m+Wj=;-LLudm3+$o>8O_V)JH*4F?3|G2og zl9H12^z_}`-s)vLZ+TB!Wm;u#Mo?WmM^vDo zpjc#WPg!LA|Nlx#O02A{S7B^7LQkcrtZa6FMNe9hm6}{=a+jBve}IBRP+Mbbbe5W) zY;t*QY;0IqSS(9eo}#9Ui;HM-d`L)0gM)*qs;YT;d0=R9kB^UpijRMPfIm%JEJRSb z`u<5tNl47tJcpD?S7U7A>nWtMdVz*MY5CP`H}DC^V+@w~u_lX^=|PV<5)-iWAp@+0 z2R-4KyT!_Y$E+sYEaq}#pc76cBo>e1w=M@Boxm&dH8FnqM`5iQdfc@4vzjDTGo^VJlFL&o}qs72vr4Bu)A z*v&Cdj$t_Pz?g4}g3}q*Dg!0!7;ffN=bqdg^K=TsTFo$Si56~>ZV|ZI5-=1x>j@LM z)$17xqMNg%1qzo`8+LKbkK!qw4QqO@*FzI$?~!IP42=^wd6r`ir3idjE|+U);*vpH zici9{6dvJX1_x7FIwe9rMskDL0sCB)moA?BXi8YY~1;9VXfG32}R*j9xb-Y@n4pM z!Jr@V`FvL-;JRWTgKEJ?bTRKCsWbHlyvX1nWVyk*)Y~)~47KcC9aM>Qhlv#45-x}3 zzIh-QIxJZgP&r(|10Z}o!0i|0nTg{cpN_Nem`l0 zkKB9|;GNBnZ+AG%Yo@8|m4YW#u^8OUTANp8oopO@Kdx3QZKp~z3fzZh=E2^S1DEN8 z_DOyX(Zt{kgDboS)b8%T+~_wN6;a+3g(v-f-+cWZp0y2k=wSajxn^LmfVJf+uL$)w zUzrCd#bVW|(d6)#r{=34s}8(~2aij`bHvq-8a#0I{>HAk-z^p!PKJlUtD9fV-8T*# z-9j$FX-PPYT!8CE9(?}k{ZFR(y1T6xothT>_N8fl+W|PrTf+|;l7xd~uol#LHK_m0 zG@o|2#m6EH=J1_>lxF{nH$WWXyXv~}rqR~(ffCOk5^Lz-2ah~JM zJY**NANzaXb#31fkcZuweQ&mlEgznT?k!!&MVHU8@X5o6_dkN%kv;guTfE0Uyb=)> z9qG>s=R=D|uP?FuiJt<#zSj+YDV>trzu&F@deO$Wyeo^sq9f9*MTLQvURGIfpS@xi z7htbt+3Vrg_v?>-w)q>5?uG|e)y&LrOmLSrZXu3ueR{k8ZTDHVdWjd8y>f59t$%p) za38)Oaslfz!;7Is1HQeCR#A29$D{Sh&J5Szy-^s~{!7t(Z1EZPYj4<%h z0}qD0`|;7|tyQnM?AQMKgl*b`Hvos+lPUp@ z2m|L|pBjgAli~Z^oeMSvH@|T#K9)SOV=n=RTvH;H_vAE(zZ@gD@{NsP(SUV{QZzhp zUcHe!*c5o>UU<>T3<*vJR~F#t>Zt?CQ;PS)E^*=uVfVy|`ppB~3%Wg)9xNKLN`jBW zMQ}NcqI;cXrFb#cX>{O`G$Rab(qL5>SaboO6Be`;IfJl+Wv-dB?73^L)87avaSccs@8L zT+ya8gj+K?JmKi**B}oaDR7ZWh8F@Csg4D=CQbVj)@qO~r|vHr)#-3XI696y1;CFJ z6Bmt)$AAlt3D|e%fX%=~i%tt}w=wOk%yuESoTTppHchIlNYU_-6)R!U-R@x8Svlx- zvFwr#*B?09SBS2nq{26)l*I<_+S6`Ic9)H80ruUxswoN))=mp&v|D5FaN13&$KaZ! zC#kULYU+gr913dE#0^!`3N=+JgpO0&QeP1Kh}VdL^ql0t|WfDu72#tJK@hHULvbRv2tB*ku#r z?oc7rY8BbUZm*MV7z|cOaDu}nz@s9$5#SPs6Z64#$+bXJYc?&*E!lIy{5>Any`c-5 zp6d>K_JF^~bl8C0v3tE?iQKT)vpaAND(uVI!FH!(6YJQW&h{YdyVT1XveAG&UyX(V z*Bh8LGHBsoqK01v%LgXQm>M`eW+IL5LT2=#Q#_YUA3kZ$4rLy7)KN$MXZ-~#y^+W7 SY6K?$00005HIhEP)gwt>K~CG- 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 bbyl;#oGM8Uns)%v00000NkvXXu0mjf33xm8 literal 0 HcmV?d00001 diff --git a/examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/icon-72@2x.png b/examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/icon-72@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e3d49a2f136ccae7a2b0c0dd0d7e75dce4cbb7f0 GIT binary patch literal 3315 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 literal 0 HcmV?d00001 diff --git a/examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/icon-76.png b/examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/icon-76.png new file mode 100644 index 0000000000000000000000000000000000000000..aa6810c371931c1e45cb4667f950dcc2d4ff4509 GIT binary patch literal 1764 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 literal 0 HcmV?d00001 diff --git a/examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/icon-83.5@2x.png b/examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/icon-83.5@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..039a02aef058f1f44cd1388ba99755824f9e9d00 GIT binary patch literal 3842 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 Eg1kqH6951J literal 0 HcmV?d00001 diff --git a/examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/icon-86@2x.png b/examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/icon-86@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f32a034a00725c9992fdcf6f74bbd879736a540f GIT binary patch literal 4022 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 literal 0 HcmV?d00001 diff --git a/examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/icon-98@2x.png b/examples/AlanBasicExample/platforms/ios/AlanBasicExample/Images.xcassets/AppIcon.appiconset/icon-98@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..85ec9e369c71d1e6c2213e1a3c9f69e06b2be9f0 GIT binary patch literal 4744 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AlanBasicExample + + A sample Apache Cordova application that responds to the deviceready event. + + + Apache Cordova Team + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/AlanBasicExample/platforms/ios/AlanBasicExample/main.m b/examples/AlanBasicExample/platforms/ios/AlanBasicExample/main.m new file mode 100644 index 0000000..d07a8e0 --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/AlanBasicExample/main.m @@ -0,0 +1,35 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. + */ +// +// main.m +// AlanBasicExample +// +// Created by ___FULLUSERNAME___ on ___DATE___. +// Copyright ___ORGANIZATIONNAME___ ___YEAR___. All rights reserved. +// + +#import + +int main(int argc, char* argv[]) +{ + @autoreleasepool { + int retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate"); + return retVal; + } +} diff --git a/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Private/CDVDebug.h b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Private/CDVDebug.h new file mode 100644 index 0000000..4a0d9f9 --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Private/CDVDebug.h @@ -0,0 +1,25 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. + */ + +#ifdef DEBUG + #define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__) +#else + #define DLog(...) +#endif +#define ALog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__) diff --git a/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Private/CDVJSON_private.h b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Private/CDVJSON_private.h new file mode 100644 index 0000000..afb5cc6 --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Private/CDVJSON_private.h @@ -0,0 +1,31 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. + */ + +@interface NSArray (CDVJSONSerializingPrivate) +- (NSString*)cdv_JSONString; +@end + +@interface NSDictionary (CDVJSONSerializingPrivate) +- (NSString*)cdv_JSONString; +@end + +@interface NSString (CDVJSONSerializingPrivate) +- (id)cdv_JSONObject; +- (id)cdv_JSONFragment; +@end diff --git a/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Private/CDVJSON_private.m b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Private/CDVJSON_private.m new file mode 100644 index 0000000..175ed39 --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Private/CDVJSON_private.m @@ -0,0 +1,99 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. + */ + +#import "CDVJSON_private.h" +#import + +@implementation NSArray (CDVJSONSerializingPrivate) + +- (NSString*)cdv_JSONString +{ + @autoreleasepool { + NSError* error = nil; + NSData* jsonData = [NSJSONSerialization dataWithJSONObject:self + options:0 + error:&error]; + + if (error != nil) { + NSLog(@"NSArray JSONString error: %@", [error localizedDescription]); + return nil; + } else { + return [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; + } + } +} + +@end + +@implementation NSDictionary (CDVJSONSerializingPrivate) + +- (NSString*)cdv_JSONString +{ + @autoreleasepool { + NSError* error = nil; + NSData* jsonData = [NSJSONSerialization dataWithJSONObject:self + options:NSJSONWritingPrettyPrinted + error:&error]; + + if (error != nil) { + NSLog(@"NSDictionary JSONString error: %@", [error localizedDescription]); + return nil; + } else { + return [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; + } + } +} + +@end + +@implementation NSString (CDVJSONSerializingPrivate) + +- (id)cdv_JSONObject +{ + @autoreleasepool { + NSError* error = nil; + id object = [NSJSONSerialization JSONObjectWithData:[self dataUsingEncoding:NSUTF8StringEncoding] + options:NSJSONReadingMutableContainers + error:&error]; + + if (error != nil) { + NSLog(@"NSString JSONObject error: %@, Malformed Data: %@", [error localizedDescription], self); + } + + return object; + } +} + +- (id)cdv_JSONFragment +{ + @autoreleasepool { + NSError* error = nil; + id object = [NSJSONSerialization JSONObjectWithData:[self dataUsingEncoding:NSUTF8StringEncoding] + options:NSJSONReadingAllowFragments + error:&error]; + + if (error != nil) { + NSLog(@"NSString JSONObject error: %@", [error localizedDescription]); + } + + return object; + } +} + +@end diff --git a/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Private/CDVPlugin+Private.h b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Private/CDVPlugin+Private.h new file mode 100644 index 0000000..f88638c --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Private/CDVPlugin+Private.h @@ -0,0 +1,24 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. + */ + +@interface CDVPlugin (Private) + +- (instancetype)initWithWebViewEngine:(id )theWebViewEngine; + +@end diff --git a/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDV.h b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDV.h new file mode 100644 index 0000000..8706ef4 --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDV.h @@ -0,0 +1,30 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. + */ + +#import "CDVAvailability.h" +#import "CDVAvailabilityDeprecated.h" +#import "CDVAppDelegate.h" +#import "CDVPlugin.h" +#import "CDVPluginResult.h" +#import "CDVViewController.h" +#import "CDVCommandDelegate.h" +#import "CDVInvokedUrlCommand.h" +#import "CDVWhitelist.h" +#import "CDVScreenOrientationDelegate.h" +#import "CDVTimer.h" diff --git a/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVAppDelegate.h b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVAppDelegate.h new file mode 100644 index 0000000..de5b518 --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVAppDelegate.h @@ -0,0 +1,28 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. + */ + +#import +#import "CDVViewController.h" + +@interface CDVAppDelegate : NSObject {} + +@property (nonatomic, strong) IBOutlet UIWindow* window; +@property (nonatomic, strong) IBOutlet CDVViewController* viewController; + +@end diff --git a/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVAppDelegate.m b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVAppDelegate.m new file mode 100644 index 0000000..9188be7 --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVAppDelegate.m @@ -0,0 +1,97 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. + */ + +#import "CDVAppDelegate.h" + +@implementation CDVAppDelegate + +@synthesize window, viewController; + +- (id)init +{ + self = [super init]; + return self; +} + +#pragma mark UIApplicationDelegate implementation + +/** + * This is main kick off after the app inits, the views and Settings are setup here. (preferred - iOS4 and up) + */ +- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions +{ + CGRect screenBounds = [[UIScreen mainScreen] bounds]; + + self.window = [[UIWindow alloc] initWithFrame:screenBounds]; + self.window.autoresizesSubviews = YES; + + // only set if not already set in subclass + if (self.viewController == nil) { + self.viewController = [[CDVViewController alloc] init]; + } + + // Set your app's start page by setting the tag in config.xml. + // If necessary, uncomment the line below to override it. + // self.viewController.startPage = @"index.html"; + + // NOTE: To customize the view's frame size (which defaults to full screen), override + // [self.viewController viewWillAppear:] in your view controller. + + self.window.rootViewController = self.viewController; + [self.window makeKeyAndVisible]; + + return YES; +} + +// this happens while we are running ( in the background, or from within our own app ) +// only valid if 40x-Info.plist specifies a protocol to handle +- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary *)options +{ + if (!url) { + return NO; + } + + NSMutableDictionary * openURLData = [[NSMutableDictionary alloc] init]; + + [openURLData setValue:url forKey:@"url"]; + + if (options[UIApplicationOpenURLOptionsSourceApplicationKey]) { + [openURLData setValue:options[UIApplicationOpenURLOptionsSourceApplicationKey] forKey:@"sourceApplication"]; + } + + if (options[UIApplicationOpenURLOptionsAnnotationKey]) { + [openURLData setValue:options[UIApplicationOpenURLOptionsAnnotationKey] forKey:@"annotation"]; + } + + // all plugins will get the notification, and their handlers will be called + [[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:CDVPluginHandleOpenURLNotification object:url]]; + [[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:CDVPluginHandleOpenURLWithAppSourceAndAnnotationNotification object:openURLData]]; + + return YES; +} + +- (UIInterfaceOrientationMask)application:(UIApplication*)application supportedInterfaceOrientationsForWindow:(UIWindow*)window +{ + // iPhone doesn't support upside down by default, while the iPad does. Override to allow all orientations always, and let the root view controller decide what's allowed (the supported orientations mask gets intersected). + NSUInteger supportedInterfaceOrientations = (1 << UIInterfaceOrientationPortrait) | (1 << UIInterfaceOrientationLandscapeLeft) | (1 << UIInterfaceOrientationLandscapeRight) | (1 << UIInterfaceOrientationPortraitUpsideDown); + + return supportedInterfaceOrientations; +} + +@end diff --git a/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVAvailability.h b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVAvailability.h new file mode 100644 index 0000000..8b1ab47 --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVAvailability.h @@ -0,0 +1,118 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. + */ + +#import "CDVAvailabilityDeprecated.h" + +#define __CORDOVA_IOS__ + +#define __CORDOVA_0_9_6 906 +#define __CORDOVA_1_0_0 10000 +#define __CORDOVA_1_1_0 10100 +#define __CORDOVA_1_2_0 10200 +#define __CORDOVA_1_3_0 10300 +#define __CORDOVA_1_4_0 10400 +#define __CORDOVA_1_4_1 10401 +#define __CORDOVA_1_5_0 10500 +#define __CORDOVA_1_6_0 10600 +#define __CORDOVA_1_6_1 10601 +#define __CORDOVA_1_7_0 10700 +#define __CORDOVA_1_8_0 10800 +#define __CORDOVA_1_8_1 10801 +#define __CORDOVA_1_9_0 10900 +#define __CORDOVA_2_0_0 20000 +#define __CORDOVA_2_1_0 20100 +#define __CORDOVA_2_2_0 20200 +#define __CORDOVA_2_3_0 20300 +#define __CORDOVA_2_4_0 20400 +#define __CORDOVA_2_5_0 20500 +#define __CORDOVA_2_6_0 20600 +#define __CORDOVA_2_7_0 20700 +#define __CORDOVA_2_8_0 20800 +#define __CORDOVA_2_9_0 20900 +#define __CORDOVA_3_0_0 30000 +#define __CORDOVA_3_1_0 30100 +#define __CORDOVA_3_2_0 30200 +#define __CORDOVA_3_3_0 30300 +#define __CORDOVA_3_4_0 30400 +#define __CORDOVA_3_4_1 30401 +#define __CORDOVA_3_5_0 30500 +#define __CORDOVA_3_6_0 30600 +#define __CORDOVA_3_7_0 30700 +#define __CORDOVA_3_8_0 30800 +#define __CORDOVA_3_9_0 30900 +#define __CORDOVA_3_9_1 30901 +#define __CORDOVA_3_9_2 30902 +#define __CORDOVA_4_0_0 40000 +#define __CORDOVA_4_0_1 40001 +#define __CORDOVA_4_1_0 40100 +#define __CORDOVA_4_1_1 40101 +#define __CORDOVA_4_2_0 40200 +#define __CORDOVA_4_2_1 40201 +#define __CORDOVA_4_3_0 40300 +#define __CORDOVA_4_3_1 40301 +#define __CORDOVA_4_4_0 40400 +#define __CORDOVA_4_5_0 40500 +#define __CORDOVA_4_5_1 40501 +#define __CORDOVA_4_5_2 40502 +#define __CORDOVA_4_5_4 40504 +#define __CORDOVA_5_0_0 50000 +#define __CORDOVA_5_0_1 50001 +#define __CORDOVA_5_1_0 50100 +#define __CORDOVA_5_1_1 50101 +#define __CORDOVA_6_0_0 60000 +#define __CORDOVA_6_1_0 60100 +#define __CORDOVA_6_2_0 60200 +/* coho:next-version,insert-before */ +#define __CORDOVA_NA 99999 /* not available */ + +/* + #if CORDOVA_VERSION_MIN_REQUIRED >= __CORDOVA_4_0_0 + // do something when its at least 4.0.0 + #else + // do something else (non 4.0.0) + #endif + */ +#ifndef CORDOVA_VERSION_MIN_REQUIRED + /* coho:next-version-min-required,replace-after */ + #define CORDOVA_VERSION_MIN_REQUIRED __CORDOVA_6_2_0 +#endif + +/* + Returns YES if it is at least version specified as NSString(X) + Usage: + if (IsAtLeastiOSVersion(@"5.1")) { + // do something for iOS 5.1 or greater + } + */ +#define IsAtLeastiOSVersion(X) ([[[UIDevice currentDevice] systemVersion] compare:X options:NSNumericSearch] != NSOrderedAscending) + +/* Return the string version of the decimal version */ +#define CDV_VERSION [NSString stringWithFormat:@"%d.%d.%d", \ + (CORDOVA_VERSION_MIN_REQUIRED / 10000), \ + (CORDOVA_VERSION_MIN_REQUIRED % 10000) / 100, \ + (CORDOVA_VERSION_MIN_REQUIRED % 10000) % 100] + +// Enable this to log all exec() calls. +#define CDV_ENABLE_EXEC_LOGGING 0 +#if CDV_ENABLE_EXEC_LOGGING + #define CDV_EXEC_LOG NSLog +#else + #define CDV_EXEC_LOG(...) do { \ +} while (NO) +#endif diff --git a/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVAvailabilityDeprecated.h b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVAvailabilityDeprecated.h new file mode 100644 index 0000000..abf7a16 --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVAvailabilityDeprecated.h @@ -0,0 +1,26 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. + */ + +#import + +#ifdef __clang__ + #define CDV_DEPRECATED(version, msg) __attribute__((deprecated("Deprecated in Cordova " #version ". " msg))) +#else + #define CDV_DEPRECATED(version, msg) __attribute__((deprecated())) +#endif diff --git a/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVCommandDelegate.h b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVCommandDelegate.h new file mode 100644 index 0000000..ac82727 --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVCommandDelegate.h @@ -0,0 +1,49 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. + */ + +#import "CDVAvailability.h" +#import "CDVInvokedUrlCommand.h" + +@class CDVPlugin; +@class CDVPluginResult; +@class CDVWhitelist; + +typedef NSURL* (^ UrlTransformerBlock)(NSURL*); + +@protocol CDVCommandDelegate + +@property (nonatomic, readonly) NSDictionary* settings; +@property (nonatomic, copy) UrlTransformerBlock urlTransformer; + +- (NSString*)pathForResource:(NSString*)resourcepath; +- (id)getCommandInstance:(NSString*)pluginName; + +// Sends a plugin result to the JS. This is thread-safe. +- (void)sendPluginResult:(CDVPluginResult*)result callbackId:(NSString*)callbackId; +// Evaluates the given JS. This is thread-safe. +- (void)evalJs:(NSString*)js; +// Can be used to evaluate JS right away instead of scheduling it on the run-loop. +// This is required for dispatch resign and pause events, but should not be used +// without reason. Without the run-loop delay, alerts used in JS callbacks may result +// in dead-lock. This method must be called from the UI thread. +- (void)evalJs:(NSString*)js scheduledOnRunLoop:(BOOL)scheduledOnRunLoop; +// Runs the given block on a background thread using a shared thread-pool. +- (void)runInBackground:(void (^)(void))block; + +@end diff --git a/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVCommandDelegateImpl.h b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVCommandDelegateImpl.h new file mode 100644 index 0000000..0531134 --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVCommandDelegateImpl.h @@ -0,0 +1,36 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. + */ + +#import +#import "CDVCommandDelegate.h" + +@class CDVViewController; +@class CDVCommandQueue; + +@interface CDVCommandDelegateImpl : NSObject { + @private + __weak CDVViewController* _viewController; + NSRegularExpression* _callbackIdPattern; + @protected + __weak CDVCommandQueue* _commandQueue; + BOOL _delayResponses; +} +- (id)initWithViewController:(CDVViewController*)viewController; +- (void)flushCommandQueueWithDelayedJs; +@end diff --git a/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVCommandDelegateImpl.m b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVCommandDelegateImpl.m new file mode 100644 index 0000000..649d30d --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVCommandDelegateImpl.m @@ -0,0 +1,181 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. + */ + +#import "CDVCommandDelegateImpl.h" +#import "CDVJSON_private.h" +#import "CDVCommandQueue.h" +#import "CDVPluginResult.h" +#import "CDVViewController.h" + +@implementation CDVCommandDelegateImpl + +@synthesize urlTransformer; + +- (id)initWithViewController:(CDVViewController*)viewController +{ + self = [super init]; + if (self != nil) { + _viewController = viewController; + _commandQueue = _viewController.commandQueue; + + NSError* err = nil; + _callbackIdPattern = [NSRegularExpression regularExpressionWithPattern:@"[^A-Za-z0-9._-]" options:0 error:&err]; + if (err != nil) { + // Couldn't initialize Regex + NSLog(@"Error: Couldn't initialize regex"); + _callbackIdPattern = nil; + } + } + return self; +} + +- (NSString*)pathForResource:(NSString*)resourcepath +{ + NSBundle* mainBundle = [NSBundle mainBundle]; + NSMutableArray* directoryParts = [NSMutableArray arrayWithArray:[resourcepath componentsSeparatedByString:@"/"]]; + NSString* filename = [directoryParts lastObject]; + + [directoryParts removeLastObject]; + + NSString* directoryPartsJoined = [directoryParts componentsJoinedByString:@"/"]; + NSString* directoryStr = _viewController.wwwFolderName; + + if ([directoryPartsJoined length] > 0) { + directoryStr = [NSString stringWithFormat:@"%@/%@", _viewController.wwwFolderName, [directoryParts componentsJoinedByString:@"/"]]; + } + + return [mainBundle pathForResource:filename ofType:@"" inDirectory:directoryStr]; +} + +- (void)flushCommandQueueWithDelayedJs +{ + _delayResponses = YES; + [_commandQueue executePending]; + _delayResponses = NO; +} + +- (void)evalJsHelper2:(NSString*)js +{ + CDV_EXEC_LOG(@"Exec: evalling: %@", [js substringToIndex:MIN([js length], 160)]); + [_viewController.webViewEngine evaluateJavaScript:js completionHandler:^(id obj, NSError* error) { + // TODO: obj can be something other than string + if ([obj isKindOfClass:[NSString class]]) { + NSString* commandsJSON = (NSString*)obj; + if ([commandsJSON length] > 0) { + CDV_EXEC_LOG(@"Exec: Retrieved new exec messages by chaining."); + } + + [self->_commandQueue enqueueCommandBatch:commandsJSON]; + [self->_commandQueue executePending]; + } + }]; +} + +- (void)evalJsHelper:(NSString*)js +{ + // Cycle the run-loop before executing the JS. + // For _delayResponses - + // This ensures that we don't eval JS during the middle of an existing JS + // function (possible since WKWebViewDelegate callbacks can be synchronous). + // For !isMainThread - + // It's a hard error to eval on the non-UI thread. + // For !_commandQueue.currentlyExecuting - + // This works around a bug where sometimes alerts() within callbacks can cause + // dead-lock. + // If the commandQueue is currently executing, then we know that it is safe to + // execute the callback immediately. + // Using (dispatch_get_main_queue()) does *not* fix deadlocks for some reason, + // but performSelectorOnMainThread: does. + if (_delayResponses || ![NSThread isMainThread] || !_commandQueue.currentlyExecuting) { + [self performSelectorOnMainThread:@selector(evalJsHelper2:) withObject:js waitUntilDone:NO]; + } else { + [self evalJsHelper2:js]; + } +} + +- (BOOL)isValidCallbackId:(NSString*)callbackId +{ + if ((callbackId == nil) || (_callbackIdPattern == nil)) { + return NO; + } + + // Disallow if too long or if any invalid characters were found. + if (([callbackId length] > 100) || [_callbackIdPattern firstMatchInString:callbackId options:0 range:NSMakeRange(0, [callbackId length])]) { + return NO; + } + return YES; +} + +- (void)sendPluginResult:(CDVPluginResult*)result callbackId:(NSString*)callbackId +{ + CDV_EXEC_LOG(@"Exec(%@): Sending result. Status=%@", callbackId, result.status); + // This occurs when there is are no win/fail callbacks for the call. + if ([@"INVALID" isEqualToString:callbackId]) { + return; + } + // This occurs when the callback id is malformed. + if (![self isValidCallbackId:callbackId]) { + NSLog(@"Invalid callback id received by sendPluginResult"); + return; + } + int status = [result.status intValue]; + BOOL keepCallback = [result.keepCallback boolValue]; + NSString* argumentsAsJSON = [result argumentsAsJSON]; + BOOL debug = NO; + +#ifdef DEBUG + debug = YES; +#endif + + NSString* js = [NSString stringWithFormat:@"cordova.require('cordova/exec').nativeCallback('%@',%d,%@,%d, %d)", callbackId, status, argumentsAsJSON, keepCallback, debug]; + + [self evalJsHelper:js]; +} + +- (void)evalJs:(NSString*)js +{ + [self evalJs:js scheduledOnRunLoop:YES]; +} + +- (void)evalJs:(NSString*)js scheduledOnRunLoop:(BOOL)scheduledOnRunLoop +{ + js = [NSString stringWithFormat:@"try{cordova.require('cordova/exec').nativeEvalAndFetch(function(){%@})}catch(e){console.log('exception nativeEvalAndFetch : '+e);};", js]; + if (scheduledOnRunLoop) { + [self evalJsHelper:js]; + } else { + [self evalJsHelper2:js]; + } +} + +- (id)getCommandInstance:(NSString*)pluginName +{ + return [_viewController getCommandInstance:pluginName]; +} + +- (void)runInBackground:(void (^)(void))block +{ + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), block); +} + +- (NSDictionary*)settings +{ + return _viewController.settings; +} + +@end diff --git a/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVCommandQueue.h b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVCommandQueue.h new file mode 100644 index 0000000..cb7bd6e --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVCommandQueue.h @@ -0,0 +1,39 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. + */ + +#import + +@class CDVInvokedUrlCommand; +@class CDVViewController; + +@interface CDVCommandQueue : NSObject + +@property (nonatomic, readonly) BOOL currentlyExecuting; + +- (id)initWithViewController:(CDVViewController*)viewController; +- (void)dispose; + +- (void)resetRequestId; +- (void)enqueueCommandBatch:(NSString*)batchJSON; + +- (void)fetchCommandsFromJs; +- (void)executePending; +- (BOOL)execute:(CDVInvokedUrlCommand*)command; + +@end diff --git a/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVCommandQueue.m b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVCommandQueue.m new file mode 100644 index 0000000..b78ed83 --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVCommandQueue.m @@ -0,0 +1,194 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. + */ + +#include +#import "CDVCommandQueue.h" +#import "CDVViewController.h" +#import "CDVCommandDelegateImpl.h" +#import "CDVJSON_private.h" +#import "CDVDebug.h" + +// Parse JS on the main thread if it's shorter than this. +static const NSInteger JSON_SIZE_FOR_MAIN_THREAD = 4 * 1024; // Chosen arbitrarily. +// Execute multiple commands in one go until this many seconds have passed. +static const double MAX_EXECUTION_TIME = .008; // Half of a 60fps frame. + +@interface CDVCommandQueue () { + NSInteger _lastCommandQueueFlushRequestId; + __weak CDVViewController* _viewController; + NSMutableArray* _queue; + NSTimeInterval _startExecutionTime; +} +@end + +@implementation CDVCommandQueue + +- (BOOL)currentlyExecuting +{ + return _startExecutionTime > 0; +} + +- (id)initWithViewController:(CDVViewController*)viewController +{ + self = [super init]; + if (self != nil) { + _viewController = viewController; + _queue = [[NSMutableArray alloc] init]; + } + return self; +} + +- (void)dispose +{ + // TODO(agrieve): Make this a zeroing weak ref once we drop support for 4.3. + _viewController = nil; +} + +- (void)resetRequestId +{ + _lastCommandQueueFlushRequestId = 0; +} + +- (void)enqueueCommandBatch:(NSString*)batchJSON +{ + if ([batchJSON length] > 0) { + NSMutableArray* commandBatchHolder = [[NSMutableArray alloc] init]; + [_queue addObject:commandBatchHolder]; + if ([batchJSON length] < JSON_SIZE_FOR_MAIN_THREAD) { + [commandBatchHolder addObject:[batchJSON cdv_JSONObject]]; + } else { + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^() { + NSMutableArray* result = [batchJSON cdv_JSONObject]; + @synchronized(commandBatchHolder) { + [commandBatchHolder addObject:result]; + } + [self performSelectorOnMainThread:@selector(executePending) withObject:nil waitUntilDone:NO]; + }); + } + } +} + +- (void)fetchCommandsFromJs +{ + __weak CDVCommandQueue* weakSelf = self; + NSString* js = @"cordova.require('cordova/exec').nativeFetchMessages()"; + + [_viewController.webViewEngine evaluateJavaScript:js + completionHandler:^(id obj, NSError* error) { + if ((error == nil) && [obj isKindOfClass:[NSString class]]) { + NSString* queuedCommandsJSON = (NSString*)obj; + CDV_EXEC_LOG(@"Exec: Flushed JS->native queue (hadCommands=%d).", [queuedCommandsJSON length] > 0); + [weakSelf enqueueCommandBatch:queuedCommandsJSON]; + // this has to be called here now, because fetchCommandsFromJs is now async (previously: synchronous) + [self executePending]; + } + }]; +} + +- (void)executePending +{ + // Make us re-entrant-safe. + if (_startExecutionTime > 0) { + return; + } + @try { + _startExecutionTime = [NSDate timeIntervalSinceReferenceDate]; + + while ([_queue count] > 0) { + NSMutableArray* commandBatchHolder = _queue[0]; + NSMutableArray* commandBatch = nil; + @synchronized(commandBatchHolder) { + // If the next-up command is still being decoded, wait for it. + if ([commandBatchHolder count] == 0) { + break; + } + commandBatch = commandBatchHolder[0]; + } + + while ([commandBatch count] > 0) { + @autoreleasepool { + // Execute the commands one-at-a-time. + NSArray* jsonEntry = [commandBatch cdv_dequeue]; + if ([commandBatch count] == 0) { + [_queue removeObjectAtIndex:0]; + } + CDVInvokedUrlCommand* command = [CDVInvokedUrlCommand commandFromJson:jsonEntry]; + CDV_EXEC_LOG(@"Exec(%@): Calling %@.%@", command.callbackId, command.className, command.methodName); + + if (![self execute:command]) { +#ifdef DEBUG + NSString* commandJson = [jsonEntry cdv_JSONString]; + static NSUInteger maxLogLength = 1024; + NSString* commandString = ([commandJson length] > maxLogLength) ? + [NSString stringWithFormat : @"%@[...]", [commandJson substringToIndex:maxLogLength]] : + commandJson; + + DLog(@"FAILED pluginJSON = %@", commandString); +#endif + } + } + + // Yield if we're taking too long. + if (([_queue count] > 0) && ([NSDate timeIntervalSinceReferenceDate] - _startExecutionTime > MAX_EXECUTION_TIME)) { + [self performSelector:@selector(executePending) withObject:nil afterDelay:0]; + return; + } + } + } + } @finally + { + _startExecutionTime = 0; + } +} + +- (BOOL)execute:(CDVInvokedUrlCommand*)command +{ + if ((command.className == nil) || (command.methodName == nil)) { + NSLog(@"ERROR: Classname and/or methodName not found for command."); + return NO; + } + + // Fetch an instance of this class + CDVPlugin* obj = [_viewController.commandDelegate getCommandInstance:command.className]; + + if (!([obj isKindOfClass:[CDVPlugin class]])) { + NSLog(@"ERROR: Plugin '%@' not found, or is not a CDVPlugin. Check your plugin mapping in config.xml.", command.className); + return NO; + } + BOOL retVal = YES; + double started = [[NSDate date] timeIntervalSince1970] * 1000.0; + // Find the proper selector to call. + NSString* methodName = [NSString stringWithFormat:@"%@:", command.methodName]; + SEL normalSelector = NSSelectorFromString(methodName); + if ([obj respondsToSelector:normalSelector]) { + // [obj performSelector:normalSelector withObject:command]; + ((void (*)(id, SEL, id))objc_msgSend)(obj, normalSelector, command); + } else { + // There's no method to call, so throw an error. + NSLog(@"ERROR: Method '%@' not defined in Plugin '%@'", methodName, command.className); + retVal = NO; + } + double elapsed = [[NSDate date] timeIntervalSince1970] * 1000.0 - started; + if (elapsed > 10) { + NSLog(@"THREAD WARNING: ['%@'] took '%f' ms. Plugin should use a background thread.", command.className, elapsed); + } + return retVal; +} + +@end diff --git a/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVConfigParser.h b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVConfigParser.h new file mode 100644 index 0000000..bae3d0f --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVConfigParser.h @@ -0,0 +1,30 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. + */ + +@interface CDVConfigParser : NSObject +{ + NSString* featureName; +} + +@property (nonatomic, readonly, strong) NSMutableDictionary* pluginsDict; +@property (nonatomic, readonly, strong) NSMutableDictionary* settings; +@property (nonatomic, readonly, strong) NSMutableArray* startupPluginNames; +@property (nonatomic, readonly, strong) NSString* startPage; + +@end diff --git a/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVConfigParser.m b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVConfigParser.m new file mode 100644 index 0000000..ab32b4a --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVConfigParser.m @@ -0,0 +1,81 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. + */ + +#import "CDVConfigParser.h" + +@interface CDVConfigParser () + +@property (nonatomic, readwrite, strong) NSMutableDictionary* pluginsDict; +@property (nonatomic, readwrite, strong) NSMutableDictionary* settings; +@property (nonatomic, readwrite, strong) NSMutableArray* startupPluginNames; +@property (nonatomic, readwrite, strong) NSString* startPage; + +@end + +@implementation CDVConfigParser + +@synthesize pluginsDict, settings, startPage, startupPluginNames; + +- (id)init +{ + self = [super init]; + if (self != nil) { + self.pluginsDict = [[NSMutableDictionary alloc] initWithCapacity:30]; + self.settings = [[NSMutableDictionary alloc] initWithCapacity:30]; + self.startupPluginNames = [[NSMutableArray alloc] initWithCapacity:8]; + featureName = nil; + } + return self; +} + +- (void)parser:(NSXMLParser*)parser didStartElement:(NSString*)elementName namespaceURI:(NSString*)namespaceURI qualifiedName:(NSString*)qualifiedName attributes:(NSDictionary*)attributeDict +{ + if ([elementName isEqualToString:@"preference"]) { + settings[[attributeDict[@"name"] lowercaseString]] = attributeDict[@"value"]; + } else if ([elementName isEqualToString:@"feature"]) { // store feature name to use with correct parameter set + featureName = [attributeDict[@"name"] lowercaseString]; + } else if ((featureName != nil) && [elementName isEqualToString:@"param"]) { + NSString* paramName = [attributeDict[@"name"] lowercaseString]; + id value = attributeDict[@"value"]; + if ([paramName isEqualToString:@"ios-package"]) { + pluginsDict[featureName] = value; + } + BOOL paramIsOnload = ([paramName isEqualToString:@"onload"] && [@"true" isEqualToString : value]); + BOOL attribIsOnload = [@"true" isEqualToString :[attributeDict[@"onload"] lowercaseString]]; + if (paramIsOnload || attribIsOnload) { + [self.startupPluginNames addObject:featureName]; + } + } else if ([elementName isEqualToString:@"content"]) { + self.startPage = attributeDict[@"src"]; + } +} + +- (void)parser:(NSXMLParser*)parser didEndElement:(NSString*)elementName namespaceURI:(NSString*)namespaceURI qualifiedName:(NSString*)qualifiedName +{ + if ([elementName isEqualToString:@"feature"]) { // no longer handling a feature so release + featureName = nil; + } +} + +- (void)parser:(NSXMLParser*)parser parseErrorOccurred:(NSError*)parseError +{ + NSAssert(NO, @"config.xml parse error line %ld col %ld", (long)[parser lineNumber], (long)[parser columnNumber]); +} + +@end diff --git a/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVInvokedUrlCommand.h b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVInvokedUrlCommand.h new file mode 100644 index 0000000..993e0a2 --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVInvokedUrlCommand.h @@ -0,0 +1,52 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. + */ + +#import + +@interface CDVInvokedUrlCommand : NSObject { + NSString* _callbackId; + NSString* _className; + NSString* _methodName; + NSArray* _arguments; +} + +@property (nonatomic, readonly) NSArray* arguments; +@property (nonatomic, readonly) NSString* callbackId; +@property (nonatomic, readonly) NSString* className; +@property (nonatomic, readonly) NSString* methodName; + ++ (CDVInvokedUrlCommand*)commandFromJson:(NSArray*)jsonEntry; + +- (id)initWithArguments:(NSArray*)arguments + callbackId:(NSString*)callbackId + className:(NSString*)className + methodName:(NSString*)methodName; + +- (id)initFromJson:(NSArray*)jsonEntry; + +// Returns the argument at the given index. +// If index >= the number of arguments, returns nil. +// If the argument at the given index is NSNull, returns nil. +- (id)argumentAtIndex:(NSUInteger)index; +// Same as above, but returns defaultValue instead of nil. +- (id)argumentAtIndex:(NSUInteger)index withDefault:(id)defaultValue; +// Same as above, but returns defaultValue instead of nil, and if the argument is not of the expected class, returns defaultValue +- (id)argumentAtIndex:(NSUInteger)index withDefault:(id)defaultValue andClass:(Class)aClass; + +@end diff --git a/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVInvokedUrlCommand.m b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVInvokedUrlCommand.m new file mode 100644 index 0000000..5b4281d --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVInvokedUrlCommand.m @@ -0,0 +1,116 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. + */ + +#import "CDVInvokedUrlCommand.h" +#import "CDVJSON_private.h" + +@implementation CDVInvokedUrlCommand + +@synthesize arguments = _arguments; +@synthesize callbackId = _callbackId; +@synthesize className = _className; +@synthesize methodName = _methodName; + ++ (CDVInvokedUrlCommand*)commandFromJson:(NSArray*)jsonEntry +{ + return [[CDVInvokedUrlCommand alloc] initFromJson:jsonEntry]; +} + +- (id)initFromJson:(NSArray*)jsonEntry +{ + id tmp = [jsonEntry objectAtIndex:0]; + NSString* callbackId = tmp == [NSNull null] ? nil : tmp; + NSString* className = [jsonEntry objectAtIndex:1]; + NSString* methodName = [jsonEntry objectAtIndex:2]; + NSMutableArray* arguments = [jsonEntry objectAtIndex:3]; + + return [self initWithArguments:arguments + callbackId:callbackId + className:className + methodName:methodName]; +} + +- (id)initWithArguments:(NSArray*)arguments + callbackId:(NSString*)callbackId + className:(NSString*)className + methodName:(NSString*)methodName +{ + self = [super init]; + if (self != nil) { + _arguments = arguments; + _callbackId = callbackId; + _className = className; + _methodName = methodName; + } + [self massageArguments]; + return self; +} + +- (void)massageArguments +{ + NSMutableArray* newArgs = nil; + + for (NSUInteger i = 0, count = [_arguments count]; i < count; ++i) { + id arg = [_arguments objectAtIndex:i]; + if (![arg isKindOfClass:[NSDictionary class]]) { + continue; + } + NSDictionary* dict = arg; + NSString* type = [dict objectForKey:@"CDVType"]; + if (!type || ![type isEqualToString:@"ArrayBuffer"]) { + continue; + } + NSString* data = [dict objectForKey:@"data"]; + if (!data) { + continue; + } + if (newArgs == nil) { + newArgs = [NSMutableArray arrayWithArray:_arguments]; + _arguments = newArgs; + } + [newArgs replaceObjectAtIndex:i withObject:[[NSData alloc] initWithBase64EncodedString:data options:0]]; + } +} + +- (id)argumentAtIndex:(NSUInteger)index +{ + return [self argumentAtIndex:index withDefault:nil]; +} + +- (id)argumentAtIndex:(NSUInteger)index withDefault:(id)defaultValue +{ + return [self argumentAtIndex:index withDefault:defaultValue andClass:nil]; +} + +- (id)argumentAtIndex:(NSUInteger)index withDefault:(id)defaultValue andClass:(Class)aClass +{ + if (index >= [_arguments count]) { + return defaultValue; + } + id ret = [_arguments objectAtIndex:index]; + if (ret == [NSNull null]) { + ret = defaultValue; + } + if ((aClass != nil) && ![ret isKindOfClass:aClass]) { + ret = defaultValue; + } + return ret; +} + +@end diff --git a/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVPlugin+Resources.h b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVPlugin+Resources.h new file mode 100644 index 0000000..cc43b16 --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVPlugin+Resources.h @@ -0,0 +1,39 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. + */ + +#import +#import "CDVPlugin.h" + +@interface CDVPlugin (CDVPluginResources) + +/* + This will return the localized string for a key in a .bundle that is named the same as your class + For example, if your plugin class was called Foo, and you have a Spanish localized strings file, it will + try to load the desired key from Foo.bundle/es.lproj/Localizable.strings + */ +- (NSString*)pluginLocalizedString:(NSString*)key; + +/* + This will return the image for a name in a .bundle that is named the same as your class + For example, if your plugin class was called Foo, and you have an image called "bar", + it will try to load the image from Foo.bundle/bar.png (and appropriately named retina versions) + */ +- (UIImage*)pluginImageResource:(NSString*)name; + +@end diff --git a/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVPlugin+Resources.m b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVPlugin+Resources.m new file mode 100644 index 0000000..5690738 --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVPlugin+Resources.m @@ -0,0 +1,38 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. + */ + +#import "CDVPlugin+Resources.h" + +@implementation CDVPlugin (CDVPluginResources) + +- (NSString*)pluginLocalizedString:(NSString*)key +{ + NSBundle* bundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:NSStringFromClass([self class]) ofType:@"bundle"]]; + + return [bundle localizedStringForKey:(key) value:nil table:nil]; +} + +- (UIImage*)pluginImageResource:(NSString*)name +{ + NSString* resourceIdentifier = [NSString stringWithFormat:@"%@.bundle/%@", NSStringFromClass([self class]), name]; + + return [UIImage imageNamed:resourceIdentifier]; +} + +@end diff --git a/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVPlugin.h b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVPlugin.h new file mode 100644 index 0000000..0bdbbab --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVPlugin.h @@ -0,0 +1,74 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. + */ + +#import +#import +#import "CDVPluginResult.h" +#import "NSMutableArray+QueueAdditions.h" +#import "CDVCommandDelegate.h" +#import "CDVWebViewEngineProtocol.h" + +@interface UIView (org_apache_cordova_UIView_Extension) + +@property (nonatomic, weak) UIScrollView* scrollView; + +@end + +extern NSString* const CDVPageDidLoadNotification; +extern NSString* const CDVPluginHandleOpenURLNotification; +extern NSString* const CDVPluginHandleOpenURLWithAppSourceAndAnnotationNotification; +extern NSString* const CDVPluginResetNotification; +extern NSString* const CDVViewWillAppearNotification; +extern NSString* const CDVViewDidAppearNotification; +extern NSString* const CDVViewWillDisappearNotification; +extern NSString* const CDVViewDidDisappearNotification; +extern NSString* const CDVViewWillLayoutSubviewsNotification; +extern NSString* const CDVViewDidLayoutSubviewsNotification; +extern NSString* const CDVViewWillTransitionToSizeNotification; + +@interface CDVPlugin : NSObject {} + +@property (nonatomic, readonly, weak) UIView* webView; +@property (nonatomic, readonly, weak) id webViewEngine; + +@property (nonatomic, weak) UIViewController* viewController; +@property (nonatomic, weak) id commandDelegate; + +@property (readonly, assign) BOOL hasPendingOperation; + +- (void)pluginInitialize; + +- (void)handleOpenURL:(NSNotification*)notification; +- (void)handleOpenURLWithApplicationSourceAndAnnotation:(NSNotification*)notification; +- (void)onAppTerminate; +- (void)onMemoryWarning; +- (void)onReset; +- (void)dispose; + +/* + // see initWithWebView implementation + - (void) onPause {} + - (void) onResume {} + - (void) onOrientationWillChange {} + - (void) onOrientationDidChange {} + */ + +- (id)appDelegate; + +@end diff --git a/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVPlugin.m b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVPlugin.m new file mode 100644 index 0000000..6af03e9 --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVPlugin.m @@ -0,0 +1,199 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. + */ + +#import "CDVPlugin.h" +#import "CDVPlugin+Private.h" +#import "CDVPlugin+Resources.h" +#import "CDVViewController.h" +#include + +@implementation UIView (org_apache_cordova_UIView_Extension) + +@dynamic scrollView; + +- (UIScrollView*)scrollView +{ + SEL scrollViewSelector = NSSelectorFromString(@"scrollView"); + + if ([self respondsToSelector:scrollViewSelector]) { + return ((id (*)(id, SEL))objc_msgSend)(self, scrollViewSelector); + } + + return nil; +} + +@end + +NSString* const CDVPageDidLoadNotification = @"CDVPageDidLoadNotification"; +NSString* const CDVPluginHandleOpenURLNotification = @"CDVPluginHandleOpenURLNotification"; +NSString* const CDVPluginHandleOpenURLWithAppSourceAndAnnotationNotification = @"CDVPluginHandleOpenURLWithAppSourceAndAnnotationNotification"; +NSString* const CDVPluginResetNotification = @"CDVPluginResetNotification"; +NSString* const CDVViewWillAppearNotification = @"CDVViewWillAppearNotification"; +NSString* const CDVViewDidAppearNotification = @"CDVViewDidAppearNotification"; +NSString* const CDVViewWillDisappearNotification = @"CDVViewWillDisappearNotification"; +NSString* const CDVViewDidDisappearNotification = @"CDVViewDidDisappearNotification"; +NSString* const CDVViewWillLayoutSubviewsNotification = @"CDVViewWillLayoutSubviewsNotification"; +NSString* const CDVViewDidLayoutSubviewsNotification = @"CDVViewDidLayoutSubviewsNotification"; +NSString* const CDVViewWillTransitionToSizeNotification = @"CDVViewWillTransitionToSizeNotification"; + +@interface CDVPlugin () + +@property (readwrite, assign) BOOL hasPendingOperation; +@property (nonatomic, readwrite, weak) id webViewEngine; + +@end + +@implementation CDVPlugin +@synthesize webViewEngine, viewController, commandDelegate, hasPendingOperation; +@dynamic webView; + +// Do not override these methods. Use pluginInitialize instead. +- (instancetype)initWithWebViewEngine:(id )theWebViewEngine +{ + self = [super init]; + if (self) { + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onAppTerminate) name:UIApplicationWillTerminateNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onMemoryWarning) name:UIApplicationDidReceiveMemoryWarningNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleOpenURL:) name:CDVPluginHandleOpenURLNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleOpenURLWithApplicationSourceAndAnnotation:) name:CDVPluginHandleOpenURLWithAppSourceAndAnnotationNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onReset) name:CDVPluginResetNotification object:theWebViewEngine.engineWebView]; + + self.webViewEngine = theWebViewEngine; + } + return self; +} + +- (void)pluginInitialize +{ + // You can listen to more app notifications, see: + // http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIApplication_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40006728-CH3-DontLinkElementID_4 + + // NOTE: if you want to use these, make sure you uncomment the corresponding notification handler + + // [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onPause) name:UIApplicationDidEnterBackgroundNotification object:nil]; + // [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onResume) name:UIApplicationWillEnterForegroundNotification object:nil]; + // [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onOrientationWillChange) name:UIApplicationWillChangeStatusBarOrientationNotification object:nil]; + // [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onOrientationDidChange) name:UIApplicationDidChangeStatusBarOrientationNotification object:nil]; + + // Added in 2.5.0 + // [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(pageDidLoad:) name:CDVPageDidLoadNotification object:self.webView]; + //Added in 4.3.0 + // [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(viewWillAppear:) name:CDVViewWillAppearNotification object:nil]; + // [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(viewDidAppear:) name:CDVViewDidAppearNotification object:nil]; + // [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(viewWillDisappear:) name:CDVViewWillDisappearNotification object:nil]; + // [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(viewDidDisappear:) name:CDVViewDidDisappearNotification object:nil]; + // [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(viewWillLayoutSubviews:) name:CDVViewWillLayoutSubviewsNotification object:nil]; + // [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(viewDidLayoutSubviews:) name:CDVViewDidLayoutSubviewsNotification object:nil]; + // [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(viewWillTransitionToSize:) name:CDVViewWillTransitionToSizeNotification object:nil]; +} + +- (void)dispose +{ + viewController = nil; + commandDelegate = nil; +} + +- (UIView*)webView +{ + if (self.webViewEngine != nil) { + return self.webViewEngine.engineWebView; + } + + return nil; +} + +/* +// NOTE: for onPause and onResume, calls into JavaScript must not call or trigger any blocking UI, like alerts +- (void) onPause {} +- (void) onResume {} +- (void) onOrientationWillChange {} +- (void) onOrientationDidChange {} +*/ + +/* NOTE: calls into JavaScript must not call or trigger any blocking UI, like alerts */ +- (void)handleOpenURL:(NSNotification*)notification +{ + // override to handle urls sent to your app + // register your url schemes in your App-Info.plist + + NSURL* url = [notification object]; + + if ([url isKindOfClass:[NSURL class]]) { + /* Do your thing! */ + } +} + +/* + NOTE: calls into JavaScript must not call or trigger any blocking UI, like alerts + */ +- (void)handleOpenURLWithApplicationSourceAndAnnotation: (NSNotification*)notification +{ + + // override to handle urls sent to your app + // register your url schemes in your App-Info.plist + + // The notification object is an NSDictionary which contains + // - url which is a type of NSURL + // - sourceApplication which is a type of NSString and represents the package + // id of the app that calls our app + // - annotation which a type of Property list which can be several different types + // please see https://developer.apple.com/library/content/documentation/General/Conceptual/DevPedia-CocoaCore/PropertyList.html + + NSDictionary* notificationData = [notification object]; + + if ([notificationData isKindOfClass: NSDictionary.class]){ + + NSURL* url = notificationData[@"url"]; + NSString* sourceApplication = notificationData[@"sourceApplication"]; + id annotation = notificationData[@"annotation"]; + + if ([url isKindOfClass:NSURL.class] && [sourceApplication isKindOfClass:NSString.class] && annotation) { + /* Do your thing! */ + } + } +} + + +/* NOTE: calls into JavaScript must not call or trigger any blocking UI, like alerts */ +- (void)onAppTerminate +{ + // override this if you need to do any cleanup on app exit +} + +- (void)onMemoryWarning +{ + // override to remove caches, etc +} + +- (void)onReset +{ + // Override to cancel any long-running requests when the WebView navigates or refreshes. +} + +- (void)dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; // this will remove all notifications unless added using addObserverForName:object:queue:usingBlock: +} + +- (id)appDelegate +{ + return [[UIApplication sharedApplication] delegate]; +} + +@end diff --git a/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVPluginResult.h b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVPluginResult.h new file mode 100644 index 0000000..2f62d77 --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVPluginResult.h @@ -0,0 +1,83 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. + */ + +#import +#import "CDVAvailability.h" + +typedef NS_ENUM(NSUInteger, CDVCommandStatus) { + CDVCommandStatus_NO_RESULT NS_SWIFT_NAME(noResult) = 0, + CDVCommandStatus_OK NS_SWIFT_NAME(ok), + CDVCommandStatus_CLASS_NOT_FOUND_EXCEPTION NS_SWIFT_NAME(classNotFoundException), + CDVCommandStatus_ILLEGAL_ACCESS_EXCEPTION NS_SWIFT_NAME(illegalAccessException), + CDVCommandStatus_INSTANTIATION_EXCEPTION NS_SWIFT_NAME(instantiationException), + CDVCommandStatus_MALFORMED_URL_EXCEPTION NS_SWIFT_NAME(malformedUrlException), + CDVCommandStatus_IO_EXCEPTION NS_SWIFT_NAME(ioException), + CDVCommandStatus_INVALID_ACTION NS_SWIFT_NAME(invalidAction), + CDVCommandStatus_JSON_EXCEPTION NS_SWIFT_NAME(jsonException), + CDVCommandStatus_ERROR NS_SWIFT_NAME(error) +}; + +// This exists to preserve compatibility with early Swift plugins, who are +// using CDVCommandStatus as ObjC-style constants rather than as Swift enum +// values. +// This declares extern'ed constants (implemented in CDVPluginResult.m) +#define SWIFT_ENUM_COMPAT_HACK(enumVal) extern const CDVCommandStatus SWIFT_##enumVal NS_SWIFT_NAME(enumVal) +SWIFT_ENUM_COMPAT_HACK(CDVCommandStatus_NO_RESULT); +SWIFT_ENUM_COMPAT_HACK(CDVCommandStatus_OK); +SWIFT_ENUM_COMPAT_HACK(CDVCommandStatus_CLASS_NOT_FOUND_EXCEPTION); +SWIFT_ENUM_COMPAT_HACK(CDVCommandStatus_ILLEGAL_ACCESS_EXCEPTION); +SWIFT_ENUM_COMPAT_HACK(CDVCommandStatus_INSTANTIATION_EXCEPTION); +SWIFT_ENUM_COMPAT_HACK(CDVCommandStatus_MALFORMED_URL_EXCEPTION); +SWIFT_ENUM_COMPAT_HACK(CDVCommandStatus_IO_EXCEPTION); +SWIFT_ENUM_COMPAT_HACK(CDVCommandStatus_INVALID_ACTION); +SWIFT_ENUM_COMPAT_HACK(CDVCommandStatus_JSON_EXCEPTION); +SWIFT_ENUM_COMPAT_HACK(CDVCommandStatus_ERROR); +#undef SWIFT_ENUM_COMPAT_HACK + +@interface CDVPluginResult : NSObject {} + +@property (nonatomic, strong, readonly) NSNumber* status; +@property (nonatomic, strong, readonly) id message; +@property (nonatomic, strong) NSNumber* keepCallback; +// This property can be used to scope the lifetime of another object. For example, +// Use it to store the associated NSData when `message` is created using initWithBytesNoCopy. +@property (nonatomic, strong) id associatedObject; + +- (CDVPluginResult*)init; ++ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal; ++ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsString:(NSString*)theMessage; ++ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsArray:(NSArray*)theMessage; ++ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsInt:(int)theMessage; ++ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsNSInteger:(NSInteger)theMessage; ++ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsNSUInteger:(NSUInteger)theMessage; ++ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsDouble:(double)theMessage; ++ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsBool:(BOOL)theMessage; ++ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsDictionary:(NSDictionary*)theMessage; ++ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsArrayBuffer:(NSData*)theMessage; ++ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsMultipart:(NSArray*)theMessages; ++ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageToErrorObject:(int)errorCode; + ++ (void)setVerbose:(BOOL)verbose; ++ (BOOL)isVerbose; + +- (void)setKeepCallbackAsBool:(BOOL)bKeepCallback; + +- (NSString*)argumentsAsJSON; + +@end diff --git a/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVPluginResult.m b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVPluginResult.m new file mode 100644 index 0000000..930aeab --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVPluginResult.m @@ -0,0 +1,203 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. + */ + +#import "CDVPluginResult.h" +#import "CDVJSON_private.h" +#import "CDVDebug.h" + +// This exists to preserve compatibility with early Swift plugins, who are +// using CDVCommandStatus as ObjC-style constants rather than as Swift enum +// values. +// These constants alias the enum values back to their previous names. +#define SWIFT_ENUM_COMPAT_HACK(enumVal) const CDVCommandStatus SWIFT_##enumVal NS_SWIFT_NAME(enumVal) = enumVal +SWIFT_ENUM_COMPAT_HACK(CDVCommandStatus_NO_RESULT); +SWIFT_ENUM_COMPAT_HACK(CDVCommandStatus_OK); +SWIFT_ENUM_COMPAT_HACK(CDVCommandStatus_CLASS_NOT_FOUND_EXCEPTION); +SWIFT_ENUM_COMPAT_HACK(CDVCommandStatus_ILLEGAL_ACCESS_EXCEPTION); +SWIFT_ENUM_COMPAT_HACK(CDVCommandStatus_INSTANTIATION_EXCEPTION); +SWIFT_ENUM_COMPAT_HACK(CDVCommandStatus_MALFORMED_URL_EXCEPTION); +SWIFT_ENUM_COMPAT_HACK(CDVCommandStatus_IO_EXCEPTION); +SWIFT_ENUM_COMPAT_HACK(CDVCommandStatus_INVALID_ACTION); +SWIFT_ENUM_COMPAT_HACK(CDVCommandStatus_JSON_EXCEPTION); +SWIFT_ENUM_COMPAT_HACK(CDVCommandStatus_ERROR); +#undef SWIFT_ENUM_COMPAT_HACK + +@interface CDVPluginResult () + +- (CDVPluginResult*)initWithStatus:(CDVCommandStatus)statusOrdinal message:(id)theMessage; + +@end + +@implementation CDVPluginResult +@synthesize status, message, keepCallback, associatedObject; + +static NSArray* org_apache_cordova_CommandStatusMsgs; + +id messageFromArrayBuffer(NSData* data) +{ + return @{ + @"CDVType" : @"ArrayBuffer", + @"data" :[data base64EncodedStringWithOptions:0] + }; +} + +id massageMessage(id message) +{ + if ([message isKindOfClass:[NSData class]]) { + return messageFromArrayBuffer(message); + } + return message; +} + +id messageFromMultipart(NSArray* theMessages) +{ + NSMutableArray* messages = [NSMutableArray arrayWithArray:theMessages]; + + for (NSUInteger i = 0; i < messages.count; ++i) { + [messages replaceObjectAtIndex:i withObject:massageMessage([messages objectAtIndex:i])]; + } + + return @{ + @"CDVType" : @"MultiPart", + @"messages" : messages + }; +} + ++ (void)initialize +{ + org_apache_cordova_CommandStatusMsgs = [[NSArray alloc] initWithObjects:@"No result", + @"OK", + @"Class not found", + @"Illegal access", + @"Instantiation error", + @"Malformed url", + @"IO error", + @"Invalid action", + @"JSON error", + @"Error", + nil]; +} + +- (CDVPluginResult*)init +{ + return [self initWithStatus:CDVCommandStatus_NO_RESULT message:nil]; +} + +- (CDVPluginResult*)initWithStatus:(CDVCommandStatus)statusOrdinal message:(id)theMessage +{ + self = [super init]; + if (self) { + status = @(statusOrdinal); + message = theMessage; + keepCallback = [NSNumber numberWithBool:NO]; + } + return self; +} + ++ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal +{ + return [[self alloc] initWithStatus:statusOrdinal message:nil]; +} + ++ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsString:(NSString*)theMessage +{ + return [[self alloc] initWithStatus:statusOrdinal message:theMessage]; +} + ++ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsArray:(NSArray*)theMessage +{ + return [[self alloc] initWithStatus:statusOrdinal message:theMessage]; +} + ++ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsInt:(int)theMessage +{ + return [[self alloc] initWithStatus:statusOrdinal message:[NSNumber numberWithInt:theMessage]]; +} + ++ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsNSInteger:(NSInteger)theMessage +{ + return [[self alloc] initWithStatus:statusOrdinal message:[NSNumber numberWithInteger:theMessage]]; +} + ++ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsNSUInteger:(NSUInteger)theMessage +{ + return [[self alloc] initWithStatus:statusOrdinal message:[NSNumber numberWithUnsignedInteger:theMessage]]; +} + ++ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsDouble:(double)theMessage +{ + return [[self alloc] initWithStatus:statusOrdinal message:[NSNumber numberWithDouble:theMessage]]; +} + ++ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsBool:(BOOL)theMessage +{ + return [[self alloc] initWithStatus:statusOrdinal message:[NSNumber numberWithBool:theMessage]]; +} + ++ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsDictionary:(NSDictionary*)theMessage +{ + return [[self alloc] initWithStatus:statusOrdinal message:theMessage]; +} + ++ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsArrayBuffer:(NSData*)theMessage +{ + return [[self alloc] initWithStatus:statusOrdinal message:messageFromArrayBuffer(theMessage)]; +} + ++ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageAsMultipart:(NSArray*)theMessages +{ + return [[self alloc] initWithStatus:statusOrdinal message:messageFromMultipart(theMessages)]; +} + ++ (CDVPluginResult*)resultWithStatus:(CDVCommandStatus)statusOrdinal messageToErrorObject:(int)errorCode +{ + NSDictionary* errDict = @{@"code" :[NSNumber numberWithInt:errorCode]}; + + return [[self alloc] initWithStatus:statusOrdinal message:errDict]; +} + +- (void)setKeepCallbackAsBool:(BOOL)bKeepCallback +{ + [self setKeepCallback:[NSNumber numberWithBool:bKeepCallback]]; +} + +- (NSString*)argumentsAsJSON +{ + id arguments = (self.message == nil ? [NSNull null] : self.message); + NSArray* argumentsWrappedInArray = [NSArray arrayWithObject:arguments]; + + NSString* argumentsJSON = [argumentsWrappedInArray cdv_JSONString]; + + argumentsJSON = [argumentsJSON substringWithRange:NSMakeRange(1, [argumentsJSON length] - 2)]; + + return argumentsJSON; +} + +static BOOL gIsVerbose = NO; ++ (void)setVerbose:(BOOL)verbose +{ + gIsVerbose = verbose; +} + ++ (BOOL)isVerbose +{ + return gIsVerbose; +} + +@end diff --git a/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVScreenOrientationDelegate.h b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVScreenOrientationDelegate.h new file mode 100644 index 0000000..49c3c27 --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVScreenOrientationDelegate.h @@ -0,0 +1,28 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. + */ + +#import + +@protocol CDVScreenOrientationDelegate + +- (UIInterfaceOrientationMask)supportedInterfaceOrientations; + +- (BOOL)shouldAutorotate; + +@end diff --git a/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVTimer.h b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVTimer.h new file mode 100644 index 0000000..6d31593 --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVTimer.h @@ -0,0 +1,27 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. + */ + +#import + +@interface CDVTimer : NSObject + ++ (void)start:(NSString*)name; ++ (void)stop:(NSString*)name; + +@end diff --git a/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVTimer.m b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVTimer.m new file mode 100644 index 0000000..784e94d --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVTimer.m @@ -0,0 +1,123 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. + */ + +#import "CDVTimer.h" + +#pragma mark CDVTimerItem + +@interface CDVTimerItem : NSObject + +@property (nonatomic, strong) NSString* name; +@property (nonatomic, strong) NSDate* started; +@property (nonatomic, strong) NSDate* ended; + +- (void)log; + +@end + +@implementation CDVTimerItem + +- (void)log +{ + NSLog(@"[CDVTimer][%@] %fms", self.name, [self.ended timeIntervalSinceDate:self.started] * 1000.0); +} + +@end + +#pragma mark CDVTimer + +@interface CDVTimer () + +@property (nonatomic, strong) NSMutableDictionary* items; + +@end + +@implementation CDVTimer + +#pragma mark object methods + +- (id)init +{ + if (self = [super init]) { + self.items = [NSMutableDictionary dictionaryWithCapacity:6]; + } + + return self; +} + +- (void)add:(NSString*)name +{ + if ([self.items objectForKey:[name lowercaseString]] == nil) { + CDVTimerItem* item = [CDVTimerItem new]; + item.name = name; + item.started = [NSDate new]; + [self.items setObject:item forKey:[name lowercaseString]]; + } else { + NSLog(@"Timer called '%@' already exists.", name); + } +} + +- (void)remove:(NSString*)name +{ + CDVTimerItem* item = [self.items objectForKey:[name lowercaseString]]; + + if (item != nil) { + item.ended = [NSDate new]; + [item log]; + [self.items removeObjectForKey:[name lowercaseString]]; + } else { + NSLog(@"Timer called '%@' does not exist.", name); + } +} + +- (void)removeAll +{ + [self.items removeAllObjects]; +} + +#pragma mark class methods + ++ (void)start:(NSString*)name +{ + [[CDVTimer sharedInstance] add:name]; +} + ++ (void)stop:(NSString*)name +{ + [[CDVTimer sharedInstance] remove:name]; +} + ++ (void)clearAll +{ + [[CDVTimer sharedInstance] removeAll]; +} + ++ (CDVTimer*)sharedInstance +{ + static dispatch_once_t pred = 0; + __strong static CDVTimer* _sharedObject = nil; + + dispatch_once(&pred, ^{ + _sharedObject = [[self alloc] init]; + }); + + return _sharedObject; +} + +@end diff --git a/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVURLSchemeHandler.h b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVURLSchemeHandler.h new file mode 100644 index 0000000..c074fa6 --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVURLSchemeHandler.h @@ -0,0 +1,34 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. + */ + +#import +#import +#import "CDVViewController.h" + + +@interface CDVURLSchemeHandler : NSObject + +@property (nonatomic, strong) CDVViewController* viewController; + +@property (nonatomic) CDVPlugin* schemePlugin; + +- (instancetype)initWithVC:(CDVViewController *)controller; + + +@end diff --git a/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVURLSchemeHandler.m b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVURLSchemeHandler.m new file mode 100644 index 0000000..333124c --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVURLSchemeHandler.m @@ -0,0 +1,137 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. + */ + + +#import "CDVURLSchemeHandler.h" +#import + +#import + +@implementation CDVURLSchemeHandler + + +- (instancetype)initWithVC:(CDVViewController *)controller +{ + self = [super init]; + if (self) { + _viewController = controller; + } + return self; +} + +- (void)webView:(WKWebView *)webView startURLSchemeTask:(id )urlSchemeTask +{ + NSString * startPath = [[NSBundle mainBundle] pathForResource:self.viewController.wwwFolderName ofType: nil]; + NSURL * url = urlSchemeTask.request.URL; + NSString * stringToLoad = url.path; + NSString * scheme = url.scheme; + + CDVViewController* vc = (CDVViewController*)self.viewController; + + /* + * Give plugins the chance to handle the url + */ + BOOL anyPluginsResponded = NO; + BOOL handledRequest = NO; + + NSDictionary *pluginObjects = [[vc pluginObjects] copy]; + for (NSString* pluginName in pluginObjects) { + self.schemePlugin = [vc.pluginObjects objectForKey:pluginName]; + SEL selector = NSSelectorFromString(@"overrideSchemeTask:"); + if ([self.schemePlugin respondsToSelector:selector]) { + handledRequest = (((BOOL (*)(id, SEL, id ))objc_msgSend)(self.schemePlugin, selector, urlSchemeTask)); + if (handledRequest) { + anyPluginsResponded = YES; + break; + } + } + } + + if (!anyPluginsResponded) { + if ([scheme isEqualToString:self.viewController.appScheme]) { + if ([stringToLoad hasPrefix:@"/_app_file_"]) { + startPath = [stringToLoad stringByReplacingOccurrencesOfString:@"/_app_file_" withString:@""]; + } else { + if ([stringToLoad isEqualToString:@""] || [url.pathExtension isEqualToString:@""]) { + startPath = [startPath stringByAppendingPathComponent:self.viewController.startPage]; + } else { + startPath = [startPath stringByAppendingPathComponent:stringToLoad]; + } + } + } + + NSError * fileError = nil; + NSData * data = nil; + if ([self isMediaExtension:url.pathExtension]) { + data = [NSData dataWithContentsOfFile:startPath options:NSDataReadingMappedIfSafe error:&fileError]; + } + if (!data || fileError) { + data = [[NSData alloc] initWithContentsOfFile:startPath]; + } + NSInteger statusCode = 200; + if (!data) { + statusCode = 404; + } + NSURL * localUrl = [NSURL URLWithString:url.absoluteString]; + NSString * mimeType = [self getMimeType:url.pathExtension]; + id response = nil; + if (data && [self isMediaExtension:url.pathExtension]) { + response = [[NSURLResponse alloc] initWithURL:localUrl MIMEType:mimeType expectedContentLength:data.length textEncodingName:nil]; + } else { + NSDictionary * headers = @{ @"Content-Type" : mimeType, @"Cache-Control": @"no-cache"}; + response = [[NSHTTPURLResponse alloc] initWithURL:localUrl statusCode:statusCode HTTPVersion:nil headerFields:headers]; + } + + [urlSchemeTask didReceiveResponse:response]; + if (data) { + [urlSchemeTask didReceiveData:data]; + } + [urlSchemeTask didFinish]; + } +} + +- (void)webView:(nonnull WKWebView *)webView stopURLSchemeTask:(nonnull id)urlSchemeTask +{ + SEL selector = NSSelectorFromString(@"stopSchemeTask:"); + if (self.schemePlugin != nil && [self.schemePlugin respondsToSelector:selector]) { + (((void (*)(id, SEL, id ))objc_msgSend)(self.schemePlugin, selector, urlSchemeTask)); + } +} + +-(NSString *) getMimeType:(NSString *)fileExtension { + if (fileExtension && ![fileExtension isEqualToString:@""]) { + NSString *UTI = (__bridge_transfer NSString *)UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, (__bridge CFStringRef)fileExtension, NULL); + NSString *contentType = (__bridge_transfer NSString *)UTTypeCopyPreferredTagWithClass((__bridge CFStringRef)UTI, kUTTagClassMIMEType); + return contentType ? contentType : @"application/octet-stream"; + } else { + return @"text/html"; + } +} + +-(BOOL) isMediaExtension:(NSString *) pathExtension { + NSArray * mediaExtensions = @[@"m4v", @"mov", @"mp4", + @"aac", @"ac3", @"aiff", @"au", @"flac", @"m4a", @"mp3", @"wav"]; + if ([mediaExtensions containsObject:pathExtension.lowercaseString]) { + return YES; + } + return NO; +} + + +@end diff --git a/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVViewController.h b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVViewController.h new file mode 100644 index 0000000..81c7128 --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVViewController.h @@ -0,0 +1,78 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. + */ + +#import +#import +#import "CDVAvailability.h" +#import "CDVInvokedUrlCommand.h" +#import "CDVCommandDelegate.h" +#import "CDVCommandQueue.h" +#import "CDVScreenOrientationDelegate.h" +#import "CDVPlugin.h" +#import "CDVWebViewEngineProtocol.h" + +@interface CDVViewController : UIViewController { + @protected + id _webViewEngine; + @protected + id _commandDelegate; + @protected + CDVCommandQueue* _commandQueue; +} + +@property (nonatomic, readonly, weak) IBOutlet UIView* webView; +@property (nonatomic, readonly, strong) UIView* launchView; + +@property (nonatomic, readonly, strong) NSMutableDictionary* pluginObjects; +@property (nonatomic, readonly, strong) NSDictionary* pluginsMap; +@property (nonatomic, readonly, strong) NSMutableDictionary* settings; +@property (nonatomic, readonly, strong) NSXMLParser* configParser; + +@property (nonatomic, readwrite, copy) NSString* appScheme; +@property (nonatomic, readwrite, copy) NSString* configFile; +@property (nonatomic, readwrite, copy) NSString* wwwFolderName; +@property (nonatomic, readwrite, copy) NSString* startPage; +@property (nonatomic, readonly, strong) CDVCommandQueue* commandQueue; +@property (nonatomic, readonly, strong) id webViewEngine; +@property (nonatomic, readonly, strong) id commandDelegate; + +/** + Takes/Gives an array of UIInterfaceOrientation (int) objects + ex. UIInterfaceOrientationPortrait +*/ +@property (nonatomic, readwrite, strong) NSArray* supportedOrientations; + +- (UIView*)newCordovaViewWithFrame:(CGRect)bounds; + +- (NSString*)appURLScheme; +- (NSURL*)errorURL; + +- (UIColor*)colorFromColorString:(NSString*)colorString CDV_DEPRECATED(7.0.0, "Use BackgroundColor in xcassets"); +- (NSArray*)parseInterfaceOrientations:(NSArray*)orientations; +- (BOOL)supportsOrientation:(UIInterfaceOrientation)orientation; + +- (id)getCommandInstance:(NSString*)pluginName; +- (void)registerPlugin:(CDVPlugin*)plugin withClassName:(NSString*)className; +- (void)registerPlugin:(CDVPlugin*)plugin withPluginName:(NSString*)pluginName; + +- (void)parseSettingsWithParser:(NSObject *)delegate; + +- (void)showLaunchScreen:(BOOL)visible; + +@end diff --git a/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVViewController.m b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVViewController.m new file mode 100644 index 0000000..dcec958 --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVViewController.m @@ -0,0 +1,819 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. + */ + +#import +#import "CDV.h" +#import "CDVPlugin+Private.h" +#import "CDVWebViewUIDelegate.h" +#import "CDVConfigParser.h" +#import +#import "NSDictionary+CordovaPreferences.h" +#import "CDVCommandDelegateImpl.h" +#import + +@interface CDVViewController () { } + +@property (nonatomic, readwrite, strong) NSXMLParser* configParser; +@property (nonatomic, readwrite, strong) NSMutableDictionary* settings; +@property (nonatomic, readwrite, strong) NSMutableDictionary* pluginObjects; +@property (nonatomic, readwrite, strong) NSMutableArray* startupPluginNames; +@property (nonatomic, readwrite, strong) NSDictionary* pluginsMap; +@property (nonatomic, readwrite, strong) id webViewEngine; +@property (nonatomic, readwrite, strong) UIView* launchView; + +@property (readwrite, assign) BOOL initialized; + +@property (atomic, strong) NSURL* openURL; + +@end + +@implementation CDVViewController + +@synthesize supportedOrientations; +@synthesize pluginObjects, pluginsMap, startupPluginNames; +@synthesize configParser, settings; +@synthesize wwwFolderName, startPage, initialized, openURL; +@synthesize commandDelegate = _commandDelegate; +@synthesize commandQueue = _commandQueue; +@synthesize webViewEngine = _webViewEngine; +@dynamic webView; + +- (void)__init +{ + if ((self != nil) && !self.initialized) { + _commandQueue = [[CDVCommandQueue alloc] initWithViewController:self]; + _commandDelegate = [[CDVCommandDelegateImpl alloc] initWithViewController:self]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onAppWillTerminate:) + name:UIApplicationWillTerminateNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onAppWillResignActive:) + name:UIApplicationWillResignActiveNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onAppDidBecomeActive:) + name:UIApplicationDidBecomeActiveNotification object:nil]; + + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onAppWillEnterForeground:) + name:UIApplicationWillEnterForegroundNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onAppDidEnterBackground:) + name:UIApplicationDidEnterBackgroundNotification object:nil]; + + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onWebViewPageDidLoad:) + name:CDVPageDidLoadNotification object:nil]; + + // read from UISupportedInterfaceOrientations (or UISupportedInterfaceOrientations~iPad, if its iPad) from -Info.plist + self.supportedOrientations = [self parseInterfaceOrientations: + [[[NSBundle mainBundle] infoDictionary] objectForKey:@"UISupportedInterfaceOrientations"]]; + + [self printVersion]; + [self printMultitaskingInfo]; + [self printPlatformVersionWarning]; + self.initialized = YES; + } +} + +- (id)initWithNibName:(NSString*)nibNameOrNil bundle:(NSBundle*)nibBundleOrNil +{ + self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; + [self __init]; + return self; +} + +- (id)initWithCoder:(NSCoder*)aDecoder +{ + self = [super initWithCoder:aDecoder]; + [self __init]; + return self; +} + +- (id)init +{ + self = [super init]; + [self __init]; + return self; +} + +- (void)printVersion +{ + NSLog(@"Apache Cordova native platform version %@ is starting.", CDV_VERSION); +} + +- (void)printPlatformVersionWarning +{ + if (!IsAtLeastiOSVersion(@"8.0")) { + NSLog(@"CRITICAL: For Cordova 4.0.0 and above, you will need to upgrade to at least iOS 8.0 or greater. Your current version of iOS is %@.", + [[UIDevice currentDevice] systemVersion] + ); + } +} + +- (void)printMultitaskingInfo +{ + UIDevice* device = [UIDevice currentDevice]; + BOOL backgroundSupported = NO; + + if ([device respondsToSelector:@selector(isMultitaskingSupported)]) { + backgroundSupported = device.multitaskingSupported; + } + + NSNumber* exitsOnSuspend = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"UIApplicationExitsOnSuspend"]; + if (exitsOnSuspend == nil) { // if it's missing, it should be NO (i.e. multi-tasking on by default) + exitsOnSuspend = [NSNumber numberWithBool:NO]; + } + + NSLog(@"Multi-tasking -> Device: %@, App: %@", (backgroundSupported ? @"YES" : @"NO"), (![exitsOnSuspend intValue]) ? @"YES" : @"NO"); +} + +-(NSString*)configFilePath{ + NSString* path = self.configFile ?: @"config.xml"; + + // if path is relative, resolve it against the main bundle + if(![path isAbsolutePath]){ + NSString* absolutePath = [[NSBundle mainBundle] pathForResource:path ofType:nil]; + if(!absolutePath){ + NSAssert(NO, @"ERROR: %@ not found in the main bundle!", path); + } + path = absolutePath; + } + + // Assert file exists + if (![[NSFileManager defaultManager] fileExistsAtPath:path]) { + NSAssert(NO, @"ERROR: %@ does not exist. Please run cordova-ios/bin/cordova_plist_to_config_xml path/to/project.", path); + return nil; + } + + return path; +} + +- (void)parseSettingsWithParser:(NSObject *)delegate +{ + // read from config.xml in the app bundle + NSString* path = [self configFilePath]; + + NSURL* url = [NSURL fileURLWithPath:path]; + + self.configParser = [[NSXMLParser alloc] initWithContentsOfURL:url]; + if (self.configParser == nil) { + NSLog(@"Failed to initialize XML parser."); + return; + } + [self.configParser setDelegate:((id < NSXMLParserDelegate >)delegate)]; + [self.configParser parse]; +} + +- (void)loadSettings +{ + CDVConfigParser* delegate = [[CDVConfigParser alloc] init]; + + [self parseSettingsWithParser:delegate]; + + // Get the plugin dictionary, whitelist and settings from the delegate. + self.pluginsMap = delegate.pluginsDict; + self.startupPluginNames = delegate.startupPluginNames; + self.settings = delegate.settings; + + // And the start folder/page. + if(self.wwwFolderName == nil){ + self.wwwFolderName = @"www"; + } + if(delegate.startPage && self.startPage == nil){ + self.startPage = delegate.startPage; + } + if (self.startPage == nil) { + self.startPage = @"index.html"; + } + + // Initialize the plugin objects dict. + self.pluginObjects = [[NSMutableDictionary alloc] initWithCapacity:20]; +} + +- (NSURL*)appUrl +{ + NSURL* appURL = nil; + + if ([self.startPage rangeOfString:@"://"].location != NSNotFound) { + appURL = [NSURL URLWithString:self.startPage]; + } else if ([self.wwwFolderName rangeOfString:@"://"].location != NSNotFound) { + appURL = [NSURL URLWithString:[NSString stringWithFormat:@"%@/%@", self.wwwFolderName, self.startPage]]; + } else if([self.wwwFolderName rangeOfString:@".bundle"].location != NSNotFound){ + // www folder is actually a bundle + NSBundle* bundle = [NSBundle bundleWithPath:self.wwwFolderName]; + appURL = [bundle URLForResource:self.startPage withExtension:nil]; + } else if([self.wwwFolderName rangeOfString:@".framework"].location != NSNotFound){ + // www folder is actually a framework + NSBundle* bundle = [NSBundle bundleWithPath:self.wwwFolderName]; + appURL = [bundle URLForResource:self.startPage withExtension:nil]; + } else { + // CB-3005 strip parameters from start page to check if page exists in resources + NSURL* startURL = [NSURL URLWithString:self.startPage]; + NSString* startFilePath = [self.commandDelegate pathForResource:[startURL path]]; + + if (startFilePath == nil) { + appURL = nil; + } else { + appURL = [NSURL fileURLWithPath:startFilePath]; + // CB-3005 Add on the query params or fragment. + NSString* startPageNoParentDirs = self.startPage; + NSRange r = [startPageNoParentDirs rangeOfCharacterFromSet:[NSCharacterSet characterSetWithCharactersInString:@"?#"] options:0]; + if (r.location != NSNotFound) { + NSString* queryAndOrFragment = [self.startPage substringFromIndex:r.location]; + appURL = [NSURL URLWithString:queryAndOrFragment relativeToURL:appURL]; + } + } + } + + return appURL; +} + +- (NSURL*)errorURL +{ + NSURL* errorUrl = nil; + + id setting = [self.settings cordovaSettingForKey:@"ErrorUrl"]; + + if (setting) { + NSString* errorUrlString = (NSString*)setting; + if ([errorUrlString rangeOfString:@"://"].location != NSNotFound) { + errorUrl = [NSURL URLWithString:errorUrlString]; + } else { + NSURL* url = [NSURL URLWithString:(NSString*)setting]; + NSString* errorFilePath = [self.commandDelegate pathForResource:[url path]]; + if (errorFilePath) { + errorUrl = [NSURL fileURLWithPath:errorFilePath]; + } + } + } + + return errorUrl; +} + +- (UIView*)webView +{ + if (self.webViewEngine != nil) { + return self.webViewEngine.engineWebView; + } + + return nil; +} + +// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. +- (void)viewDidLoad +{ + [super viewDidLoad]; + + // Load settings + [self loadSettings]; + + NSString* backupWebStorageType = @"cloud"; // default value + + id backupWebStorage = [self.settings cordovaSettingForKey:@"BackupWebStorage"]; + if ([backupWebStorage isKindOfClass:[NSString class]]) { + backupWebStorageType = backupWebStorage; + } + [self.settings setCordovaSetting:backupWebStorageType forKey:@"BackupWebStorage"]; + + // // Instantiate the Launch screen ///////// + + if (!self.launchView) { + [self createLaunchView]; + } + + // // Instantiate the WebView /////////////// + + if (!self.webView) { + [self createGapView]; + } + + // ///////////////// + + if ([self.startupPluginNames count] > 0) { + [CDVTimer start:@"TotalPluginStartup"]; + + for (NSString* pluginName in self.startupPluginNames) { + [CDVTimer start:pluginName]; + [self getCommandInstance:pluginName]; + [CDVTimer stop:pluginName]; + } + + [CDVTimer stop:@"TotalPluginStartup"]; + } + + // ///////////////// + NSURL* appURL = [self appUrl]; + + if (appURL) { + NSURLRequest* appReq = [NSURLRequest requestWithURL:appURL cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:20.0]; + [self.webViewEngine loadRequest:appReq]; + } else { + NSString* loadErr = [NSString stringWithFormat:@"ERROR: Start Page at '%@/%@' was not found.", self.wwwFolderName, self.startPage]; + NSLog(@"%@", loadErr); + + NSURL* errorUrl = [self errorURL]; + if (errorUrl) { + errorUrl = [NSURL URLWithString:[NSString stringWithFormat:@"?error=%@", [loadErr stringByAddingPercentEncodingWithAllowedCharacters:NSCharacterSet.URLPathAllowedCharacterSet]] relativeToURL:errorUrl]; + NSLog(@"%@", [errorUrl absoluteString]); + [self.webViewEngine loadRequest:[NSURLRequest requestWithURL:errorUrl]]; + } else { + NSString* html = [NSString stringWithFormat:@" %@ ", loadErr]; + [self.webViewEngine loadHTMLString:html baseURL:nil]; + } + } + // ///////////////// + + UIColor* bgColor = [UIColor colorNamed:@"BackgroundColor"] ?: UIColor.whiteColor; + [self.launchView setBackgroundColor:bgColor]; + [self.webView setBackgroundColor:bgColor]; +} + +-(void)viewWillAppear:(BOOL)animated +{ + [super viewWillAppear:animated]; + [[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:CDVViewWillAppearNotification object:nil]]; +} + +-(void)viewDidAppear:(BOOL)animated +{ + [super viewDidAppear:animated]; + [[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:CDVViewDidAppearNotification object:nil]]; +} + +-(void)viewWillDisappear:(BOOL)animated +{ + [super viewWillDisappear:animated]; + [[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:CDVViewWillDisappearNotification object:nil]]; +} + +-(void)viewDidDisappear:(BOOL)animated +{ + [super viewDidDisappear:animated]; + [[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:CDVViewDidDisappearNotification object:nil]]; +} + +-(void)viewWillLayoutSubviews +{ + [super viewWillLayoutSubviews]; + [[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:CDVViewWillLayoutSubviewsNotification object:nil]]; +} + +-(void)viewDidLayoutSubviews +{ + [super viewDidLayoutSubviews]; + [[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:CDVViewDidLayoutSubviewsNotification object:nil]]; +} + +-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id)coordinator +{ + [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator]; + [[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:CDVViewWillTransitionToSizeNotification object:[NSValue valueWithCGSize:size]]]; +} + +- (UIColor*)colorFromColorString:(NSString*)colorString +{ + // No value, nothing to do + if (!colorString) { + return nil; + } + + // Validate format + NSError* error = NULL; + NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern:@"^(#[0-9A-F]{3}|(0x|#)([0-9A-F]{2})?[0-9A-F]{6})$" options:NSRegularExpressionCaseInsensitive error:&error]; + NSUInteger countMatches = [regex numberOfMatchesInString:colorString options:0 range:NSMakeRange(0, [colorString length])]; + + if (!countMatches) { + return nil; + } + + // #FAB to #FFAABB + if ([colorString hasPrefix:@"#"] && [colorString length] == 4) { + NSString* r = [colorString substringWithRange:NSMakeRange(1, 1)]; + NSString* g = [colorString substringWithRange:NSMakeRange(2, 1)]; + NSString* b = [colorString substringWithRange:NSMakeRange(3, 1)]; + colorString = [NSString stringWithFormat:@"#%@%@%@%@%@%@", r, r, g, g, b, b]; + } + + // #RRGGBB to 0xRRGGBB + colorString = [colorString stringByReplacingOccurrencesOfString:@"#" withString:@"0x"]; + + // 0xRRGGBB to 0xAARRGGBB + if ([colorString hasPrefix:@"0x"] && [colorString length] == 8) { + colorString = [@"0xFF" stringByAppendingString:[colorString substringFromIndex:2]]; + } + + // 0xAARRGGBB to int + unsigned colorValue = 0; + NSScanner *scanner = [NSScanner scannerWithString:colorString]; + if (![scanner scanHexInt:&colorValue]) { + return nil; + } + + // int to UIColor + return [UIColor colorWithRed:((float)((colorValue & 0x00FF0000) >> 16))/255.0 + green:((float)((colorValue & 0x0000FF00) >> 8))/255.0 + blue:((float)((colorValue & 0x000000FF) >> 0))/255.0 + alpha:((float)((colorValue & 0xFF000000) >> 24))/255.0]; +} + +- (NSArray*)parseInterfaceOrientations:(NSArray*)orientations +{ + NSMutableArray* result = [[NSMutableArray alloc] init]; + + if (orientations != nil) { + NSEnumerator* enumerator = [orientations objectEnumerator]; + NSString* orientationString; + + while (orientationString = [enumerator nextObject]) { + if ([orientationString isEqualToString:@"UIInterfaceOrientationPortrait"]) { + [result addObject:[NSNumber numberWithInt:UIInterfaceOrientationPortrait]]; + } else if ([orientationString isEqualToString:@"UIInterfaceOrientationPortraitUpsideDown"]) { + [result addObject:[NSNumber numberWithInt:UIInterfaceOrientationPortraitUpsideDown]]; + } else if ([orientationString isEqualToString:@"UIInterfaceOrientationLandscapeLeft"]) { + [result addObject:[NSNumber numberWithInt:UIInterfaceOrientationLandscapeLeft]]; + } else if ([orientationString isEqualToString:@"UIInterfaceOrientationLandscapeRight"]) { + [result addObject:[NSNumber numberWithInt:UIInterfaceOrientationLandscapeRight]]; + } + } + } + + // default + if ([result count] == 0) { + [result addObject:[NSNumber numberWithInt:UIInterfaceOrientationPortrait]]; + } + + return result; +} + +- (BOOL)shouldAutorotate +{ + return YES; +} + +- (UIInterfaceOrientationMask)supportedInterfaceOrientations +{ + NSUInteger ret = 0; + + if ([self supportsOrientation:UIInterfaceOrientationPortrait]) { + ret = ret | (1 << UIInterfaceOrientationPortrait); + } + if ([self supportsOrientation:UIInterfaceOrientationPortraitUpsideDown]) { + ret = ret | (1 << UIInterfaceOrientationPortraitUpsideDown); + } + if ([self supportsOrientation:UIInterfaceOrientationLandscapeRight]) { + ret = ret | (1 << UIInterfaceOrientationLandscapeRight); + } + if ([self supportsOrientation:UIInterfaceOrientationLandscapeLeft]) { + ret = ret | (1 << UIInterfaceOrientationLandscapeLeft); + } + + return ret; +} + +- (BOOL)supportsOrientation:(UIInterfaceOrientation)orientation +{ + return [self.supportedOrientations containsObject:@(orientation)]; +} + +- (UIView*)newCordovaViewWithFrame:(CGRect)bounds +{ + NSString* defaultWebViewEngineClass = [self.settings cordovaSettingForKey:@"CordovaDefaultWebViewEngine"]; + NSString* webViewEngineClass = [self.settings cordovaSettingForKey:@"CordovaWebViewEngine"]; + + if (!defaultWebViewEngineClass) { + defaultWebViewEngineClass = @"CDVWebViewEngine"; + } + if (!webViewEngineClass) { + webViewEngineClass = defaultWebViewEngineClass; + } + + // Find webViewEngine + if (NSClassFromString(webViewEngineClass)) { + self.webViewEngine = [[NSClassFromString(webViewEngineClass) alloc] initWithFrame:bounds]; + // if a webView engine returns nil (not supported by the current iOS version) or doesn't conform to the protocol, or can't load the request, we use WKWebView + if (!self.webViewEngine || ![self.webViewEngine conformsToProtocol:@protocol(CDVWebViewEngineProtocol)] || ![self.webViewEngine canLoadRequest:[NSURLRequest requestWithURL:self.appUrl]]) { + self.webViewEngine = [[NSClassFromString(defaultWebViewEngineClass) alloc] initWithFrame:bounds]; + } + } else { + self.webViewEngine = [[NSClassFromString(defaultWebViewEngineClass) alloc] initWithFrame:bounds]; + } + + if ([self.webViewEngine isKindOfClass:[CDVPlugin class]]) { + [self registerPlugin:(CDVPlugin*)self.webViewEngine withClassName:webViewEngineClass]; + } + + return self.webViewEngine.engineWebView; +} + +- (void)createLaunchView +{ + CGRect webViewBounds = self.view.bounds; + webViewBounds.origin = self.view.bounds.origin; + + UIView* view = [[UIView alloc] initWithFrame:webViewBounds]; + [view setAlpha:0]; + + NSString* launchStoryboardName = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"UILaunchStoryboardName"]; + if (launchStoryboardName != nil) { + UIStoryboard* storyboard = [UIStoryboard storyboardWithName:launchStoryboardName bundle:[NSBundle mainBundle]]; + UIViewController* vc = [storyboard instantiateInitialViewController]; + + [view addSubview:vc.view]; + } + + self.launchView = view; + [self.view addSubview:view]; +} + +- (void)createGapView +{ + CGRect webViewBounds = self.view.bounds; + webViewBounds.origin = self.view.bounds.origin; + + UIView* view = [self newCordovaViewWithFrame:webViewBounds]; + view.hidden = YES; + view.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight); + + [self.view addSubview:view]; + [self.view sendSubviewToBack:view]; +} + +- (void)didReceiveMemoryWarning +{ + // iterate through all the plugin objects, and call hasPendingOperation + // if at least one has a pending operation, we don't call [super didReceiveMemoryWarning] + + NSEnumerator* enumerator = [self.pluginObjects objectEnumerator]; + CDVPlugin* plugin; + + BOOL doPurge = YES; + + while ((plugin = [enumerator nextObject])) { + if (plugin.hasPendingOperation) { + NSLog(@"Plugin '%@' has a pending operation, memory purge is delayed for didReceiveMemoryWarning.", NSStringFromClass([plugin class])); + doPurge = NO; + } + } + + if (doPurge) { + // Releases the view if it doesn't have a superview. + [super didReceiveMemoryWarning]; + } + + // Release any cached data, images, etc. that aren't in use. +} + +#pragma mark CordovaCommands + +- (void)registerPlugin:(CDVPlugin*)plugin withClassName:(NSString*)className +{ + if ([plugin respondsToSelector:@selector(setViewController:)]) { + [plugin setViewController:self]; + } + + if ([plugin respondsToSelector:@selector(setCommandDelegate:)]) { + [plugin setCommandDelegate:_commandDelegate]; + } + + [self.pluginObjects setObject:plugin forKey:className]; + [plugin pluginInitialize]; +} + +- (void)registerPlugin:(CDVPlugin*)plugin withPluginName:(NSString*)pluginName +{ + if ([plugin respondsToSelector:@selector(setViewController:)]) { + [plugin setViewController:self]; + } + + if ([plugin respondsToSelector:@selector(setCommandDelegate:)]) { + [plugin setCommandDelegate:_commandDelegate]; + } + + NSString* className = NSStringFromClass([plugin class]); + [self.pluginObjects setObject:plugin forKey:className]; + [self.pluginsMap setValue:className forKey:[pluginName lowercaseString]]; + [plugin pluginInitialize]; +} + +/** + Returns an instance of a CordovaCommand object, based on its name. If one exists already, it is returned. + */ +- (id)getCommandInstance:(NSString*)pluginName +{ + // first, we try to find the pluginName in the pluginsMap + // (acts as a whitelist as well) if it does not exist, we return nil + // NOTE: plugin names are matched as lowercase to avoid problems - however, a + // possible issue is there can be duplicates possible if you had: + // "org.apache.cordova.Foo" and "org.apache.cordova.foo" - only the lower-cased entry will match + NSString* className = [self.pluginsMap objectForKey:[pluginName lowercaseString]]; + + if (className == nil) { + return nil; + } + + id obj = [self.pluginObjects objectForKey:className]; + if (!obj) { + obj = [[NSClassFromString(className)alloc] initWithWebViewEngine:_webViewEngine]; + if (!obj) { + NSString* fullClassName = [NSString stringWithFormat:@"%@.%@", + NSBundle.mainBundle.infoDictionary[@"CFBundleExecutable"], + className]; + obj = [[NSClassFromString(fullClassName)alloc] initWithWebViewEngine:_webViewEngine]; + } + + if (obj != nil) { + [self registerPlugin:obj withClassName:className]; + } else { + NSLog(@"CDVPlugin class %@ (pluginName: %@) does not exist.", className, pluginName); + } + } + return obj; +} + +#pragma mark - + +- (NSString*)appURLScheme +{ + NSString* URLScheme = nil; + + NSArray* URLTypes = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleURLTypes"]; + + if (URLTypes != nil) { + NSDictionary* dict = [URLTypes objectAtIndex:0]; + if (dict != nil) { + NSArray* URLSchemes = [dict objectForKey:@"CFBundleURLSchemes"]; + if (URLSchemes != nil) { + URLScheme = [URLSchemes objectAtIndex:0]; + } + } + } + + return URLScheme; +} + +#pragma mark - +#pragma mark UIApplicationDelegate impl + +/* + This method lets your application know that it is about to be terminated and purged from memory entirely + */ +- (void)onAppWillTerminate:(NSNotification*)notification +{ + // empty the tmp directory + NSFileManager* fileMgr = [[NSFileManager alloc] init]; + NSError* __autoreleasing err = nil; + + // clear contents of NSTemporaryDirectory + NSString* tempDirectoryPath = NSTemporaryDirectory(); + NSDirectoryEnumerator* directoryEnumerator = [fileMgr enumeratorAtPath:tempDirectoryPath]; + NSString* fileName = nil; + BOOL result; + + while ((fileName = [directoryEnumerator nextObject])) { + NSString* filePath = [tempDirectoryPath stringByAppendingPathComponent:fileName]; + result = [fileMgr removeItemAtPath:filePath error:&err]; + if (!result && err) { + NSLog(@"Failed to delete: %@ (error: %@)", filePath, err); + } + } +} + +- (bool)isUrlEmpty:(NSURL *)url +{ + if (!url || (url == (id) [NSNull null])) { + return true; + } + NSString *urlAsString = [url absoluteString]; + return (urlAsString == (id) [NSNull null] || [urlAsString length]==0 || [urlAsString isEqualToString:@"about:blank"]); +} + +- (bool)checkAndReinitViewUrl +{ + NSURL* appURL = [self appUrl]; + if ([self isUrlEmpty: [self.webViewEngine URL]] && ![self isUrlEmpty: appURL]) { + NSURLRequest* appReq = [NSURLRequest requestWithURL:appURL cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:20.0]; + [self.webViewEngine loadRequest:appReq]; + return true; + } + return false; +} + +/* + This method is called to let your application know that it is about to move from the active to inactive state. + You should use this method to pause ongoing tasks, disable timer, ... + */ +- (void)onAppWillResignActive:(NSNotification*)notification +{ + [self checkAndReinitViewUrl]; + // NSLog(@"%@",@"applicationWillResignActive"); + [self.commandDelegate evalJs:@"cordova.fireDocumentEvent('resign');" scheduledOnRunLoop:NO]; +} + +/* + In iOS 4.0 and later, this method is called as part of the transition from the background to the inactive state. + You can use this method to undo many of the changes you made to your application upon entering the background. + invariably followed by applicationDidBecomeActive + */ +- (void)onAppWillEnterForeground:(NSNotification*)notification +{ + [self checkAndReinitViewUrl]; + // NSLog(@"%@",@"applicationWillEnterForeground"); + [self.commandDelegate evalJs:@"cordova.fireDocumentEvent('resume');"]; + + if (!IsAtLeastiOSVersion(@"11.0")) { + /** Clipboard fix **/ + UIPasteboard* pasteboard = [UIPasteboard generalPasteboard]; + NSString* string = pasteboard.string; + if (string) { + [pasteboard setValue:string forPasteboardType:@"public.text"]; + } + } +} + +// This method is called to let your application know that it moved from the inactive to active state. +- (void)onAppDidBecomeActive:(NSNotification*)notification +{ + [self checkAndReinitViewUrl]; + // NSLog(@"%@",@"applicationDidBecomeActive"); + [self.commandDelegate evalJs:@"cordova.fireDocumentEvent('active');"]; +} + +/* + In iOS 4.0 and later, this method is called instead of the applicationWillTerminate: method + when the user quits an application that supports background execution. + */ +- (void)onAppDidEnterBackground:(NSNotification*)notification +{ + [self checkAndReinitViewUrl]; + // NSLog(@"%@",@"applicationDidEnterBackground"); + [self.commandDelegate evalJs:@"cordova.fireDocumentEvent('pause', null, true);" scheduledOnRunLoop:NO]; +} + +/** + Show the webview and fade out the intermediary view + This is to prevent the flashing of the mainViewController + */ +- (void)onWebViewPageDidLoad:(NSNotification*)notification +{ + self.webView.hidden = NO; + + if ([self.settings cordovaBoolSettingForKey:@"AutoHideSplashScreen" defaultValue:YES]) { + CGFloat splashScreenDelaySetting = [self.settings cordovaFloatSettingForKey:@"SplashScreenDelay" defaultValue:0]; + + if (splashScreenDelaySetting == 0) { + [self showLaunchScreen:NO]; + } else { + // Divide by 1000 because config returns milliseconds and NSTimer takes seconds + CGFloat splashScreenDelay = splashScreenDelaySetting / 1000; + + [NSTimer scheduledTimerWithTimeInterval:splashScreenDelay repeats:NO block:^(NSTimer * _Nonnull timer) { + [self showLaunchScreen:NO]; + }]; + } + } +} + +/** + Method to be called from the plugin JavaScript to show or hide the launch screen. + */ +- (void)showLaunchScreen:(BOOL)visible +{ + CGFloat fadeSplashScreenDuration = [self.settings cordovaFloatSettingForKey:@"FadeSplashScreenDuration" defaultValue:250]; + + // Setting minimum value for fade to 0.25 seconds + fadeSplashScreenDuration = fadeSplashScreenDuration < 250 ? 250 : fadeSplashScreenDuration; + + // AnimateWithDuration takes seconds but cordova documentation specifies milliseconds + CGFloat fadeDuration = fadeSplashScreenDuration/1000; + + [UIView animateWithDuration:fadeDuration animations:^{ + [self.launchView setAlpha:(visible ? 1 : 0)]; + }]; +} + +// /////////////////////// + +- (void)dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; + + [_commandQueue dispose]; + [[self.pluginObjects allValues] makeObjectsPerformSelector:@selector(dispose)]; + + [self.webViewEngine loadHTMLString:@"about:blank" baseURL:nil]; + [self.pluginObjects removeAllObjects]; + [self.webView removeFromSuperview]; + self.webViewEngine = nil; +} + +@end diff --git a/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVWebViewEngineProtocol.h b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVWebViewEngineProtocol.h new file mode 100644 index 0000000..e6126a4 --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVWebViewEngineProtocol.h @@ -0,0 +1,41 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. + */ + +#import + +#define kCDVWebViewEngineScriptMessageHandlers @"kCDVWebViewEngineScriptMessageHandlers" +#define kCDVWebViewEngineWKNavigationDelegate @"kCDVWebViewEngineWKNavigationDelegate" +#define kCDVWebViewEngineWKUIDelegate @"kCDVWebViewEngineWKUIDelegate" +#define kCDVWebViewEngineWebViewPreferences @"kCDVWebViewEngineWebViewPreferences" + +@protocol CDVWebViewEngineProtocol + +@property (nonatomic, strong, readonly) UIView* engineWebView; + +- (id)loadRequest:(NSURLRequest*)request; +- (id)loadHTMLString:(NSString*)string baseURL:(NSURL*)baseURL; +- (void)evaluateJavaScript:(NSString*)javaScriptString completionHandler:(void (^)(id, NSError*))completionHandler; + +- (NSURL*)URL; +- (BOOL)canLoadRequest:(NSURLRequest*)request; + +- (instancetype)initWithFrame:(CGRect)frame; +- (void)updateWithInfo:(NSDictionary*)info; + +@end diff --git a/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVWebViewProcessPoolFactory.h b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVWebViewProcessPoolFactory.h new file mode 100644 index 0000000..b156289 --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVWebViewProcessPoolFactory.h @@ -0,0 +1,27 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. + */ + +#import + +@interface CDVWebViewProcessPoolFactory : NSObject +@property (nonatomic, retain) WKProcessPool* sharedPool; + ++(instancetype) sharedFactory; +-(WKProcessPool*) sharedProcessPool; +@end diff --git a/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVWebViewProcessPoolFactory.m b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVWebViewProcessPoolFactory.m new file mode 100644 index 0000000..577624e --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVWebViewProcessPoolFactory.m @@ -0,0 +1,49 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. + */ + +#import +#import +#import "CDVWebViewProcessPoolFactory.h" + +static CDVWebViewProcessPoolFactory *factory = nil; + +@implementation CDVWebViewProcessPoolFactory + ++ (instancetype)sharedFactory +{ + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + factory = [[CDVWebViewProcessPoolFactory alloc] init]; + }); + + return factory; +} + +- (instancetype)init +{ + if (self = [super init]) { + _sharedPool = [[WKProcessPool alloc] init]; + } + return self; +} + +- (WKProcessPool*) sharedProcessPool { + return _sharedPool; +} +@end diff --git a/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVWhitelist.h b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVWhitelist.h new file mode 100644 index 0000000..9165097 --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVWhitelist.h @@ -0,0 +1,34 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. + */ + +#import + +extern NSString* const kCDVDefaultWhitelistRejectionString; + +@interface CDVWhitelist : NSObject + +@property (nonatomic, copy) NSString* whitelistRejectionFormatString; + +- (id)initWithArray:(NSArray*)array; +- (BOOL)schemeIsAllowed:(NSString*)scheme; +- (BOOL)URLIsAllowed:(NSURL*)url; +- (BOOL)URLIsAllowed:(NSURL*)url logFailure:(BOOL)logFailure; +- (NSString*)errorStringForURL:(NSURL*)url; + +@end diff --git a/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVWhitelist.m b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVWhitelist.m new file mode 100644 index 0000000..758f4d1 --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/CDVWhitelist.m @@ -0,0 +1,285 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. + */ + +#import "CDVWhitelist.h" + +NSString* const kCDVDefaultWhitelistRejectionString = @"ERROR whitelist rejection: url='%@'"; +NSString* const kCDVDefaultSchemeName = @"cdv-default-scheme"; + +@interface CDVWhitelistPattern : NSObject { + @private + NSRegularExpression* _scheme; + NSRegularExpression* _host; + NSNumber* _port; + NSRegularExpression* _path; +} + ++ (NSString*)regexFromPattern:(NSString*)pattern allowWildcards:(bool)allowWildcards; +- (id)initWithScheme:(NSString*)scheme host:(NSString*)host port:(NSString*)port path:(NSString*)path; +- (bool)matches:(NSURL*)url; + +@end + +@implementation CDVWhitelistPattern + ++ (NSString*)regexFromPattern:(NSString*)pattern allowWildcards:(bool)allowWildcards +{ + NSString* regex = [NSRegularExpression escapedPatternForString:pattern]; + + if (allowWildcards) { + regex = [regex stringByReplacingOccurrencesOfString:@"\\*" withString:@".*"]; + + /* [NSURL path] has the peculiarity that a trailing slash at the end of a path + * will be omitted. This regex tweak compensates for that. + */ + if ([regex hasSuffix:@"\\/.*"]) { + regex = [NSString stringWithFormat:@"%@(\\/.*)?", [regex substringToIndex:([regex length] - 4)]]; + } + } + return [NSString stringWithFormat:@"%@$", regex]; +} + +- (id)initWithScheme:(NSString*)scheme host:(NSString*)host port:(NSString*)port path:(NSString*)path +{ + self = [super init]; // Potentially change "self" + if (self) { + if ((scheme == nil) || [scheme isEqualToString:@"*"]) { + _scheme = nil; + } else { + _scheme = [NSRegularExpression regularExpressionWithPattern:[CDVWhitelistPattern regexFromPattern:scheme allowWildcards:NO] options:NSRegularExpressionCaseInsensitive error:nil]; + } + if ([host isEqualToString:@"*"] || host == nil) { + _host = nil; + } else if ([host hasPrefix:@"*."]) { + _host = [NSRegularExpression regularExpressionWithPattern:[NSString stringWithFormat:@"([a-z0-9.-]*\\.)?%@", [CDVWhitelistPattern regexFromPattern:[host substringFromIndex:2] allowWildcards:false]] options:NSRegularExpressionCaseInsensitive error:nil]; + } else { + _host = [NSRegularExpression regularExpressionWithPattern:[CDVWhitelistPattern regexFromPattern:host allowWildcards:NO] options:NSRegularExpressionCaseInsensitive error:nil]; + } + if ((port == nil) || [port isEqualToString:@"*"]) { + _port = nil; + } else { + _port = [[NSNumber alloc] initWithInteger:[port integerValue]]; + } + if ((path == nil) || [path isEqualToString:@"/*"]) { + _path = nil; + } else { + _path = [NSRegularExpression regularExpressionWithPattern:[CDVWhitelistPattern regexFromPattern:path allowWildcards:YES] options:0 error:nil]; + } + } + return self; +} + +- (bool)matches:(NSURL*)url +{ + return (_scheme == nil || [_scheme numberOfMatchesInString:[url scheme] options:NSMatchingAnchored range:NSMakeRange(0, [[url scheme] length])]) && + (_host == nil || ([url host] != nil && [_host numberOfMatchesInString:[url host] options:NSMatchingAnchored range:NSMakeRange(0, [[url host] length])])) && + (_port == nil || [[url port] isEqualToNumber:_port]) && + (_path == nil || [_path numberOfMatchesInString:[url path] options:NSMatchingAnchored range:NSMakeRange(0, [[url path] length])]) + ; +} + +@end + +@interface CDVWhitelist () + +@property (nonatomic, readwrite, strong) NSMutableArray* whitelist; +@property (nonatomic, readwrite, strong) NSMutableSet* permittedSchemes; + +- (void)addWhiteListEntry:(NSString*)pattern; + +@end + +@implementation CDVWhitelist + +@synthesize whitelist, permittedSchemes, whitelistRejectionFormatString; + +- (id)initWithArray:(NSArray*)array +{ + self = [super init]; + if (self) { + self.whitelist = [[NSMutableArray alloc] init]; + self.permittedSchemes = [[NSMutableSet alloc] init]; + self.whitelistRejectionFormatString = kCDVDefaultWhitelistRejectionString; + + for (NSString* pattern in array) { + [self addWhiteListEntry:pattern]; + } + } + return self; +} + +- (BOOL)isIPv4Address:(NSString*)externalHost +{ + // an IPv4 address has 4 octets b.b.b.b where b is a number between 0 and 255. + // for our purposes, b can also be the wildcard character '*' + + // we could use a regex to solve this problem but then I would have two problems + // anyways, this is much clearer and maintainable + NSArray* octets = [externalHost componentsSeparatedByString:@"."]; + NSUInteger num_octets = [octets count]; + + // quick check + if (num_octets != 4) { + return NO; + } + + // restrict number parsing to 0-255 + NSNumberFormatter* numberFormatter = [[NSNumberFormatter alloc] init]; + [numberFormatter setMinimum:[NSNumber numberWithUnsignedInteger:0]]; + [numberFormatter setMaximum:[NSNumber numberWithUnsignedInteger:255]]; + + // iterate through each octet, and test for a number between 0-255 or if it equals '*' + for (NSUInteger i = 0; i < num_octets; ++i) { + NSString* octet = [octets objectAtIndex:i]; + + if ([octet isEqualToString:@"*"]) { // passes - check next octet + continue; + } else if ([numberFormatter numberFromString:octet] == nil) { // fails - not a number and not within our range, return + return NO; + } + } + + return YES; +} + +- (void)addWhiteListEntry:(NSString*)origin +{ + if (self.whitelist == nil) { + return; + } + + if ([origin isEqualToString:@"*"]) { + NSLog(@"Unlimited access to network resources"); + self.whitelist = nil; + self.permittedSchemes = nil; + } else { // specific access + NSRegularExpression* parts = [NSRegularExpression regularExpressionWithPattern:@"^((\\*|[A-Za-z-]+):/?/?)?(((\\*\\.)?[^*/:]+)|\\*)?(:(\\d+))?(/.*)?" options:0 error:nil]; + NSTextCheckingResult* m = [parts firstMatchInString:origin options:NSMatchingAnchored range:NSMakeRange(0, [origin length])]; + if (m != nil) { + NSRange r; + NSString* scheme = nil; + r = [m rangeAtIndex:2]; + if (r.location != NSNotFound) { + scheme = [origin substringWithRange:r]; + } + + NSString* host = nil; + r = [m rangeAtIndex:3]; + if (r.location != NSNotFound) { + host = [origin substringWithRange:r]; + } + + // Special case for two urls which are allowed to have empty hosts + if (([scheme isEqualToString:@"file"] || [scheme isEqualToString:@"content"]) && (host == nil)) { + host = @"*"; + } + + NSString* port = nil; + r = [m rangeAtIndex:7]; + if (r.location != NSNotFound) { + port = [origin substringWithRange:r]; + } + + NSString* path = nil; + r = [m rangeAtIndex:8]; + if (r.location != NSNotFound) { + path = [origin substringWithRange:r]; + } + + if (scheme == nil) { + // XXX making it stupid friendly for people who forget to include protocol/SSL + [self.whitelist addObject:[[CDVWhitelistPattern alloc] initWithScheme:@"http" host:host port:port path:path]]; + [self.whitelist addObject:[[CDVWhitelistPattern alloc] initWithScheme:@"https" host:host port:port path:path]]; + } else { + [self.whitelist addObject:[[CDVWhitelistPattern alloc] initWithScheme:scheme host:host port:port path:path]]; + } + + if (self.permittedSchemes != nil) { + if ([scheme isEqualToString:@"*"]) { + self.permittedSchemes = nil; + } else if (scheme != nil) { + [self.permittedSchemes addObject:scheme]; + } + } + } + } +} + +- (BOOL)schemeIsAllowed:(NSString*)scheme +{ + if ([scheme isEqualToString:@"http"] || + [scheme isEqualToString:@"https"] || + [scheme isEqualToString:@"ftp"] || + [scheme isEqualToString:@"ftps"]) { + return YES; + } + + return (self.permittedSchemes == nil) || [self.permittedSchemes containsObject:scheme]; +} + +- (BOOL)URLIsAllowed:(NSURL*)url +{ + return [self URLIsAllowed:url logFailure:YES]; +} + +- (BOOL)URLIsAllowed:(NSURL*)url logFailure:(BOOL)logFailure +{ + // Shortcut acceptance: Are all urls whitelisted ("*" in whitelist)? + if (whitelist == nil) { + return YES; + } + + // Shortcut rejection: Check that the scheme is supported + NSString* scheme = [[url scheme] lowercaseString]; + if (![self schemeIsAllowed:scheme]) { + if (logFailure) { + NSLog(@"%@", [self errorStringForURL:url]); + } + return NO; + } + + // http[s] and ftp[s] should also validate against the common set in the kCDVDefaultSchemeName list + if ([scheme isEqualToString:@"http"] || [scheme isEqualToString:@"https"] || [scheme isEqualToString:@"ftp"] || [scheme isEqualToString:@"ftps"]) { + NSURL* newUrl = [NSURL URLWithString:[NSString stringWithFormat:@"%@://%@%@", kCDVDefaultSchemeName, [url host], [[url path] stringByAddingPercentEncodingWithAllowedCharacters:NSCharacterSet.URLPathAllowedCharacterSet]]]; + // If it is allowed, we are done. If not, continue to check for the actual scheme-specific list + if ([self URLIsAllowed:newUrl logFailure:NO]) { + return YES; + } + } + + // Check the url against patterns in the whitelist + for (CDVWhitelistPattern* p in self.whitelist) { + if ([p matches:url]) { + return YES; + } + } + + if (logFailure) { + NSLog(@"%@", [self errorStringForURL:url]); + } + // if we got here, the url host is not in the white-list, do nothing + return NO; +} + +- (NSString*)errorStringForURL:(NSURL*)url +{ + return [NSString stringWithFormat:self.whitelistRejectionFormatString, [url absoluteString]]; +} + +@end diff --git a/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/NSDictionary+CordovaPreferences.h b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/NSDictionary+CordovaPreferences.h new file mode 100644 index 0000000..9be2be2 --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/NSDictionary+CordovaPreferences.h @@ -0,0 +1,35 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. + */ + +#import +#import + +@interface NSDictionary (CordovaPreferences) + +- (id)cordovaSettingForKey:(NSString*)key; +- (BOOL)cordovaBoolSettingForKey:(NSString*)key defaultValue:(BOOL)defaultValue; +- (CGFloat)cordovaFloatSettingForKey:(NSString*)key defaultValue:(CGFloat)defaultValue; + +@end + +@interface NSMutableDictionary (CordovaPreferences) + +- (void)setCordovaSetting:(id)value forKey:(NSString*)key; + +@end diff --git a/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/NSDictionary+CordovaPreferences.m b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/NSDictionary+CordovaPreferences.m new file mode 100644 index 0000000..1266ba2 --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/NSDictionary+CordovaPreferences.m @@ -0,0 +1,92 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. + */ + +#import "NSDictionary+CordovaPreferences.h" +#import + +@implementation NSDictionary (CordovaPreferences) + +- (id)cordovaSettingForKey:(NSString*)key +{ + return [self objectForKey:[key lowercaseString]]; +} + +- (BOOL)cordovaBoolSettingForKey:(NSString*)key defaultValue:(BOOL)defaultValue +{ + BOOL value = defaultValue; + id prefObj = [self cordovaSettingForKey:key]; + + if (prefObj == nil) { + NSLog(@"The preference key \"%@\" is not defined and will default to \"%@\"", + key, + (defaultValue ? @"TRUE" : @"FALSE")); + + return value; + } + + if ([prefObj isKindOfClass:NSString.class]) { + prefObj = [prefObj lowercaseString]; + + if ( + // True Case + [prefObj isEqualToString:@"true"] || + [prefObj isEqualToString:@"1"] || + // False Case + [prefObj isEqualToString:@"false"] || + [prefObj isEqualToString:@"0"] + ) + { + value = [prefObj isEqualToString:@"true"] || [prefObj isEqualToString:@"1"]; + } + } else if ( + [prefObj isKindOfClass:NSNumber.class] && + ( + [prefObj isEqual: @YES] || + [prefObj isEqual: @NO] + ) + ) + { + value = [prefObj isEqual: @YES]; + } + + return value; +} + +- (CGFloat)cordovaFloatSettingForKey:(NSString*)key defaultValue:(CGFloat)defaultValue +{ + CGFloat value = defaultValue; + id prefObj = [self cordovaSettingForKey:key]; + + if (prefObj != nil) { + value = [prefObj floatValue]; + } + + return value; +} + +@end + +@implementation NSMutableDictionary (CordovaPreferences) + +- (void)setCordovaSetting:(id)value forKey:(NSString*)key +{ + [self setObject:value forKey:[key lowercaseString]]; +} + +@end diff --git a/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/NSMutableArray+QueueAdditions.h b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/NSMutableArray+QueueAdditions.h new file mode 100644 index 0000000..79e6516 --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/NSMutableArray+QueueAdditions.h @@ -0,0 +1,29 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. + */ + +#import + +@interface NSMutableArray (QueueAdditions) + +- (id)cdv_pop; +- (id)cdv_queueHead; +- (id)cdv_dequeue; +- (void)cdv_enqueue:(id)obj; + +@end diff --git a/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/NSMutableArray+QueueAdditions.m b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/NSMutableArray+QueueAdditions.m new file mode 100644 index 0000000..2b3acdc --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/CordovaLib/Classes/Public/NSMutableArray+QueueAdditions.m @@ -0,0 +1,58 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. + */ + +#import "NSMutableArray+QueueAdditions.h" + +@implementation NSMutableArray (QueueAdditions) + +- (id)cdv_queueHead +{ + if ([self count] == 0) { + return nil; + } + + return [self objectAtIndex:0]; +} + +- (__autoreleasing id)cdv_dequeue +{ + if ([self count] == 0) { + return nil; + } + + id head = [self objectAtIndex:0]; + if (head != nil) { + // [[head retain] autorelease]; ARC - the __autoreleasing on the return value should so the same thing + [self removeObjectAtIndex:0]; + } + + return head; +} + +- (id)cdv_pop +{ + return [self cdv_dequeue]; +} + +- (void)cdv_enqueue:(id)object +{ + [self addObject:object]; +} + +@end diff --git a/examples/AlanBasicExample/platforms/ios/CordovaLib/CordovaLib.xcodeproj/project.pbxproj b/examples/AlanBasicExample/platforms/ios/CordovaLib/CordovaLib.xcodeproj/project.pbxproj new file mode 100644 index 0000000..56e3aa5 --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/CordovaLib/CordovaLib.xcodeproj/project.pbxproj @@ -0,0 +1,811 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 52; + objects = { + +/* Begin PBXBuildFile section */ + 28BFF9141F355A4E00DDF01A /* CDVLogger.h in Headers */ = {isa = PBXBuildFile; fileRef = 28BFF9121F355A4E00DDF01A /* CDVLogger.h */; }; + 28BFF9151F355A4E00DDF01A /* CDVLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 28BFF9131F355A4E00DDF01A /* CDVLogger.m */; }; + 2F4D42BC23F218BA00501999 /* CDVURLSchemeHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 2F4D42BA23F218BA00501999 /* CDVURLSchemeHandler.h */; }; + 2F4D42BD23F218BA00501999 /* CDVURLSchemeHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 2F4D42BB23F218BA00501999 /* CDVURLSchemeHandler.m */; }; + 2FCCEA17247E7366007276A8 /* CDVLaunchScreen.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E714D3423F535B500A321AF /* CDVLaunchScreen.m */; }; + 2FCCEA18247E7366007276A8 /* CDVLaunchScreen.h in Headers */ = {isa = PBXBuildFile; fileRef = 4E714D3223F535B500A321AF /* CDVLaunchScreen.h */; }; + 3093E2231B16D6A3003F381A /* CDVIntentAndNavigationFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 3093E2211B16D6A3003F381A /* CDVIntentAndNavigationFilter.h */; }; + 3093E2241B16D6A3003F381A /* CDVIntentAndNavigationFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 3093E2221B16D6A3003F381A /* CDVIntentAndNavigationFilter.m */; }; + 4E23F8FB23E16E96006CD852 /* CDVWebViewProcessPoolFactory.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E23F8F523E16E96006CD852 /* CDVWebViewProcessPoolFactory.m */; }; + 4E23F8FC23E16E96006CD852 /* CDVWebViewUIDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 4E23F8F623E16E96006CD852 /* CDVWebViewUIDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4E23F8FD23E16E96006CD852 /* CDVWebViewUIDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E23F8F723E16E96006CD852 /* CDVWebViewUIDelegate.m */; }; + 4E23F8FE23E16E96006CD852 /* CDVWebViewEngine.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E23F8F823E16E96006CD852 /* CDVWebViewEngine.m */; }; + 4E23F8FF23E16E96006CD852 /* CDVWebViewProcessPoolFactory.h in Headers */ = {isa = PBXBuildFile; fileRef = 4E23F8F923E16E96006CD852 /* CDVWebViewProcessPoolFactory.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4E23F90023E16E96006CD852 /* CDVWebViewEngine.h in Headers */ = {isa = PBXBuildFile; fileRef = 4E23F8FA23E16E96006CD852 /* CDVWebViewEngine.h */; }; + 4E23F90323E17FFA006CD852 /* CDVWebViewUIDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 4E23F8F623E16E96006CD852 /* CDVWebViewUIDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4E714D3623F535B500A321AF /* CDVLaunchScreen.h in Headers */ = {isa = PBXBuildFile; fileRef = 4E714D3223F535B500A321AF /* CDVLaunchScreen.h */; }; + 4E714D3823F535B500A321AF /* CDVLaunchScreen.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E714D3423F535B500A321AF /* CDVLaunchScreen.m */; }; + 4F56D82D254A2EB50063F1D6 /* CDVWebViewEngine.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E23F8F823E16E96006CD852 /* CDVWebViewEngine.m */; }; + 4F56D830254A2ED70063F1D6 /* CDVWebViewUIDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E23F8F723E16E96006CD852 /* CDVWebViewUIDelegate.m */; }; + 4F56D833254A2ED90063F1D6 /* CDVWebViewProcessPoolFactory.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E23F8F523E16E96006CD852 /* CDVWebViewProcessPoolFactory.m */; }; + 4F56D836254A2EE10063F1D6 /* CDVWebViewEngine.h in Headers */ = {isa = PBXBuildFile; fileRef = 4E23F8FA23E16E96006CD852 /* CDVWebViewEngine.h */; }; + 4F56D839254A2EE40063F1D6 /* CDVWebViewProcessPoolFactory.h in Headers */ = {isa = PBXBuildFile; fileRef = 4E23F8F923E16E96006CD852 /* CDVWebViewProcessPoolFactory.h */; }; + 4F56D83C254A2F2F0063F1D6 /* CDVURLSchemeHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 2F4D42BB23F218BA00501999 /* CDVURLSchemeHandler.m */; }; + 7E7F69B91ABA3692007546F4 /* CDVHandleOpenURL.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95CF81AB9028C008C4574 /* CDVHandleOpenURL.h */; }; + 7ED95D021AB9028C008C4574 /* CDVDebug.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95CF21AB9028C008C4574 /* CDVDebug.h */; }; + 7ED95D031AB9028C008C4574 /* CDVJSON_private.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95CF31AB9028C008C4574 /* CDVJSON_private.h */; }; + 7ED95D041AB9028C008C4574 /* CDVJSON_private.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ED95CF41AB9028C008C4574 /* CDVJSON_private.m */; }; + 7ED95D051AB9028C008C4574 /* CDVPlugin+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95CF51AB9028C008C4574 /* CDVPlugin+Private.h */; }; + 7ED95D071AB9028C008C4574 /* CDVHandleOpenURL.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ED95CF91AB9028C008C4574 /* CDVHandleOpenURL.m */; }; + 7ED95D351AB9029B008C4574 /* CDV.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D0F1AB9029B008C4574 /* CDV.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7ED95D361AB9029B008C4574 /* CDVAppDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D101AB9029B008C4574 /* CDVAppDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7ED95D371AB9029B008C4574 /* CDVAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ED95D111AB9029B008C4574 /* CDVAppDelegate.m */; }; + 7ED95D381AB9029B008C4574 /* CDVAvailability.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D121AB9029B008C4574 /* CDVAvailability.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7ED95D391AB9029B008C4574 /* CDVAvailabilityDeprecated.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D131AB9029B008C4574 /* CDVAvailabilityDeprecated.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7ED95D3A1AB9029B008C4574 /* CDVCommandDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D141AB9029B008C4574 /* CDVCommandDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7ED95D3B1AB9029B008C4574 /* CDVCommandDelegateImpl.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D151AB9029B008C4574 /* CDVCommandDelegateImpl.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7ED95D3C1AB9029B008C4574 /* CDVCommandDelegateImpl.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ED95D161AB9029B008C4574 /* CDVCommandDelegateImpl.m */; }; + 7ED95D3D1AB9029B008C4574 /* CDVCommandQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D171AB9029B008C4574 /* CDVCommandQueue.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7ED95D3E1AB9029B008C4574 /* CDVCommandQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ED95D181AB9029B008C4574 /* CDVCommandQueue.m */; }; + 7ED95D3F1AB9029B008C4574 /* CDVConfigParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D191AB9029B008C4574 /* CDVConfigParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7ED95D401AB9029B008C4574 /* CDVConfigParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ED95D1A1AB9029B008C4574 /* CDVConfigParser.m */; }; + 7ED95D411AB9029B008C4574 /* CDVInvokedUrlCommand.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D1B1AB9029B008C4574 /* CDVInvokedUrlCommand.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7ED95D421AB9029B008C4574 /* CDVInvokedUrlCommand.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ED95D1C1AB9029B008C4574 /* CDVInvokedUrlCommand.m */; }; + 7ED95D431AB9029B008C4574 /* CDVPlugin+Resources.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D1D1AB9029B008C4574 /* CDVPlugin+Resources.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7ED95D441AB9029B008C4574 /* CDVPlugin+Resources.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ED95D1E1AB9029B008C4574 /* CDVPlugin+Resources.m */; }; + 7ED95D451AB9029B008C4574 /* CDVPlugin.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D1F1AB9029B008C4574 /* CDVPlugin.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7ED95D461AB9029B008C4574 /* CDVPlugin.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ED95D201AB9029B008C4574 /* CDVPlugin.m */; }; + 7ED95D471AB9029B008C4574 /* CDVPluginResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D211AB9029B008C4574 /* CDVPluginResult.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7ED95D481AB9029B008C4574 /* CDVPluginResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ED95D221AB9029B008C4574 /* CDVPluginResult.m */; }; + 7ED95D491AB9029B008C4574 /* CDVScreenOrientationDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D231AB9029B008C4574 /* CDVScreenOrientationDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7ED95D4A1AB9029B008C4574 /* CDVTimer.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D241AB9029B008C4574 /* CDVTimer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7ED95D4B1AB9029B008C4574 /* CDVTimer.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ED95D251AB9029B008C4574 /* CDVTimer.m */; }; + 7ED95D501AB9029B008C4574 /* CDVViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D2A1AB9029B008C4574 /* CDVViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7ED95D511AB9029B008C4574 /* CDVViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ED95D2B1AB9029B008C4574 /* CDVViewController.m */; }; + 7ED95D521AB9029B008C4574 /* CDVWebViewEngineProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D2C1AB9029B008C4574 /* CDVWebViewEngineProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7ED95D531AB9029B008C4574 /* CDVWhitelist.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D2D1AB9029B008C4574 /* CDVWhitelist.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7ED95D541AB9029B008C4574 /* CDVWhitelist.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ED95D2E1AB9029B008C4574 /* CDVWhitelist.m */; }; + 7ED95D571AB9029B008C4574 /* NSDictionary+CordovaPreferences.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D311AB9029B008C4574 /* NSDictionary+CordovaPreferences.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7ED95D581AB9029B008C4574 /* NSDictionary+CordovaPreferences.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ED95D321AB9029B008C4574 /* NSDictionary+CordovaPreferences.m */; }; + 7ED95D591AB9029B008C4574 /* NSMutableArray+QueueAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D331AB9029B008C4574 /* NSMutableArray+QueueAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7ED95D5A1AB9029B008C4574 /* NSMutableArray+QueueAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ED95D341AB9029B008C4574 /* NSMutableArray+QueueAdditions.m */; }; + 9052DE712150D040008E83D4 /* CDVAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ED95D111AB9029B008C4574 /* CDVAppDelegate.m */; }; + 9052DE722150D040008E83D4 /* CDVCommandDelegateImpl.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ED95D161AB9029B008C4574 /* CDVCommandDelegateImpl.m */; }; + 9052DE732150D040008E83D4 /* CDVCommandQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ED95D181AB9029B008C4574 /* CDVCommandQueue.m */; }; + 9052DE742150D040008E83D4 /* CDVConfigParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ED95D1A1AB9029B008C4574 /* CDVConfigParser.m */; }; + 9052DE752150D040008E83D4 /* CDVInvokedUrlCommand.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ED95D1C1AB9029B008C4574 /* CDVInvokedUrlCommand.m */; }; + 9052DE762150D040008E83D4 /* CDVPlugin+Resources.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ED95D1E1AB9029B008C4574 /* CDVPlugin+Resources.m */; }; + 9052DE772150D040008E83D4 /* CDVPlugin.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ED95D201AB9029B008C4574 /* CDVPlugin.m */; }; + 9052DE782150D040008E83D4 /* CDVPluginResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ED95D221AB9029B008C4574 /* CDVPluginResult.m */; }; + 9052DE792150D040008E83D4 /* CDVTimer.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ED95D251AB9029B008C4574 /* CDVTimer.m */; }; + 9052DE7C2150D040008E83D4 /* CDVViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ED95D2B1AB9029B008C4574 /* CDVViewController.m */; }; + 9052DE7D2150D040008E83D4 /* CDVWhitelist.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ED95D2E1AB9029B008C4574 /* CDVWhitelist.m */; }; + 9052DE7E2150D040008E83D4 /* NSDictionary+CordovaPreferences.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ED95D321AB9029B008C4574 /* NSDictionary+CordovaPreferences.m */; }; + 9052DE7F2150D040008E83D4 /* NSMutableArray+QueueAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ED95D341AB9029B008C4574 /* NSMutableArray+QueueAdditions.m */; }; + 9052DE802150D040008E83D4 /* CDVJSON_private.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ED95CF41AB9028C008C4574 /* CDVJSON_private.m */; }; + 9052DE812150D040008E83D4 /* CDVLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 28BFF9131F355A4E00DDF01A /* CDVLogger.m */; }; + 9052DE822150D040008E83D4 /* CDVGestureHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = A3B082D31BB15CEA00D8DC35 /* CDVGestureHandler.m */; }; + 9052DE832150D040008E83D4 /* CDVIntentAndNavigationFilter.m in Sources */ = {isa = PBXBuildFile; fileRef = 3093E2221B16D6A3003F381A /* CDVIntentAndNavigationFilter.m */; }; + 9052DE842150D040008E83D4 /* CDVHandleOpenURL.m in Sources */ = {isa = PBXBuildFile; fileRef = 7ED95CF91AB9028C008C4574 /* CDVHandleOpenURL.m */; }; + 9052DE892150D06B008E83D4 /* CDVDebug.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95CF21AB9028C008C4574 /* CDVDebug.h */; }; + 9052DE8A2150D06B008E83D4 /* CDVJSON_private.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95CF31AB9028C008C4574 /* CDVJSON_private.h */; }; + 9052DE8B2150D06B008E83D4 /* CDVPlugin+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95CF51AB9028C008C4574 /* CDVPlugin+Private.h */; }; + 9052DE8C2150D06B008E83D4 /* CDVLogger.h in Headers */ = {isa = PBXBuildFile; fileRef = 28BFF9121F355A4E00DDF01A /* CDVLogger.h */; }; + 9052DE8D2150D06B008E83D4 /* CDVGestureHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = A3B082D21BB15CEA00D8DC35 /* CDVGestureHandler.h */; }; + 9052DE8E2150D06B008E83D4 /* CDVIntentAndNavigationFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 3093E2211B16D6A3003F381A /* CDVIntentAndNavigationFilter.h */; }; + 9052DE8F2150D06B008E83D4 /* CDVHandleOpenURL.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95CF81AB9028C008C4574 /* CDVHandleOpenURL.h */; }; + A3B082D41BB15CEA00D8DC35 /* CDVGestureHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = A3B082D21BB15CEA00D8DC35 /* CDVGestureHandler.h */; }; + A3B082D51BB15CEA00D8DC35 /* CDVGestureHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = A3B082D31BB15CEA00D8DC35 /* CDVGestureHandler.m */; }; + C0C01EB61E3911D50056E6CB /* Cordova.h in Headers */ = {isa = PBXBuildFile; fileRef = C0C01EB41E3911D50056E6CB /* Cordova.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C0C01EBB1E39131A0056E6CB /* CDV.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D0F1AB9029B008C4574 /* CDV.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C0C01EBC1E39131A0056E6CB /* CDVAppDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D101AB9029B008C4574 /* CDVAppDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C0C01EBD1E39131A0056E6CB /* CDVAvailability.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D121AB9029B008C4574 /* CDVAvailability.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C0C01EBE1E39131A0056E6CB /* CDVAvailabilityDeprecated.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D131AB9029B008C4574 /* CDVAvailabilityDeprecated.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C0C01EBF1E39131A0056E6CB /* CDVCommandDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D141AB9029B008C4574 /* CDVCommandDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C0C01EC01E39131A0056E6CB /* CDVCommandDelegateImpl.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D151AB9029B008C4574 /* CDVCommandDelegateImpl.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C0C01EC11E39131A0056E6CB /* CDVCommandQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D171AB9029B008C4574 /* CDVCommandQueue.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C0C01EC21E39131A0056E6CB /* CDVConfigParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D191AB9029B008C4574 /* CDVConfigParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C0C01EC31E39131A0056E6CB /* CDVInvokedUrlCommand.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D1B1AB9029B008C4574 /* CDVInvokedUrlCommand.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C0C01EC41E39131A0056E6CB /* CDVPlugin+Resources.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D1D1AB9029B008C4574 /* CDVPlugin+Resources.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C0C01EC51E39131A0056E6CB /* CDVPlugin.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D1F1AB9029B008C4574 /* CDVPlugin.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C0C01EC61E39131A0056E6CB /* CDVPluginResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D211AB9029B008C4574 /* CDVPluginResult.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C0C01EC71E39131A0056E6CB /* CDVScreenOrientationDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D231AB9029B008C4574 /* CDVScreenOrientationDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C0C01EC81E39131A0056E6CB /* CDVTimer.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D241AB9029B008C4574 /* CDVTimer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C0C01ECB1E39131A0056E6CB /* CDVViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D2A1AB9029B008C4574 /* CDVViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C0C01ECC1E39131A0056E6CB /* CDVWebViewEngineProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D2C1AB9029B008C4574 /* CDVWebViewEngineProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C0C01ECD1E39131A0056E6CB /* CDVWhitelist.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D2D1AB9029B008C4574 /* CDVWhitelist.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C0C01ECE1E39131A0056E6CB /* NSDictionary+CordovaPreferences.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D311AB9029B008C4574 /* NSDictionary+CordovaPreferences.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C0C01ECF1E39131A0056E6CB /* NSMutableArray+QueueAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 7ED95D331AB9029B008C4574 /* NSMutableArray+QueueAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 28BFF9121F355A4E00DDF01A /* CDVLogger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDVLogger.h; sourceTree = ""; }; + 28BFF9131F355A4E00DDF01A /* CDVLogger.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CDVLogger.m; sourceTree = ""; }; + 2F4D42BA23F218BA00501999 /* CDVURLSchemeHandler.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CDVURLSchemeHandler.h; sourceTree = ""; }; + 2F4D42BB23F218BA00501999 /* CDVURLSchemeHandler.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CDVURLSchemeHandler.m; sourceTree = ""; }; + 3093E2211B16D6A3003F381A /* CDVIntentAndNavigationFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDVIntentAndNavigationFilter.h; sourceTree = ""; }; + 3093E2221B16D6A3003F381A /* CDVIntentAndNavigationFilter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CDVIntentAndNavigationFilter.m; sourceTree = ""; }; + 4E23F8F523E16E96006CD852 /* CDVWebViewProcessPoolFactory.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CDVWebViewProcessPoolFactory.m; sourceTree = ""; }; + 4E23F8F623E16E96006CD852 /* CDVWebViewUIDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDVWebViewUIDelegate.h; sourceTree = ""; }; + 4E23F8F723E16E96006CD852 /* CDVWebViewUIDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CDVWebViewUIDelegate.m; sourceTree = ""; }; + 4E23F8F823E16E96006CD852 /* CDVWebViewEngine.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CDVWebViewEngine.m; sourceTree = ""; }; + 4E23F8F923E16E96006CD852 /* CDVWebViewProcessPoolFactory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDVWebViewProcessPoolFactory.h; sourceTree = ""; }; + 4E23F8FA23E16E96006CD852 /* CDVWebViewEngine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDVWebViewEngine.h; sourceTree = ""; }; + 4E714D3223F535B500A321AF /* CDVLaunchScreen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDVLaunchScreen.h; sourceTree = ""; }; + 4E714D3423F535B500A321AF /* CDVLaunchScreen.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CDVLaunchScreen.m; sourceTree = ""; }; + 68A32D7114102E1C006B237C /* libCordova.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libCordova.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 7ED95CF21AB9028C008C4574 /* CDVDebug.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDVDebug.h; sourceTree = ""; }; + 7ED95CF31AB9028C008C4574 /* CDVJSON_private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDVJSON_private.h; sourceTree = ""; }; + 7ED95CF41AB9028C008C4574 /* CDVJSON_private.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CDVJSON_private.m; sourceTree = ""; }; + 7ED95CF51AB9028C008C4574 /* CDVPlugin+Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "CDVPlugin+Private.h"; sourceTree = ""; }; + 7ED95CF81AB9028C008C4574 /* CDVHandleOpenURL.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDVHandleOpenURL.h; sourceTree = ""; }; + 7ED95CF91AB9028C008C4574 /* CDVHandleOpenURL.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CDVHandleOpenURL.m; sourceTree = ""; }; + 7ED95D0F1AB9029B008C4574 /* CDV.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDV.h; sourceTree = ""; }; + 7ED95D101AB9029B008C4574 /* CDVAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDVAppDelegate.h; sourceTree = ""; }; + 7ED95D111AB9029B008C4574 /* CDVAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CDVAppDelegate.m; sourceTree = ""; }; + 7ED95D121AB9029B008C4574 /* CDVAvailability.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDVAvailability.h; sourceTree = ""; }; + 7ED95D131AB9029B008C4574 /* CDVAvailabilityDeprecated.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDVAvailabilityDeprecated.h; sourceTree = ""; }; + 7ED95D141AB9029B008C4574 /* CDVCommandDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDVCommandDelegate.h; sourceTree = ""; }; + 7ED95D151AB9029B008C4574 /* CDVCommandDelegateImpl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDVCommandDelegateImpl.h; sourceTree = ""; }; + 7ED95D161AB9029B008C4574 /* CDVCommandDelegateImpl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CDVCommandDelegateImpl.m; sourceTree = ""; }; + 7ED95D171AB9029B008C4574 /* CDVCommandQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDVCommandQueue.h; sourceTree = ""; }; + 7ED95D181AB9029B008C4574 /* CDVCommandQueue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CDVCommandQueue.m; sourceTree = ""; }; + 7ED95D191AB9029B008C4574 /* CDVConfigParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDVConfigParser.h; sourceTree = ""; }; + 7ED95D1A1AB9029B008C4574 /* CDVConfigParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CDVConfigParser.m; sourceTree = ""; }; + 7ED95D1B1AB9029B008C4574 /* CDVInvokedUrlCommand.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDVInvokedUrlCommand.h; sourceTree = ""; }; + 7ED95D1C1AB9029B008C4574 /* CDVInvokedUrlCommand.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CDVInvokedUrlCommand.m; sourceTree = ""; }; + 7ED95D1D1AB9029B008C4574 /* CDVPlugin+Resources.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "CDVPlugin+Resources.h"; sourceTree = ""; }; + 7ED95D1E1AB9029B008C4574 /* CDVPlugin+Resources.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "CDVPlugin+Resources.m"; sourceTree = ""; }; + 7ED95D1F1AB9029B008C4574 /* CDVPlugin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDVPlugin.h; sourceTree = ""; }; + 7ED95D201AB9029B008C4574 /* CDVPlugin.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CDVPlugin.m; sourceTree = ""; }; + 7ED95D211AB9029B008C4574 /* CDVPluginResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDVPluginResult.h; sourceTree = ""; }; + 7ED95D221AB9029B008C4574 /* CDVPluginResult.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CDVPluginResult.m; sourceTree = ""; }; + 7ED95D231AB9029B008C4574 /* CDVScreenOrientationDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDVScreenOrientationDelegate.h; sourceTree = ""; }; + 7ED95D241AB9029B008C4574 /* CDVTimer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDVTimer.h; sourceTree = ""; }; + 7ED95D251AB9029B008C4574 /* CDVTimer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CDVTimer.m; sourceTree = ""; }; + 7ED95D2A1AB9029B008C4574 /* CDVViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDVViewController.h; sourceTree = ""; }; + 7ED95D2B1AB9029B008C4574 /* CDVViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CDVViewController.m; sourceTree = ""; }; + 7ED95D2C1AB9029B008C4574 /* CDVWebViewEngineProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDVWebViewEngineProtocol.h; sourceTree = ""; }; + 7ED95D2D1AB9029B008C4574 /* CDVWhitelist.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDVWhitelist.h; sourceTree = ""; }; + 7ED95D2E1AB9029B008C4574 /* CDVWhitelist.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CDVWhitelist.m; sourceTree = ""; }; + 7ED95D311AB9029B008C4574 /* NSDictionary+CordovaPreferences.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSDictionary+CordovaPreferences.h"; sourceTree = ""; }; + 7ED95D321AB9029B008C4574 /* NSDictionary+CordovaPreferences.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSDictionary+CordovaPreferences.m"; sourceTree = ""; }; + 7ED95D331AB9029B008C4574 /* NSMutableArray+QueueAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSMutableArray+QueueAdditions.h"; sourceTree = ""; }; + 7ED95D341AB9029B008C4574 /* NSMutableArray+QueueAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSMutableArray+QueueAdditions.m"; sourceTree = ""; }; + A3B082D21BB15CEA00D8DC35 /* CDVGestureHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CDVGestureHandler.h; sourceTree = ""; }; + A3B082D31BB15CEA00D8DC35 /* CDVGestureHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CDVGestureHandler.m; sourceTree = ""; }; + AA747D9E0F9514B9006C5449 /* CordovaLib_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CordovaLib_Prefix.pch; sourceTree = SOURCE_ROOT; }; + C0C01EB21E3911D50056E6CB /* Cordova.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Cordova.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + C0C01EB41E3911D50056E6CB /* Cordova.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Cordova.h; sourceTree = ""; }; + C0C01EB51E3911D50056E6CB /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + C0C01EAE1E3911D50056E6CB /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D2AAC07C0554694100DB518D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 034768DFFF38A50411DB9C8B /* Products */ = { + isa = PBXGroup; + children = ( + 68A32D7114102E1C006B237C /* libCordova.a */, + C0C01EB21E3911D50056E6CB /* Cordova.framework */, + ); + name = Products; + sourceTree = ""; + }; + 0867D691FE84028FC02AAC07 = { + isa = PBXGroup; + children = ( + 7ED95D0E1AB9029B008C4574 /* Public */, + 7ED95CF11AB9028C008C4574 /* Private */, + C0C01EB31E3911D50056E6CB /* Cordova */, + 034768DFFF38A50411DB9C8B /* Products */, + ); + sourceTree = ""; + }; + 28BFF9111F355A1D00DDF01A /* CDVLogger */ = { + isa = PBXGroup; + children = ( + 28BFF9121F355A4E00DDF01A /* CDVLogger.h */, + 28BFF9131F355A4E00DDF01A /* CDVLogger.m */, + ); + path = CDVLogger; + sourceTree = ""; + }; + 3093E2201B16D6A3003F381A /* CDVIntentAndNavigationFilter */ = { + isa = PBXGroup; + children = ( + 3093E2211B16D6A3003F381A /* CDVIntentAndNavigationFilter.h */, + 3093E2221B16D6A3003F381A /* CDVIntentAndNavigationFilter.m */, + ); + path = CDVIntentAndNavigationFilter; + sourceTree = ""; + }; + 4E23F8F423E16D30006CD852 /* CDVWebViewEngine */ = { + isa = PBXGroup; + children = ( + 4E23F8FA23E16E96006CD852 /* CDVWebViewEngine.h */, + 4E23F8F823E16E96006CD852 /* CDVWebViewEngine.m */, + 4E23F8F623E16E96006CD852 /* CDVWebViewUIDelegate.h */, + 4E23F8F723E16E96006CD852 /* CDVWebViewUIDelegate.m */, + ); + path = CDVWebViewEngine; + sourceTree = ""; + }; + 4E714D3123F5356700A321AF /* CDVLaunchScreen */ = { + isa = PBXGroup; + children = ( + 4E714D3223F535B500A321AF /* CDVLaunchScreen.h */, + 4E714D3423F535B500A321AF /* CDVLaunchScreen.m */, + ); + path = CDVLaunchScreen; + sourceTree = ""; + }; + 7ED95CF11AB9028C008C4574 /* Private */ = { + isa = PBXGroup; + children = ( + AA747D9E0F9514B9006C5449 /* CordovaLib_Prefix.pch */, + 7ED95CF21AB9028C008C4574 /* CDVDebug.h */, + 7ED95CF31AB9028C008C4574 /* CDVJSON_private.h */, + 7ED95CF41AB9028C008C4574 /* CDVJSON_private.m */, + 7ED95CF51AB9028C008C4574 /* CDVPlugin+Private.h */, + 7ED95CF61AB9028C008C4574 /* Plugins */, + ); + name = Private; + path = Classes/Private; + sourceTree = ""; + }; + 7ED95CF61AB9028C008C4574 /* Plugins */ = { + isa = PBXGroup; + children = ( + 4E714D3123F5356700A321AF /* CDVLaunchScreen */, + 4E23F8F423E16D30006CD852 /* CDVWebViewEngine */, + 28BFF9111F355A1D00DDF01A /* CDVLogger */, + A3B082D11BB15CEA00D8DC35 /* CDVGestureHandler */, + 3093E2201B16D6A3003F381A /* CDVIntentAndNavigationFilter */, + 7ED95CF71AB9028C008C4574 /* CDVHandleOpenURL */, + ); + path = Plugins; + sourceTree = ""; + }; + 7ED95CF71AB9028C008C4574 /* CDVHandleOpenURL */ = { + isa = PBXGroup; + children = ( + 7ED95CF81AB9028C008C4574 /* CDVHandleOpenURL.h */, + 7ED95CF91AB9028C008C4574 /* CDVHandleOpenURL.m */, + ); + path = CDVHandleOpenURL; + sourceTree = ""; + }; + 7ED95D0E1AB9029B008C4574 /* Public */ = { + isa = PBXGroup; + children = ( + 7ED95D0F1AB9029B008C4574 /* CDV.h */, + 7ED95D101AB9029B008C4574 /* CDVAppDelegate.h */, + 7ED95D111AB9029B008C4574 /* CDVAppDelegate.m */, + 7ED95D121AB9029B008C4574 /* CDVAvailability.h */, + 7ED95D131AB9029B008C4574 /* CDVAvailabilityDeprecated.h */, + 7ED95D141AB9029B008C4574 /* CDVCommandDelegate.h */, + 7ED95D151AB9029B008C4574 /* CDVCommandDelegateImpl.h */, + 7ED95D161AB9029B008C4574 /* CDVCommandDelegateImpl.m */, + 7ED95D171AB9029B008C4574 /* CDVCommandQueue.h */, + 7ED95D181AB9029B008C4574 /* CDVCommandQueue.m */, + 7ED95D191AB9029B008C4574 /* CDVConfigParser.h */, + 7ED95D1A1AB9029B008C4574 /* CDVConfigParser.m */, + 7ED95D1B1AB9029B008C4574 /* CDVInvokedUrlCommand.h */, + 7ED95D1C1AB9029B008C4574 /* CDVInvokedUrlCommand.m */, + 7ED95D1D1AB9029B008C4574 /* CDVPlugin+Resources.h */, + 7ED95D1E1AB9029B008C4574 /* CDVPlugin+Resources.m */, + 7ED95D1F1AB9029B008C4574 /* CDVPlugin.h */, + 7ED95D201AB9029B008C4574 /* CDVPlugin.m */, + 7ED95D211AB9029B008C4574 /* CDVPluginResult.h */, + 7ED95D221AB9029B008C4574 /* CDVPluginResult.m */, + 7ED95D231AB9029B008C4574 /* CDVScreenOrientationDelegate.h */, + 7ED95D241AB9029B008C4574 /* CDVTimer.h */, + 7ED95D251AB9029B008C4574 /* CDVTimer.m */, + 7ED95D2A1AB9029B008C4574 /* CDVViewController.h */, + 4E23F8F923E16E96006CD852 /* CDVWebViewProcessPoolFactory.h */, + 4E23F8F523E16E96006CD852 /* CDVWebViewProcessPoolFactory.m */, + 7ED95D2B1AB9029B008C4574 /* CDVViewController.m */, + 7ED95D2C1AB9029B008C4574 /* CDVWebViewEngineProtocol.h */, + 7ED95D2D1AB9029B008C4574 /* CDVWhitelist.h */, + 7ED95D2E1AB9029B008C4574 /* CDVWhitelist.m */, + 7ED95D311AB9029B008C4574 /* NSDictionary+CordovaPreferences.h */, + 7ED95D321AB9029B008C4574 /* NSDictionary+CordovaPreferences.m */, + 7ED95D331AB9029B008C4574 /* NSMutableArray+QueueAdditions.h */, + 7ED95D341AB9029B008C4574 /* NSMutableArray+QueueAdditions.m */, + 2F4D42BA23F218BA00501999 /* CDVURLSchemeHandler.h */, + 2F4D42BB23F218BA00501999 /* CDVURLSchemeHandler.m */, + ); + name = Public; + path = Classes/Public; + sourceTree = ""; + }; + A3B082D11BB15CEA00D8DC35 /* CDVGestureHandler */ = { + isa = PBXGroup; + children = ( + A3B082D21BB15CEA00D8DC35 /* CDVGestureHandler.h */, + A3B082D31BB15CEA00D8DC35 /* CDVGestureHandler.m */, + ); + path = CDVGestureHandler; + sourceTree = ""; + }; + C0C01EB31E3911D50056E6CB /* Cordova */ = { + isa = PBXGroup; + children = ( + C0C01EB41E3911D50056E6CB /* Cordova.h */, + C0C01EB51E3911D50056E6CB /* Info.plist */, + ); + path = Cordova; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + C0C01EAF1E3911D50056E6CB /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + C0C01EB61E3911D50056E6CB /* Cordova.h in Headers */, + C0C01EBB1E39131A0056E6CB /* CDV.h in Headers */, + C0C01EBC1E39131A0056E6CB /* CDVAppDelegate.h in Headers */, + C0C01EBD1E39131A0056E6CB /* CDVAvailability.h in Headers */, + C0C01EBE1E39131A0056E6CB /* CDVAvailabilityDeprecated.h in Headers */, + C0C01EBF1E39131A0056E6CB /* CDVCommandDelegate.h in Headers */, + C0C01EC01E39131A0056E6CB /* CDVCommandDelegateImpl.h in Headers */, + 4F56D839254A2EE40063F1D6 /* CDVWebViewProcessPoolFactory.h in Headers */, + C0C01EC11E39131A0056E6CB /* CDVCommandQueue.h in Headers */, + C0C01EC21E39131A0056E6CB /* CDVConfigParser.h in Headers */, + C0C01EC31E39131A0056E6CB /* CDVInvokedUrlCommand.h in Headers */, + C0C01EC41E39131A0056E6CB /* CDVPlugin+Resources.h in Headers */, + C0C01EC51E39131A0056E6CB /* CDVPlugin.h in Headers */, + C0C01EC61E39131A0056E6CB /* CDVPluginResult.h in Headers */, + C0C01EC71E39131A0056E6CB /* CDVScreenOrientationDelegate.h in Headers */, + 4F56D836254A2EE10063F1D6 /* CDVWebViewEngine.h in Headers */, + C0C01EC81E39131A0056E6CB /* CDVTimer.h in Headers */, + C0C01ECB1E39131A0056E6CB /* CDVViewController.h in Headers */, + C0C01ECC1E39131A0056E6CB /* CDVWebViewEngineProtocol.h in Headers */, + C0C01ECD1E39131A0056E6CB /* CDVWhitelist.h in Headers */, + C0C01ECE1E39131A0056E6CB /* NSDictionary+CordovaPreferences.h in Headers */, + 4E23F90323E17FFA006CD852 /* CDVWebViewUIDelegate.h in Headers */, + C0C01ECF1E39131A0056E6CB /* NSMutableArray+QueueAdditions.h in Headers */, + 9052DE892150D06B008E83D4 /* CDVDebug.h in Headers */, + 9052DE8A2150D06B008E83D4 /* CDVJSON_private.h in Headers */, + 9052DE8B2150D06B008E83D4 /* CDVPlugin+Private.h in Headers */, + 9052DE8C2150D06B008E83D4 /* CDVLogger.h in Headers */, + 9052DE8D2150D06B008E83D4 /* CDVGestureHandler.h in Headers */, + 9052DE8E2150D06B008E83D4 /* CDVIntentAndNavigationFilter.h in Headers */, + 9052DE8F2150D06B008E83D4 /* CDVHandleOpenURL.h in Headers */, + 2FCCEA18247E7366007276A8 /* CDVLaunchScreen.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D2AAC07A0554694100DB518D /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 7ED95D351AB9029B008C4574 /* CDV.h in Headers */, + 7ED95D361AB9029B008C4574 /* CDVAppDelegate.h in Headers */, + 7ED95D381AB9029B008C4574 /* CDVAvailability.h in Headers */, + 7ED95D391AB9029B008C4574 /* CDVAvailabilityDeprecated.h in Headers */, + 7ED95D3A1AB9029B008C4574 /* CDVCommandDelegate.h in Headers */, + 7ED95D3B1AB9029B008C4574 /* CDVCommandDelegateImpl.h in Headers */, + 7ED95D3D1AB9029B008C4574 /* CDVCommandQueue.h in Headers */, + 4E23F8FF23E16E96006CD852 /* CDVWebViewProcessPoolFactory.h in Headers */, + 7ED95D3F1AB9029B008C4574 /* CDVConfigParser.h in Headers */, + 2F4D42BC23F218BA00501999 /* CDVURLSchemeHandler.h in Headers */, + 7ED95D411AB9029B008C4574 /* CDVInvokedUrlCommand.h in Headers */, + 7ED95D431AB9029B008C4574 /* CDVPlugin+Resources.h in Headers */, + 7ED95D451AB9029B008C4574 /* CDVPlugin.h in Headers */, + 7ED95D471AB9029B008C4574 /* CDVPluginResult.h in Headers */, + 7ED95D491AB9029B008C4574 /* CDVScreenOrientationDelegate.h in Headers */, + 4E23F8FC23E16E96006CD852 /* CDVWebViewUIDelegate.h in Headers */, + 7ED95D4A1AB9029B008C4574 /* CDVTimer.h in Headers */, + 7ED95D501AB9029B008C4574 /* CDVViewController.h in Headers */, + 7ED95D521AB9029B008C4574 /* CDVWebViewEngineProtocol.h in Headers */, + 4E23F90023E16E96006CD852 /* CDVWebViewEngine.h in Headers */, + 7ED95D531AB9029B008C4574 /* CDVWhitelist.h in Headers */, + 7ED95D571AB9029B008C4574 /* NSDictionary+CordovaPreferences.h in Headers */, + 7ED95D591AB9029B008C4574 /* NSMutableArray+QueueAdditions.h in Headers */, + 7ED95D021AB9028C008C4574 /* CDVDebug.h in Headers */, + 7ED95D031AB9028C008C4574 /* CDVJSON_private.h in Headers */, + 7ED95D051AB9028C008C4574 /* CDVPlugin+Private.h in Headers */, + 28BFF9141F355A4E00DDF01A /* CDVLogger.h in Headers */, + A3B082D41BB15CEA00D8DC35 /* CDVGestureHandler.h in Headers */, + 3093E2231B16D6A3003F381A /* CDVIntentAndNavigationFilter.h in Headers */, + 7E7F69B91ABA3692007546F4 /* CDVHandleOpenURL.h in Headers */, + 4E714D3623F535B500A321AF /* CDVLaunchScreen.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + C0C01EB11E3911D50056E6CB /* Cordova */ = { + isa = PBXNativeTarget; + buildConfigurationList = C0C01EB91E3911D50056E6CB /* Build configuration list for PBXNativeTarget "Cordova" */; + buildPhases = ( + C0C01EAD1E3911D50056E6CB /* Sources */, + C0C01EAE1E3911D50056E6CB /* Frameworks */, + C0C01EAF1E3911D50056E6CB /* Headers */, + CEDDBB5523948D4C00506451 /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Cordova; + productName = Cordova; + productReference = C0C01EB21E3911D50056E6CB /* Cordova.framework */; + productType = "com.apple.product-type.framework"; + }; + D2AAC07D0554694100DB518D /* CordovaLib */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1DEB921E08733DC00010E9CD /* Build configuration list for PBXNativeTarget "CordovaLib" */; + buildPhases = ( + D2AAC07A0554694100DB518D /* Headers */, + D2AAC07B0554694100DB518D /* Sources */, + D2AAC07C0554694100DB518D /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = CordovaLib; + productName = CordovaLib; + productReference = 68A32D7114102E1C006B237C /* libCordova.a */; + productType = "com.apple.product-type.library.static"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 0867D690FE84028FC02AAC07 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1010; + TargetAttributes = { + C0C01EB11E3911D50056E6CB = { + CreatedOnToolsVersion = 10.1; + ProvisioningStyle = Automatic; + }; + D2AAC07D0554694100DB518D = { + CreatedOnToolsVersion = 10.1; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "CordovaLib" */; + compatibilityVersion = "Xcode 11.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 0867D691FE84028FC02AAC07; + productRefGroup = 034768DFFF38A50411DB9C8B /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + D2AAC07D0554694100DB518D /* CordovaLib */, + C0C01EB11E3911D50056E6CB /* Cordova */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXShellScriptBuildPhase section */ + CEDDBB5523948D4C00506451 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PROJECT_DIR}/../update_podspec.sh\" -s cordova\n"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + C0C01EAD1E3911D50056E6CB /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 9052DE712150D040008E83D4 /* CDVAppDelegate.m in Sources */, + 9052DE722150D040008E83D4 /* CDVCommandDelegateImpl.m in Sources */, + 9052DE732150D040008E83D4 /* CDVCommandQueue.m in Sources */, + 9052DE742150D040008E83D4 /* CDVConfigParser.m in Sources */, + 9052DE752150D040008E83D4 /* CDVInvokedUrlCommand.m in Sources */, + 9052DE762150D040008E83D4 /* CDVPlugin+Resources.m in Sources */, + 9052DE772150D040008E83D4 /* CDVPlugin.m in Sources */, + 9052DE782150D040008E83D4 /* CDVPluginResult.m in Sources */, + 4F56D830254A2ED70063F1D6 /* CDVWebViewUIDelegate.m in Sources */, + 9052DE792150D040008E83D4 /* CDVTimer.m in Sources */, + 4F56D833254A2ED90063F1D6 /* CDVWebViewProcessPoolFactory.m in Sources */, + 4F56D82D254A2EB50063F1D6 /* CDVWebViewEngine.m in Sources */, + 9052DE7C2150D040008E83D4 /* CDVViewController.m in Sources */, + 4F56D83C254A2F2F0063F1D6 /* CDVURLSchemeHandler.m in Sources */, + 9052DE7D2150D040008E83D4 /* CDVWhitelist.m in Sources */, + 9052DE7E2150D040008E83D4 /* NSDictionary+CordovaPreferences.m in Sources */, + 9052DE7F2150D040008E83D4 /* NSMutableArray+QueueAdditions.m in Sources */, + 9052DE802150D040008E83D4 /* CDVJSON_private.m in Sources */, + 9052DE812150D040008E83D4 /* CDVLogger.m in Sources */, + 9052DE822150D040008E83D4 /* CDVGestureHandler.m in Sources */, + 9052DE832150D040008E83D4 /* CDVIntentAndNavigationFilter.m in Sources */, + 9052DE842150D040008E83D4 /* CDVHandleOpenURL.m in Sources */, + 2FCCEA17247E7366007276A8 /* CDVLaunchScreen.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D2AAC07B0554694100DB518D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 7ED95D371AB9029B008C4574 /* CDVAppDelegate.m in Sources */, + 7ED95D3C1AB9029B008C4574 /* CDVCommandDelegateImpl.m in Sources */, + 7ED95D3E1AB9029B008C4574 /* CDVCommandQueue.m in Sources */, + 7ED95D401AB9029B008C4574 /* CDVConfigParser.m in Sources */, + 7ED95D421AB9029B008C4574 /* CDVInvokedUrlCommand.m in Sources */, + 7ED95D441AB9029B008C4574 /* CDVPlugin+Resources.m in Sources */, + 2F4D42BD23F218BA00501999 /* CDVURLSchemeHandler.m in Sources */, + 7ED95D461AB9029B008C4574 /* CDVPlugin.m in Sources */, + 7ED95D481AB9029B008C4574 /* CDVPluginResult.m in Sources */, + 7ED95D4B1AB9029B008C4574 /* CDVTimer.m in Sources */, + 4E23F8FE23E16E96006CD852 /* CDVWebViewEngine.m in Sources */, + 4E23F8FB23E16E96006CD852 /* CDVWebViewProcessPoolFactory.m in Sources */, + 7ED95D511AB9029B008C4574 /* CDVViewController.m in Sources */, + 7ED95D541AB9029B008C4574 /* CDVWhitelist.m in Sources */, + 7ED95D581AB9029B008C4574 /* NSDictionary+CordovaPreferences.m in Sources */, + 7ED95D5A1AB9029B008C4574 /* NSMutableArray+QueueAdditions.m in Sources */, + 7ED95D041AB9028C008C4574 /* CDVJSON_private.m in Sources */, + 4E23F8FD23E16E96006CD852 /* CDVWebViewUIDelegate.m in Sources */, + 28BFF9151F355A4E00DDF01A /* CDVLogger.m in Sources */, + A3B082D51BB15CEA00D8DC35 /* CDVGestureHandler.m in Sources */, + 3093E2241B16D6A3003F381A /* CDVIntentAndNavigationFilter.m in Sources */, + 7ED95D071AB9028C008C4574 /* CDVHandleOpenURL.m in Sources */, + 4E714D3823F535B500A321AF /* CDVLaunchScreen.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 1DEB921F08733DC00010E9CD /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + EXCLUDED_ARCHS = ""; + PUBLIC_HEADERS_FOLDER_PATH = include/Cordova; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_WORKSPACE = NO; + }; + name = Debug; + }; + 1DEB922008733DC00010E9CD /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + EXCLUDED_ARCHS = ""; + PUBLIC_HEADERS_FOLDER_PATH = include/Cordova; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_WORKSPACE = NO; + }; + name = Release; + }; + 1DEB922308733DC00010E9CD /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = 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_DOCUMENTATION_COMMENTS = YES; + 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_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = ""; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = CordovaLib_Prefix.pch; + 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 = 11.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + OTHER_LDFLAGS = "-ObjC"; + PRODUCT_NAME = Cordova; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + }; + name = Debug; + }; + 1DEB922408733DC00010E9CD /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = 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_DOCUMENTATION_COMMENTS = YES; + 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_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = ""; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = CordovaLib_Prefix.pch; + GCC_PREPROCESSOR_DEFINITIONS = "$(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 = 11.0; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + OTHER_LDFLAGS = "-ObjC"; + PRODUCT_NAME = Cordova; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + C0C01EB71E3911D50056E6CB /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + DEFINES_MODULE = YES; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + EXCLUDED_ARCHS = ""; + INFOPLIST_FILE = Cordova/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = org.apache.cordova.Cordova; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_WORKSPACE = NO; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + C0C01EB81E3911D50056E6CB /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + DEFINES_MODULE = YES; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + EXCLUDED_ARCHS = ""; + INFOPLIST_FILE = Cordova/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = org.apache.cordova.Cordova; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_WORKSPACE = NO; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 1DEB921E08733DC00010E9CD /* Build configuration list for PBXNativeTarget "CordovaLib" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1DEB921F08733DC00010E9CD /* Debug */, + 1DEB922008733DC00010E9CD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "CordovaLib" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1DEB922308733DC00010E9CD /* Debug */, + 1DEB922408733DC00010E9CD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + C0C01EB91E3911D50056E6CB /* Build configuration list for PBXNativeTarget "Cordova" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C0C01EB71E3911D50056E6CB /* Debug */, + C0C01EB81E3911D50056E6CB /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 0867D690FE84028FC02AAC07 /* Project object */; +} diff --git a/examples/AlanBasicExample/platforms/ios/CordovaLib/CordovaLib.xcodeproj/xcuserdata/sergeyyuryev.xcuserdatad/xcschemes/xcschememanagement.plist b/examples/AlanBasicExample/platforms/ios/CordovaLib/CordovaLib.xcodeproj/xcuserdata/sergeyyuryev.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..33ba33c --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/CordovaLib/CordovaLib.xcodeproj/xcuserdata/sergeyyuryev.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,19 @@ + + + + + SchemeUserState + + Cordova.xcscheme_^#shared#^_ + + orderHint + 2 + + CordovaLib.xcscheme_^#shared#^_ + + orderHint + 1 + + + + diff --git a/examples/AlanBasicExample/platforms/ios/CordovaLib/CordovaLib_Prefix.pch b/examples/AlanBasicExample/platforms/ios/CordovaLib/CordovaLib_Prefix.pch new file mode 100644 index 0000000..9545580 --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/CordovaLib/CordovaLib_Prefix.pch @@ -0,0 +1,22 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. + */ + +#ifdef __OBJC__ + #import +#endif diff --git a/examples/AlanBasicExample/platforms/ios/CordovaLib/VERSION b/examples/AlanBasicExample/platforms/ios/CordovaLib/VERSION new file mode 100644 index 0000000..6abaeb2 --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/CordovaLib/VERSION @@ -0,0 +1 @@ +6.2.0 diff --git a/examples/AlanBasicExample/platforms/ios/CordovaLib/cordova.js b/examples/AlanBasicExample/platforms/ios/CordovaLib/cordova.js new file mode 100644 index 0000000..37f329f --- /dev/null +++ b/examples/AlanBasicExample/platforms/ios/CordovaLib/cordova.js @@ -0,0 +1,2104 @@ +// Platform: ios +// cordova-js rel/6.0.0-10-g07379820 +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. +*/ +;(function() { +var PLATFORM_VERSION_BUILD_LABEL = '6.2.0'; +// file: src/scripts/require.js +var require; +var define; + +(function () { + var modules = {}; + // Stack of moduleIds currently being built. + var requireStack = []; + // Map of module ID -> index into requireStack of modules currently being built. + var inProgressModules = {}; + var SEPARATOR = '.'; + + function build (module) { + var factory = module.factory; + var localRequire = function (id) { + var resultantId = id; + // Its a relative path, so lop off the last portion and add the id (minus "./") + if (id.charAt(0) === '.') { + resultantId = module.id.slice(0, module.id.lastIndexOf(SEPARATOR)) + SEPARATOR + id.slice(2); + } + return require(resultantId); + }; + module.exports = {}; + delete module.factory; + factory(localRequire, module.exports, module); + return module.exports; + } + + require = function (id) { + if (!modules[id]) { + throw new Error('module ' + id + ' not found'); + } else if (id in inProgressModules) { + var cycle = requireStack.slice(inProgressModules[id]).join('->') + '->' + id; + throw new Error('Cycle in require graph: ' + cycle); + } + if (modules[id].factory) { + try { + inProgressModules[id] = requireStack.length; + requireStack.push(id); + return build(modules[id]); + } finally { + delete inProgressModules[id]; + requireStack.pop(); + } + } + return modules[id].exports; + }; + + define = function (id, factory) { + if (Object.prototype.hasOwnProperty.call(modules, id)) { + throw new Error('module ' + id + ' already defined'); + } + + modules[id] = { + id: id, + factory: factory + }; + }; + + define.remove = function (id) { + delete modules[id]; + }; + + define.moduleMap = modules; +})(); + +// Export for use in node +if (typeof module === 'object' && typeof require === 'function') { + module.exports.require = require; + module.exports.define = define; +} + +// file: src/cordova.js +define("cordova", function(require, exports, module) { + +// Workaround for Windows 10 in hosted environment case +// http://www.w3.org/html/wg/drafts/html/master/browsers.html#named-access-on-the-window-object +if (window.cordova && !(window.cordova instanceof HTMLElement)) { + throw new Error('cordova already defined'); +} + +var channel = require('cordova/channel'); +var platform = require('cordova/platform'); + +/** + * Intercept calls to addEventListener + removeEventListener and handle deviceready, + * resume, and pause events. + */ +var m_document_addEventListener = document.addEventListener; +var m_document_removeEventListener = document.removeEventListener; +var m_window_addEventListener = window.addEventListener; +var m_window_removeEventListener = window.removeEventListener; + +/** + * Houses custom event handlers to intercept on document + window event listeners. + */ +var documentEventHandlers = {}; +var windowEventHandlers = {}; + +document.addEventListener = function (evt, handler, capture) { + var e = evt.toLowerCase(); + if (typeof documentEventHandlers[e] !== 'undefined') { + documentEventHandlers[e].subscribe(handler); + } else { + m_document_addEventListener.call(document, evt, handler, capture); + } +}; + +window.addEventListener = function (evt, handler, capture) { + var e = evt.toLowerCase(); + if (typeof windowEventHandlers[e] !== 'undefined') { + windowEventHandlers[e].subscribe(handler); + } else { + m_window_addEventListener.call(window, evt, handler, capture); + } +}; + +document.removeEventListener = function (evt, handler, capture) { + var e = evt.toLowerCase(); + // If unsubscribing from an event that is handled by a plugin + if (typeof documentEventHandlers[e] !== 'undefined') { + documentEventHandlers[e].unsubscribe(handler); + } else { + m_document_removeEventListener.call(document, evt, handler, capture); + } +}; + +window.removeEventListener = function (evt, handler, capture) { + var e = evt.toLowerCase(); + // If unsubscribing from an event that is handled by a plugin + if (typeof windowEventHandlers[e] !== 'undefined') { + windowEventHandlers[e].unsubscribe(handler); + } else { + m_window_removeEventListener.call(window, evt, handler, capture); + } +}; + +function createEvent (type, data) { + var event = document.createEvent('Events'); + event.initEvent(type, false, false); + if (data) { + for (var i in data) { + if (Object.prototype.hasOwnProperty.call(data, i)) { + event[i] = data[i]; + } + } + } + return event; +} + +var cordova = { + define: define, + require: require, + version: PLATFORM_VERSION_BUILD_LABEL, + platformVersion: PLATFORM_VERSION_BUILD_LABEL, + platformId: platform.id, + + /** + * Methods to add/remove your own addEventListener hijacking on document + window. + */ + addWindowEventHandler: function (event) { + return (windowEventHandlers[event] = channel.create(event)); + }, + addStickyDocumentEventHandler: function (event) { + return (documentEventHandlers[event] = channel.createSticky(event)); + }, + addDocumentEventHandler: function (event) { + return (documentEventHandlers[event] = channel.create(event)); + }, + removeWindowEventHandler: function (event) { + delete windowEventHandlers[event]; + }, + removeDocumentEventHandler: function (event) { + delete documentEventHandlers[event]; + }, + + /** + * Retrieve original event handlers that were replaced by Cordova + * + * @return object + */ + getOriginalHandlers: function () { + return { + document: { + addEventListener: m_document_addEventListener, + removeEventListener: m_document_removeEventListener + }, + window: { + addEventListener: m_window_addEventListener, + removeEventListener: m_window_removeEventListener + } + }; + }, + + /** + * Method to fire event from native code + * bNoDetach is required for events which cause an exception which needs to be caught in native code + */ + fireDocumentEvent: function (type, data, bNoDetach) { + var evt = createEvent(type, data); + if (typeof documentEventHandlers[type] !== 'undefined') { + if (bNoDetach) { + documentEventHandlers[type].fire(evt); + } else { + setTimeout(function () { + // Fire deviceready on listeners that were registered before cordova.js was loaded. + if (type === 'deviceready') { + document.dispatchEvent(evt); + } + documentEventHandlers[type].fire(evt); + }, 0); + } + } else { + document.dispatchEvent(evt); + } + }, + + fireWindowEvent: function (type, data) { + var evt = createEvent(type, data); + if (typeof windowEventHandlers[type] !== 'undefined') { + setTimeout(function () { + windowEventHandlers[type].fire(evt); + }, 0); + } else { + window.dispatchEvent(evt); + } + }, + + /** + * Plugin callback mechanism. + */ + // Randomize the starting callbackId to avoid collisions after refreshing or navigating. + // This way, it's very unlikely that any new callback would get the same callbackId as an old callback. + callbackId: Math.floor(Math.random() * 2000000000), + callbacks: {}, + callbackStatus: { + NO_RESULT: 0, + OK: 1, + CLASS_NOT_FOUND_EXCEPTION: 2, + ILLEGAL_ACCESS_EXCEPTION: 3, + INSTANTIATION_EXCEPTION: 4, + MALFORMED_URL_EXCEPTION: 5, + IO_EXCEPTION: 6, + INVALID_ACTION: 7, + JSON_EXCEPTION: 8, + ERROR: 9 + }, + + /** + * Called by native code when returning successful result from an action. + */ + callbackSuccess: function (callbackId, args) { + cordova.callbackFromNative(callbackId, true, args.status, [args.message], args.keepCallback); + }, + + /** + * Called by native code when returning error result from an action. + */ + callbackError: function (callbackId, args) { + // TODO: Deprecate callbackSuccess and callbackError in favour of callbackFromNative. + // Derive success from status. + cordova.callbackFromNative(callbackId, false, args.status, [args.message], args.keepCallback); + }, + + /** + * Called by native code when returning the result from an action. + */ + callbackFromNative: function (callbackId, isSuccess, status, args, keepCallback) { + try { + var callback = cordova.callbacks[callbackId]; + if (callback) { + if (isSuccess && status === cordova.callbackStatus.OK) { + callback.success && callback.success.apply(null, args); + } else if (!isSuccess) { + callback.fail && callback.fail.apply(null, args); + } + /* + else + Note, this case is intentionally not caught. + this can happen if isSuccess is true, but callbackStatus is NO_RESULT + which is used to remove a callback from the list without calling the callbacks + typically keepCallback is false in this case + */ + // Clear callback if not expecting any more results + if (!keepCallback) { + delete cordova.callbacks[callbackId]; + } + } + } catch (err) { + var msg = 'Error in ' + (isSuccess ? 'Success' : 'Error') + ' callbackId: ' + callbackId + ' : ' + err; + cordova.fireWindowEvent('cordovacallbackerror', { message: msg, error: err }); + throw err; + } + }, + + addConstructor: function (func) { + channel.onCordovaReady.subscribe(function () { + try { + func(); + } catch (e) { + console.log('Failed to run constructor: ' + e); + } + }); + } +}; + +module.exports = cordova; + +}); + +// file: src/common/argscheck.js +define("cordova/argscheck", function(require, exports, module) { + +var utils = require('cordova/utils'); + +var moduleExports = module.exports; + +var typeMap = { + A: 'Array', + D: 'Date', + N: 'Number', + S: 'String', + F: 'Function', + O: 'Object' +}; + +function extractParamName (callee, argIndex) { + return (/\(\s*([^)]*?)\s*\)/).exec(callee)[1].split(/\s*,\s*/)[argIndex]; +} + +/** + * Checks the given arguments' types and throws if they are not as expected. + * + * `spec` is a string where each character stands for the required type of the + * argument at the same position. In other words: the character at `spec[i]` + * specifies the required type for `args[i]`. The characters in `spec` are the + * first letter of the required type's name. The supported types are: + * + * Array, Date, Number, String, Function, Object + * + * Lowercase characters specify arguments that must not be `null` or `undefined` + * while uppercase characters allow those values to be passed. + * + * Finally, `*` can be used to allow any type at the corresponding position. + * + * @example + * function foo (arr, opts) { + * // require `arr` to be an Array and `opts` an Object, null or undefined + * checkArgs('aO', 'my.package.foo', arguments); + * // ... + * } + * @param {String} spec - the type specification for `args` as described above + * @param {String} functionName - full name of the callee. + * Used in the error message + * @param {Array|arguments} args - the arguments to be checked against `spec` + * @param {Function} [opt_callee=args.callee] - the recipient of `args`. + * Used to extract parameter names for the error message + * @throws {TypeError} if args do not satisfy spec + */ +function checkArgs (spec, functionName, args, opt_callee) { + if (!moduleExports.enableChecks) { + return; + } + var errMsg = null; + var typeName; + for (var i = 0; i < spec.length; ++i) { + var c = spec.charAt(i); + var cUpper = c.toUpperCase(); + var arg = args[i]; + // Asterix means allow anything. + if (c === '*') { + continue; + } + typeName = utils.typeName(arg); + if ((arg === null || arg === undefined) && c === cUpper) { + continue; + } + if (typeName !== typeMap[cUpper]) { + errMsg = 'Expected ' + typeMap[cUpper]; + break; + } + } + if (errMsg) { + errMsg += ', but got ' + typeName + '.'; + errMsg = 'Wrong type for parameter "' + extractParamName(opt_callee || args.callee, i) + '" of ' + functionName + ': ' + errMsg; + // Don't log when running unit tests. + if (typeof jasmine === 'undefined') { + console.error(errMsg); + } + throw TypeError(errMsg); + } +} + +function getValue (value, defaultValue) { + return value === undefined ? defaultValue : value; +} + +moduleExports.checkArgs = checkArgs; +moduleExports.getValue = getValue; +moduleExports.enableChecks = true; + +}); + +// file: src/common/base64.js +define("cordova/base64", function(require, exports, module) { + +var base64 = exports; + +base64.fromArrayBuffer = function (arrayBuffer) { + var array = new Uint8Array(arrayBuffer); + return uint8ToBase64(array); +}; + +base64.toArrayBuffer = function (str) { + var decodedStr = atob(str); + var arrayBuffer = new ArrayBuffer(decodedStr.length); + var array = new Uint8Array(arrayBuffer); + for (var i = 0, len = decodedStr.length; i < len; i++) { + array[i] = decodedStr.charCodeAt(i); + } + return arrayBuffer; +}; + +// ------------------------------------------------------------------------------ + +/* This code is based on the performance tests at http://jsperf.com/b64tests + * This 12-bit-at-a-time algorithm was the best performing version on all + * platforms tested. + */ + +var b64_6bit = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; +var b64_12bit; + +var b64_12bitTable = function () { + b64_12bit = []; + for (var i = 0; i < 64; i++) { + for (var j = 0; j < 64; j++) { + b64_12bit[i * 64 + j] = b64_6bit[i] + b64_6bit[j]; + } + } + b64_12bitTable = function () { return b64_12bit; }; + return b64_12bit; +}; + +function uint8ToBase64 (rawData) { + var numBytes = rawData.byteLength; + var output = ''; + var segment; + var table = b64_12bitTable(); + for (var i = 0; i < numBytes - 2; i += 3) { + segment = (rawData[i] << 16) + (rawData[i + 1] << 8) + rawData[i + 2]; + output += table[segment >> 12]; + output += table[segment & 0xfff]; + } + if (numBytes - i === 2) { + segment = (rawData[i] << 16) + (rawData[i + 1] << 8); + output += table[segment >> 12]; + output += b64_6bit[(segment & 0xfff) >> 6]; + output += '='; + } else if (numBytes - i === 1) { + segment = (rawData[i] << 16); + output += table[segment >> 12]; + output += '=='; + } + return output; +} + +}); + +// file: src/common/builder.js +define("cordova/builder", function(require, exports, module) { + +var utils = require('cordova/utils'); + +function each (objects, func, context) { + for (var prop in objects) { + if (Object.prototype.hasOwnProperty.call(objects, prop)) { + func.apply(context, [objects[prop], prop]); + } + } +} + +function clobber (obj, key, value) { + var needsProperty = false; + try { + obj[key] = value; + } catch (e) { + needsProperty = true; + } + // Getters can only be overridden by getters. + if (needsProperty || obj[key] !== value) { + utils.defineGetter(obj, key, function () { + return value; + }); + } +} + +function assignOrWrapInDeprecateGetter (obj, key, value, message) { + if (message) { + utils.defineGetter(obj, key, function () { + console.log(message); + delete obj[key]; + clobber(obj, key, value); + return value; + }); + } else { + clobber(obj, key, value); + } +} + +function include (parent, objects, clobber, merge) { + each(objects, function (obj, key) { + try { + var result = obj.path ? require(obj.path) : {}; + + if (clobber) { + // Clobber if it doesn't exist. + if (typeof parent[key] === 'undefined') { + assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated); + } else if (typeof obj.path !== 'undefined') { + // If merging, merge properties onto parent, otherwise, clobber. + if (merge) { + recursiveMerge(parent[key], result); + } else { + assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated); + } + } + result = parent[key]; + } else { + // Overwrite if not currently defined. + if (typeof parent[key] === 'undefined') { + assignOrWrapInDeprecateGetter(parent, key, result, obj.deprecated); + } else { + // Set result to what already exists, so we can build children into it if they exist. + result = parent[key]; + } + } + + if (obj.children) { + include(result, obj.children, clobber, merge); + } + } catch (e) { + utils.alert('Exception building Cordova JS globals: ' + e + ' for key "' + key + '"'); + } + }); +} + +/** + * Merge properties from one object onto another recursively. Properties from + * the src object will overwrite existing target property. + * + * @param target Object to merge properties into. + * @param src Object to merge properties from. + */ +function recursiveMerge (target, src) { + for (var prop in src) { + if (Object.prototype.hasOwnProperty.call(src, prop)) { + if (target.prototype && target.prototype.constructor === target) { + // If the target object is a constructor override off prototype. + clobber(target.prototype, prop, src[prop]); + } else { + if (typeof src[prop] === 'object' && typeof target[prop] === 'object') { + recursiveMerge(target[prop], src[prop]); + } else { + clobber(target, prop, src[prop]); + } + } + } + } +} + +exports.buildIntoButDoNotClobber = function (objects, target) { + include(target, objects, false, false); +}; +exports.buildIntoAndClobber = function (objects, target) { + include(target, objects, true, false); +}; +exports.buildIntoAndMerge = function (objects, target) { + include(target, objects, true, true); +}; +exports.recursiveMerge = recursiveMerge; +exports.assignOrWrapInDeprecateGetter = assignOrWrapInDeprecateGetter; + +}); + +// file: src/common/channel.js +define("cordova/channel", function(require, exports, module) { + +var utils = require('cordova/utils'); +var nextGuid = 1; + +/** + * Custom pub-sub "channel" that can have functions subscribed to it + * This object is used to define and control firing of events for + * cordova initialization, as well as for custom events thereafter. + * + * The order of events during page load and Cordova startup is as follows: + * + * onDOMContentLoaded* Internal event that is received when the web page is loaded and parsed. + * onNativeReady* Internal event that indicates the Cordova native side is ready. + * onCordovaReady* Internal event fired when all Cordova JavaScript objects have been created. + * onDeviceReady* User event fired to indicate that Cordova is ready + * onResume User event fired to indicate a start/resume lifecycle event + * onPause User event fired to indicate a pause lifecycle event + * + * The events marked with an * are sticky. Once they have fired, they will stay in the fired state. + * All listeners that subscribe after the event is fired will be executed right away. + * + * The only Cordova events that user code should register for are: + * deviceready Cordova native code is initialized and Cordova APIs can be called from JavaScript + * pause App has moved to background + * resume App has returned to foreground + * + * Listeners can be registered as: + * document.addEventListener("deviceready", myDeviceReadyListener, false); + * document.addEventListener("resume", myResumeListener, false); + * document.addEventListener("pause", myPauseListener, false); + * + * The DOM lifecycle events should be used for saving and restoring state + * window.onload + * window.onunload + * + */ + +/** + * Channel + * @constructor + * @param type String the channel name + */ +var Channel = function (type, sticky) { + this.type = type; + // Map of guid -> function. + this.handlers = {}; + // 0 = Non-sticky, 1 = Sticky non-fired, 2 = Sticky fired. + this.state = sticky ? 1 : 0; + // Used in sticky mode to remember args passed to fire(). + this.fireArgs = null; + // Used by onHasSubscribersChange to know if there are any listeners. + this.numHandlers = 0; + // Function that is called when the first listener is subscribed, or when + // the last listener is unsubscribed. + this.onHasSubscribersChange = null; +}; +var channel = { + /** + * Calls the provided function only after all of the channels specified + * have been fired. All channels must be sticky channels. + */ + join: function (h, c) { + var len = c.length; + var i = len; + var f = function () { + if (!(--i)) h(); + }; + for (var j = 0; j < len; j++) { + if (c[j].state === 0) { + throw Error('Can only use join with sticky channels.'); + } + c[j].subscribe(f); + } + if (!len) h(); + }, + + create: function (type) { + return (channel[type] = new Channel(type, false)); + }, + createSticky: function (type) { + return (channel[type] = new Channel(type, true)); + }, + + /** + * cordova Channels that must fire before "deviceready" is fired. + */ + deviceReadyChannelsArray: [], + deviceReadyChannelsMap: {}, + + /** + * Indicate that a feature needs to be initialized before it is ready to be used. + * This holds up Cordova's "deviceready" event until the feature has been initialized + * and Cordova.initComplete(feature) is called. + * + * @param feature {String} The unique feature name + */ + waitForInitialization: function (feature) { + if (feature) { + var c = channel[feature] || this.createSticky(feature); + this.deviceReadyChannelsMap[feature] = c; + this.deviceReadyChannelsArray.push(c); + } + }, + + /** + * Indicate that initialization code has completed and the feature is ready to be used. + * + * @param feature {String} The unique feature name + */ + initializationComplete: function (feature) { + var c = this.deviceReadyChannelsMap[feature]; + if (c) { + c.fire(); + } + } +}; + +function checkSubscriptionArgument (argument) { + if (typeof argument !== 'function' && typeof argument.handleEvent !== 'function') { + throw new Error( + 'Must provide a function or an EventListener object ' + + 'implementing the handleEvent interface.' + ); + } +} + +/** + * Subscribes the given function to the channel. Any time that + * Channel.fire is called so too will the function. + * Optionally specify an execution context for the function + * and a guid that can be used to stop subscribing to the channel. + * Returns the guid. + */ +Channel.prototype.subscribe = function (eventListenerOrFunction, eventListener) { + checkSubscriptionArgument(eventListenerOrFunction); + var handleEvent, guid; + + if (eventListenerOrFunction && typeof eventListenerOrFunction === 'object') { + // Received an EventListener object implementing the handleEvent interface + handleEvent = eventListenerOrFunction.handleEvent; + eventListener = eventListenerOrFunction; + } else { + // Received a function to handle event + handleEvent = eventListenerOrFunction; + } + + if (this.state === 2) { + handleEvent.apply(eventListener || this, this.fireArgs); + return; + } + + guid = eventListenerOrFunction.observer_guid; + if (typeof eventListener === 'object') { + handleEvent = utils.close(eventListener, handleEvent); + } + + if (!guid) { + // First time any channel has seen this subscriber + guid = '' + nextGuid++; + } + handleEvent.observer_guid = guid; + eventListenerOrFunction.observer_guid = guid; + + // Don't add the same handler more than once. + if (!this.handlers[guid]) { + this.handlers[guid] = handleEvent; + this.numHandlers++; + if (this.numHandlers === 1) { + this.onHasSubscribersChange && this.onHasSubscribersChange(); + } + } +}; + +/** + * Unsubscribes the function with the given guid from the channel. + */ +Channel.prototype.unsubscribe = function (eventListenerOrFunction) { + checkSubscriptionArgument(eventListenerOrFunction); + var handleEvent, guid, handler; + + if (eventListenerOrFunction && typeof eventListenerOrFunction === 'object') { + // Received an EventListener object implementing the handleEvent interface + handleEvent = eventListenerOrFunction.handleEvent; + } else { + // Received a function to handle event + handleEvent = eventListenerOrFunction; + } + + guid = handleEvent.observer_guid; + handler = this.handlers[guid]; + if (handler) { + delete this.handlers[guid]; + this.numHandlers--; + if (this.numHandlers === 0) { + this.onHasSubscribersChange && this.onHasSubscribersChange(); + } + } +}; + +/** + * Calls all functions subscribed to this channel. + */ +Channel.prototype.fire = function (e) { + var fireArgs = Array.prototype.slice.call(arguments); + // Apply stickiness. + if (this.state === 1) { + this.state = 2; + this.fireArgs = fireArgs; + } + if (this.numHandlers) { + // Copy the values first so that it is safe to modify it from within + // callbacks. + var toCall = []; + for (var item in this.handlers) { + toCall.push(this.handlers[item]); + } + for (var i = 0; i < toCall.length; ++i) { + toCall[i].apply(this, fireArgs); + } + if (this.state === 2 && this.numHandlers) { + this.numHandlers = 0; + this.handlers = {}; + this.onHasSubscribersChange && this.onHasSubscribersChange(); + } + } +}; + +// defining them here so they are ready super fast! +// DOM event that is received when the web page is loaded and parsed. +channel.createSticky('onDOMContentLoaded'); + +// Event to indicate the Cordova native side is ready. +channel.createSticky('onNativeReady'); + +// Event to indicate that all Cordova JavaScript objects have been created +// and it's time to run plugin constructors. +channel.createSticky('onCordovaReady'); + +// Event to indicate that all automatically loaded JS plugins are loaded and ready. +// FIXME remove this +channel.createSticky('onPluginsReady'); + +// Event to indicate that Cordova is ready +channel.createSticky('onDeviceReady'); + +// Event to indicate a resume lifecycle event +channel.create('onResume'); + +// Event to indicate a pause lifecycle event +channel.create('onPause'); + +// Channels that must fire before "deviceready" is fired. +channel.waitForInitialization('onCordovaReady'); +channel.waitForInitialization('onDOMContentLoaded'); + +module.exports = channel; + +}); + +// file: ../cordova-ios/cordova-js-src/exec.js +define("cordova/exec", function(require, exports, module) { + +/** + * Creates the exec bridge used to notify the native code of + * commands. + */ +var cordova = require('cordova'); +var utils = require('cordova/utils'); +var base64 = require('cordova/base64'); + +function massageArgsJsToNative (args) { + if (!args || utils.typeName(args) !== 'Array') { + return args; + } + var ret = []; + args.forEach(function (arg, i) { + if (utils.typeName(arg) === 'ArrayBuffer') { + ret.push({ + CDVType: 'ArrayBuffer', + data: base64.fromArrayBuffer(arg) + }); + } else { + ret.push(arg); + } + }); + return ret; +} + +function massageMessageNativeToJs (message) { + if (message.CDVType === 'ArrayBuffer') { + var stringToArrayBuffer = function (str) { + var ret = new Uint8Array(str.length); + for (var i = 0; i < str.length; i++) { + ret[i] = str.charCodeAt(i); + } + return ret.buffer; + }; + var base64ToArrayBuffer = function (b64) { + return stringToArrayBuffer(atob(b64)); // eslint-disable-line no-undef + }; + message = base64ToArrayBuffer(message.data); + } + return message; +} + +function convertMessageToArgsNativeToJs (message) { + var args = []; + if (!message || !Object.prototype.hasOwnProperty.call(message, 'CDVType')) { + args.push(message); + } else if (message.CDVType === 'MultiPart') { + message.messages.forEach(function (e) { + args.push(massageMessageNativeToJs(e)); + }); + } else { + args.push(massageMessageNativeToJs(message)); + } + return args; +} + +var iOSExec = function () { + var successCallback, failCallback, service, action, actionArgs; + var callbackId = null; + if (typeof arguments[0] !== 'string') { + // FORMAT ONE + successCallback = arguments[0]; + failCallback = arguments[1]; + service = arguments[2]; + action = arguments[3]; + actionArgs = arguments[4]; + + // Since we need to maintain backwards compatibility, we have to pass + // an invalid callbackId even if no callback was provided since plugins + // will be expecting it. The Cordova.exec() implementation allocates + // an invalid callbackId and passes it even if no callbacks were given. + callbackId = 'INVALID'; + } else { + throw new Error('The old format of this exec call has been removed (deprecated since 2.1). Change to: ' + // eslint-disable-line + 'cordova.exec(null, null, \'Service\', \'action\', [ arg1, arg2 ]);'); + } + + // If actionArgs is not provided, default to an empty array + actionArgs = actionArgs || []; + + // Register the callbacks and add the callbackId to the positional + // arguments if given. + if (successCallback || failCallback) { + callbackId = service + cordova.callbackId++; + cordova.callbacks[callbackId] = + { success: successCallback, fail: failCallback }; + } + + actionArgs = massageArgsJsToNative(actionArgs); + + // CB-10133 DataClone DOM Exception 25 guard (fast function remover) + var command = [callbackId, service, action, JSON.parse(JSON.stringify(actionArgs))]; + window.webkit.messageHandlers.cordova.postMessage(command); +}; + +iOSExec.nativeCallback = function (callbackId, status, message, keepCallback, debug) { + var success = status === 0 || status === 1; + var args = convertMessageToArgsNativeToJs(message); + Promise.resolve().then(function () { + cordova.callbackFromNative(callbackId, success, status, args, keepCallback); // eslint-disable-line + }); +}; + +// for backwards compatibility +iOSExec.nativeEvalAndFetch = function (func) { + try { + func(); + } catch (e) { + console.log(e); + } +}; + +// Proxy the exec for bridge changes. See CB-10106 + +function cordovaExec () { + var cexec = require('cordova/exec'); + var cexec_valid = (typeof cexec.nativeFetchMessages === 'function') && (typeof cexec.nativeEvalAndFetch === 'function') && (typeof cexec.nativeCallback === 'function'); + return (cexec_valid && execProxy !== cexec) ? cexec : iOSExec; +} + +function execProxy () { + cordovaExec().apply(null, arguments); +} + +execProxy.nativeFetchMessages = function () { + return cordovaExec().nativeFetchMessages.apply(null, arguments); +}; + +execProxy.nativeEvalAndFetch = function () { + return cordovaExec().nativeEvalAndFetch.apply(null, arguments); +}; + +execProxy.nativeCallback = function () { + return cordovaExec().nativeCallback.apply(null, arguments); +}; + +module.exports = execProxy; + +}); + +// file: src/common/exec/proxy.js +define("cordova/exec/proxy", function(require, exports, module) { + +// internal map of proxy function +var CommandProxyMap = {}; + +module.exports = { + + // example: cordova.commandProxy.add("Accelerometer",{getCurrentAcceleration: function(successCallback, errorCallback, options) {...},...); + add: function (id, proxyObj) { + console.log('adding proxy for ' + id); + CommandProxyMap[id] = proxyObj; + return proxyObj; + }, + + // cordova.commandProxy.remove("Accelerometer"); + remove: function (id) { + var proxy = CommandProxyMap[id]; + delete CommandProxyMap[id]; + CommandProxyMap[id] = null; + return proxy; + }, + + get: function (service, action) { + return (CommandProxyMap[service] ? CommandProxyMap[service][action] : null); + } +}; + +}); + +// file: src/common/init.js +define("cordova/init", function(require, exports, module) { + +var channel = require('cordova/channel'); +var cordova = require('cordova'); +var modulemapper = require('cordova/modulemapper'); +var platform = require('cordova/platform'); +var pluginloader = require('cordova/pluginloader'); + +var platformInitChannelsArray = [channel.onNativeReady, channel.onPluginsReady]; + +function logUnfiredChannels (arr) { + for (var i = 0; i < arr.length; ++i) { + if (arr[i].state !== 2) { + console.log('Channel not fired: ' + arr[i].type); + } + } +} + +window.setTimeout(function () { + if (channel.onDeviceReady.state !== 2) { + console.log('deviceready has not fired after 5 seconds.'); + logUnfiredChannels(platformInitChannelsArray); + logUnfiredChannels(channel.deviceReadyChannelsArray); + } +}, 5000); + +if (!window.console) { + window.console = { + log: function () {} + }; +} +if (!window.console.warn) { + window.console.warn = function (msg) { + this.log('warn: ' + msg); + }; +} + +// Register pause, resume and deviceready channels as events on document. +channel.onPause = cordova.addDocumentEventHandler('pause'); +channel.onResume = cordova.addDocumentEventHandler('resume'); +channel.onActivated = cordova.addDocumentEventHandler('activated'); +channel.onDeviceReady = cordova.addStickyDocumentEventHandler('deviceready'); + +// Listen for DOMContentLoaded and notify our channel subscribers. +if (document.readyState === 'complete' || document.readyState === 'interactive') { + channel.onDOMContentLoaded.fire(); +} else { + document.addEventListener('DOMContentLoaded', function () { + channel.onDOMContentLoaded.fire(); + }, false); +} + +// _nativeReady is global variable that the native side can set +// to signify that the native code is ready. It is a global since +// it may be called before any cordova JS is ready. +if (window._nativeReady) { + channel.onNativeReady.fire(); +} + +modulemapper.clobbers('cordova', 'cordova'); +modulemapper.clobbers('cordova/exec', 'cordova.exec'); +modulemapper.clobbers('cordova/exec', 'Cordova.exec'); + +// Call the platform-specific initialization. +platform.bootstrap && platform.bootstrap(); + +// Wrap in a setTimeout to support the use-case of having plugin JS appended to cordova.js. +// The delay allows the attached modules to be defined before the plugin loader looks for them. +setTimeout(function () { + pluginloader.load(function () { + channel.onPluginsReady.fire(); + }); +}, 0); + +/** + * Create all cordova objects once native side is ready. + */ +channel.join(function () { + modulemapper.mapModules(window); + + platform.initialize && platform.initialize(); + + // Fire event to notify that all objects are created + channel.onCordovaReady.fire(); + + // Fire onDeviceReady event once page has fully loaded, all + // constructors have run and cordova info has been received from native + // side. + channel.join(function () { + require('cordova').fireDocumentEvent('deviceready'); + }, channel.deviceReadyChannelsArray); +}, platformInitChannelsArray); + +}); + +// file: src/common/modulemapper.js +define("cordova/modulemapper", function(require, exports, module) { + +var builder = require('cordova/builder'); +var moduleMap = define.moduleMap; +var symbolList; +var deprecationMap; + +exports.reset = function () { + symbolList = []; + deprecationMap = {}; +}; + +function addEntry (strategy, moduleName, symbolPath, opt_deprecationMessage) { + if (!(moduleName in moduleMap)) { + throw new Error('Module ' + moduleName + ' does not exist.'); + } + symbolList.push(strategy, moduleName, symbolPath); + if (opt_deprecationMessage) { + deprecationMap[symbolPath] = opt_deprecationMessage; + } +} + +// Note: Android 2.3 does have Function.bind(). +exports.clobbers = function (moduleName, symbolPath, opt_deprecationMessage) { + addEntry('c', moduleName, symbolPath, opt_deprecationMessage); +}; + +exports.merges = function (moduleName, symbolPath, opt_deprecationMessage) { + addEntry('m', moduleName, symbolPath, opt_deprecationMessage); +}; + +exports.defaults = function (moduleName, symbolPath, opt_deprecationMessage) { + addEntry('d', moduleName, symbolPath, opt_deprecationMessage); +}; + +exports.runs = function (moduleName) { + addEntry('r', moduleName, null); +}; + +function prepareNamespace (symbolPath, context) { + if (!symbolPath) { + return context; + } + return symbolPath.split('.').reduce(function (cur, part) { + return (cur[part] = cur[part] || {}); + }, context); +} + +exports.mapModules = function (context) { + var origSymbols = {}; + context.CDV_origSymbols = origSymbols; + for (var i = 0, len = symbolList.length; i < len; i += 3) { + var strategy = symbolList[i]; + var moduleName = symbolList[i + 1]; + var module = require(moduleName); + // + if (strategy === 'r') { + continue; + } + var symbolPath = symbolList[i + 2]; + var lastDot = symbolPath.lastIndexOf('.'); + var namespace = symbolPath.substr(0, lastDot); + var lastName = symbolPath.substr(lastDot + 1); + + var deprecationMsg = symbolPath in deprecationMap ? 'Access made to deprecated symbol: ' + symbolPath + '. ' + deprecationMsg : null; + var parentObj = prepareNamespace(namespace, context); + var target = parentObj[lastName]; + + if (strategy === 'm' && target) { + builder.recursiveMerge(target, module); + } else if ((strategy === 'd' && !target) || (strategy !== 'd')) { + if (!(symbolPath in origSymbols)) { + origSymbols[symbolPath] = target; + } + builder.assignOrWrapInDeprecateGetter(parentObj, lastName, module, deprecationMsg); + } + } +}; + +exports.getOriginalSymbol = function (context, symbolPath) { + var origSymbols = context.CDV_origSymbols; + if (origSymbols && (symbolPath in origSymbols)) { + return origSymbols[symbolPath]; + } + var parts = symbolPath.split('.'); + var obj = context; + for (var i = 0; i < parts.length; ++i) { + obj = obj && obj[parts[i]]; + } + return obj; +}; + +exports.reset(); + +}); + +// file: ../cordova-ios/cordova-js-src/platform.js +define("cordova/platform", function(require, exports, module) { + +module.exports = { + id: 'ios', + bootstrap: function () { + // Attach the console polyfill that is iOS-only to window.console + // see the file under plugin/ios/console.js + require('cordova/modulemapper').clobbers('cordova/plugin/ios/console', 'window.console'); + + // Attach the wkwebkit utility to window.WkWebView + // see the file under plugin/ios/wkwebkit.js + require('cordova/modulemapper').clobbers('cordova/plugin/ios/wkwebkit', 'window.WkWebView'); + + // Attach the splashscreen utility to window.navigator.splashscreen + // see the file under plugin/ios/launchscreen.js + require('cordova/modulemapper').clobbers('cordova/plugin/ios/launchscreen', 'navigator.splashscreen'); + + require('cordova/channel').onNativeReady.fire(); + } +}; + +}); + +// file: ../cordova-ios/cordova-js-src/plugin/ios/console.js +define("cordova/plugin/ios/console", function(require, exports, module) { + +// ------------------------------------------------------------------------------ + +var logger = require('cordova/plugin/ios/logger'); + +// ------------------------------------------------------------------------------ +// object that we're exporting +// ------------------------------------------------------------------------------ +var console = module.exports; + +// ------------------------------------------------------------------------------ +// copy of the original console object +// ------------------------------------------------------------------------------ +var WinConsole = window.console; + +// ------------------------------------------------------------------------------ +// whether to use the logger +// ------------------------------------------------------------------------------ +var UseLogger = false; + +// ------------------------------------------------------------------------------ +// Timers +// ------------------------------------------------------------------------------ +var Timers = {}; + +// ------------------------------------------------------------------------------ +// used for unimplemented methods +// ------------------------------------------------------------------------------ +function noop () {} + +// ------------------------------------------------------------------------------ +// used for unimplemented methods +// ------------------------------------------------------------------------------ +console.useLogger = function (value) { + if (arguments.length) UseLogger = !!value; + + if (UseLogger) { + if (logger.useConsole()) { + throw new Error('console and logger are too intertwingly'); + } + } + + return UseLogger; +}; + +// ------------------------------------------------------------------------------ +console.log = function () { + if (logger.useConsole()) return; + logger.log.apply(logger, [].slice.call(arguments)); +}; + +// ------------------------------------------------------------------------------ +console.error = function () { + if (logger.useConsole()) return; + logger.error.apply(logger, [].slice.call(arguments)); +}; + +// ------------------------------------------------------------------------------ +console.warn = function () { + if (logger.useConsole()) return; + logger.warn.apply(logger, [].slice.call(arguments)); +}; + +// ------------------------------------------------------------------------------ +console.info = function () { + if (logger.useConsole()) return; + logger.info.apply(logger, [].slice.call(arguments)); +}; + +// ------------------------------------------------------------------------------ +console.debug = function () { + if (logger.useConsole()) return; + logger.debug.apply(logger, [].slice.call(arguments)); +}; + +// ------------------------------------------------------------------------------ +console.assert = function (expression) { + if (expression) return; + + var message = logger.format.apply(logger.format, [].slice.call(arguments, 1)); + console.log('ASSERT: ' + message); +}; + +// ------------------------------------------------------------------------------ +console.clear = function () {}; + +// ------------------------------------------------------------------------------ +console.dir = function (object) { + console.log('%o', object); +}; + +// ------------------------------------------------------------------------------ +console.dirxml = function (node) { + console.log(node.innerHTML); +}; + +// ------------------------------------------------------------------------------ +console.trace = noop; + +// ------------------------------------------------------------------------------ +console.group = console.log; + +// ------------------------------------------------------------------------------ +console.groupCollapsed = console.log; + +// ------------------------------------------------------------------------------ +console.groupEnd = noop; + +// ------------------------------------------------------------------------------ +console.time = function (name) { + Timers[name] = new Date().valueOf(); +}; + +// ------------------------------------------------------------------------------ +console.timeEnd = function (name) { + var timeStart = Timers[name]; + if (!timeStart) { + console.warn('unknown timer: ' + name); + return; + } + + var timeElapsed = new Date().valueOf() - timeStart; + console.log(name + ': ' + timeElapsed + 'ms'); +}; + +// ------------------------------------------------------------------------------ +console.timeStamp = noop; + +// ------------------------------------------------------------------------------ +console.profile = noop; + +// ------------------------------------------------------------------------------ +console.profileEnd = noop; + +// ------------------------------------------------------------------------------ +console.count = noop; + +// ------------------------------------------------------------------------------ +console.exception = console.log; + +// ------------------------------------------------------------------------------ +console.table = function (data, columns) { + console.log('%o', data); +}; + +// ------------------------------------------------------------------------------ +// return a new function that calls both functions passed as args +// ------------------------------------------------------------------------------ +function wrappedOrigCall (orgFunc, newFunc) { + return function () { + var args = [].slice.call(arguments); + try { orgFunc.apply(WinConsole, args); } catch (e) {} + try { newFunc.apply(console, args); } catch (e) {} + }; +} + +// ------------------------------------------------------------------------------ +// For every function that exists in the original console object, that +// also exists in the new console object, wrap the new console method +// with one that calls both +// ------------------------------------------------------------------------------ +for (var key in console) { + if (typeof WinConsole[key] === 'function') { + console[key] = wrappedOrigCall(WinConsole[key], console[key]); + } +} + +}); + +// file: ../cordova-ios/cordova-js-src/plugin/ios/launchscreen.js +define("cordova/plugin/ios/launchscreen", function(require, exports, module) { + +var exec = require('cordova/exec'); + +var launchscreen = { + show: function () { + exec(null, null, 'LaunchScreen', 'show', []); + }, + hide: function () { + exec(null, null, 'LaunchScreen', 'hide', []); + } +}; + +module.exports = launchscreen; + +}); + +// file: ../cordova-ios/cordova-js-src/plugin/ios/logger.js +define("cordova/plugin/ios/logger", function(require, exports, module) { + +// ------------------------------------------------------------------------------ +// The logger module exports the following properties/functions: +// +// LOG - constant for the level LOG +// ERROR - constant for the level ERROR +// WARN - constant for the level WARN +// INFO - constant for the level INFO +// DEBUG - constant for the level DEBUG +// logLevel() - returns current log level +// logLevel(value) - sets and returns a new log level +// useConsole() - returns whether logger is using console +// useConsole(value) - sets and returns whether logger is using console +// log(message,...) - logs a message at level LOG +// error(message,...) - logs a message at level ERROR +// warn(message,...) - logs a message at level WARN +// info(message,...) - logs a message at level INFO +// debug(message,...) - logs a message at level DEBUG +// logLevel(level,message,...) - logs a message specified level +// +// ------------------------------------------------------------------------------ + +var logger = exports; + +var exec = require('cordova/exec'); + +var UseConsole = false; +var UseLogger = true; +var Queued = []; +var DeviceReady = false; +var CurrentLevel; + +var originalConsole = console; + +/** + * Logging levels + */ + +var Levels = [ + 'LOG', + 'ERROR', + 'WARN', + 'INFO', + 'DEBUG' +]; + +/* + * add the logging levels to the logger object and + * to a separate levelsMap object for testing + */ + +var LevelsMap = {}; +for (var i = 0; i < Levels.length; i++) { + var level = Levels[i]; + LevelsMap[level] = i; + logger[level] = level; +} + +CurrentLevel = LevelsMap.WARN; + +/** + * Getter/Setter for the logging level + * + * Returns the current logging level. + * + * When a value is passed, sets the logging level to that value. + * The values should be one of the following constants: + * logger.LOG + * logger.ERROR + * logger.WARN + * logger.INFO + * logger.DEBUG + * + * The value used determines which messages get printed. The logging + * values above are in order, and only messages logged at the logging + * level or above will actually be displayed to the user. E.g., the + * default level is WARN, so only messages logged with LOG, ERROR, or + * WARN will be displayed; INFO and DEBUG messages will be ignored. + */ +logger.level = function (value) { + if (arguments.length) { + if (LevelsMap[value] === null) { + throw new Error('invalid logging level: ' + value); + } + CurrentLevel = LevelsMap[value]; + } + + return Levels[CurrentLevel]; +}; + +/** + * Getter/Setter for the useConsole functionality + * + * When useConsole is true, the logger will log via the + * browser 'console' object. + */ +logger.useConsole = function (value) { + if (arguments.length) UseConsole = !!value; + + if (UseConsole) { + if (typeof console === 'undefined') { + throw new Error('global console object is not defined'); + } + + if (typeof console.log !== 'function') { + throw new Error('global console object does not have a log function'); + } + + if (typeof console.useLogger === 'function') { + if (console.useLogger()) { + throw new Error('console and logger are too intertwingly'); + } + } + } + + return UseConsole; +}; + +/** + * Getter/Setter for the useLogger functionality + * + * When useLogger is true, the logger will log via the + * native Logger plugin. + */ +logger.useLogger = function (value) { + // Enforce boolean + if (arguments.length) UseLogger = !!value; + return UseLogger; +}; + +/** + * Logs a message at the LOG level. + * + * Parameters passed after message are used applied to + * the message with utils.format() + */ +logger.log = function (message) { logWithArgs('LOG', arguments); }; + +/** + * Logs a message at the ERROR level. + * + * Parameters passed after message are used applied to + * the message with utils.format() + */ +logger.error = function (message) { logWithArgs('ERROR', arguments); }; + +/** + * Logs a message at the WARN level. + * + * Parameters passed after message are used applied to + * the message with utils.format() + */ +logger.warn = function (message) { logWithArgs('WARN', arguments); }; + +/** + * Logs a message at the INFO level. + * + * Parameters passed after message are used applied to + * the message with utils.format() + */ +logger.info = function (message) { logWithArgs('INFO', arguments); }; + +/** + * Logs a message at the DEBUG level. + * + * Parameters passed after message are used applied to + * the message with utils.format() + */ +logger.debug = function (message) { logWithArgs('DEBUG', arguments); }; + +// log at the specified level with args +function logWithArgs (level, args) { + args = [level].concat([].slice.call(args)); + logger.logLevel.apply(logger, args); +} + +// return the correct formatString for an object +function formatStringForMessage (message) { + return (typeof message === 'string') ? '' : '%o'; +} + +/** + * Logs a message at the specified level. + * + * Parameters passed after message are used applied to + * the message with utils.format() + */ +logger.logLevel = function (level /* , ... */) { + // format the message with the parameters + var formatArgs = [].slice.call(arguments, 1); + var fmtString = formatStringForMessage(formatArgs[0]); + if (fmtString.length > 0) { + formatArgs.unshift(fmtString); // add formatString + } + + var message = logger.format.apply(logger.format, formatArgs); + + if (LevelsMap[level] === null) { + throw new Error('invalid logging level: ' + level); + } + + if (LevelsMap[level] > CurrentLevel) return; + + // queue the message if not yet at deviceready + if (!DeviceReady && !UseConsole) { + Queued.push([level, message]); + return; + } + + // Log using the native logger if that is enabled + if (UseLogger) { + exec(null, null, 'Console', 'logLevel', [level, message]); + } + + // Log using the console if that is enabled + if (UseConsole) { + // make sure console is not using logger + if (console.useLogger()) { + throw new Error('console and logger are too intertwingly'); + } + + // log to the console + switch (level) { + case logger.LOG: originalConsole.log(message); break; + case logger.ERROR: originalConsole.log('ERROR: ' + message); break; + case logger.WARN: originalConsole.log('WARN: ' + message); break; + case logger.INFO: originalConsole.log('INFO: ' + message); break; + case logger.DEBUG: originalConsole.log('DEBUG: ' + message); break; + } + } +}; + +/** + * Formats a string and arguments following it ala console.log() + * + * Any remaining arguments will be appended to the formatted string. + * + * for rationale, see FireBug's Console API: + * http://getfirebug.com/wiki/index.php/Console_API + */ +logger.format = function (formatString, args) { + return __format(arguments[0], [].slice.call(arguments, 1)).join(' '); +}; + +// ------------------------------------------------------------------------------ +/** + * Formats a string and arguments following it ala vsprintf() + * + * format chars: + * %j - format arg as JSON + * %o - format arg as JSON + * %c - format arg as '' + * %% - replace with '%' + * any other char following % will format it's + * arg via toString(). + * + * Returns an array containing the formatted string and any remaining + * arguments. + */ +function __format (formatString, args) { + if (formatString === null || formatString === undefined) return ['']; + if (arguments.length === 1) return [formatString.toString()]; + + if (typeof formatString !== 'string') { formatString = formatString.toString(); } + + var pattern = /(.*?)%(.)(.*)/; + var rest = formatString; + var result = []; + + while (args.length) { + var match = pattern.exec(rest); + if (!match) break; + + var arg = args.shift(); + rest = match[3]; + result.push(match[1]); + + if (match[2] === '%') { + result.push('%'); + args.unshift(arg); + continue; + } + + result.push(__formatted(arg, match[2])); + } + + result.push(rest); + + var remainingArgs = [].slice.call(args); + remainingArgs.unshift(result.join('')); + return remainingArgs; +} + +function __formatted (object, formatChar) { + try { + switch (formatChar) { + case 'j': + case 'o': return JSON.stringify(object); + case 'c': return ''; + } + } catch (e) { + return 'error JSON.stringify()ing argument: ' + e; + } + + if ((object === null) || (object === undefined)) { + return Object.prototype.toString.call(object); + } + + return object.toString(); +} + +// ------------------------------------------------------------------------------ +// when deviceready fires, log queued messages +logger.__onDeviceReady = function () { + if (DeviceReady) return; + + DeviceReady = true; + + for (var i = 0; i < Queued.length; i++) { + var messageArgs = Queued[i]; + logger.logLevel(messageArgs[0], messageArgs[1]); + } + + Queued = null; +}; + +// add a deviceready event to log queued messages +document.addEventListener('deviceready', logger.__onDeviceReady, false); + +}); + +// file: ../cordova-ios/cordova-js-src/plugin/ios/wkwebkit.js +define("cordova/plugin/ios/wkwebkit", function(require, exports, module) { + +var exec = require('cordova/exec'); + +var WkWebKit = { + allowsBackForwardNavigationGestures: function (allow) { + exec(null, null, 'CDVWebViewEngine', 'allowsBackForwardNavigationGestures', [allow]); + }, + convertFilePath: function (path) { + if (!path || !window.CDV_ASSETS_URL) { + return path; + } + if (path.startsWith('/')) { + return window.CDV_ASSETS_URL + '/_app_file_' + path; + } + if (path.startsWith('file://')) { + return window.CDV_ASSETS_URL + path.replace('file://', '/_app_file_'); + } + return path; + } +}; + +module.exports = WkWebKit; + +}); + +// file: src/common/pluginloader.js +define("cordova/pluginloader", function(require, exports, module) { + +var modulemapper = require('cordova/modulemapper'); + +// Helper function to inject a