@capacitor/ios 3.5.0 → 4.0.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,28 +3,29 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
- # [3.5.0](https://github.com/ionic-team/capacitor/compare/3.4.3...3.5.0) (2022-04-22)
6
+ # [4.0.0-alpha.2](https://github.com/ionic-team/capacitor/compare/3.4.1...4.0.0-alpha.2) (2022-05-12)
7
7
 
8
8
 
9
- ### Features
9
+ ### Bug Fixes
10
10
 
11
- * **ios:** Add overrideable routing for CAPBridgeViewController subclasses ([#5546](https://github.com/ionic-team/capacitor/issues/5546)) ([8875d5e](https://github.com/ionic-team/capacitor/commit/8875d5e2721e8a8ee763ce70cb672db383f36efa))
11
+ * **ios:** make removeAllListeners return a promise ([#5526](https://github.com/ionic-team/capacitor/issues/5526)) ([815f71b](https://github.com/ionic-team/capacitor/commit/815f71b6b62f6c4d5f66e6a36c190bb00a96fdcc))
12
12
 
13
13
 
14
+ ### Features
14
15
 
16
+ * **ios:** add getConfig to CAPPlugin ([#5495](https://github.com/ionic-team/capacitor/issues/5495)) ([224a9d0](https://github.com/ionic-team/capacitor/commit/224a9d075629d9c9da9ddc658eb282617fc46d09))
17
+ * **ios:** Add preferredContentMode configuration option ([#5583](https://github.com/ionic-team/capacitor/issues/5583)) ([5b6dfa3](https://github.com/ionic-team/capacitor/commit/5b6dfa3fe29c85632546b299f03cc04a77cf7475))
15
18
 
16
19
 
17
- ## [3.4.3](https://github.com/ionic-team/capacitor/compare/3.4.2...3.4.3) (2022-03-04)
18
20
 
19
- **Note:** Version bump only for package @capacitor/ios
20
21
 
21
22
 
23
+ # [4.0.0-alpha.1](https://github.com/ionic-team/capacitor/compare/3.4.1...4.0.0-alpha.1) (2022-03-25)
22
24
 
23
25
 
26
+ ### Features
24
27
 
25
- ## [3.4.2](https://github.com/ionic-team/capacitor/compare/3.4.1...3.4.2) (2022-03-03)
26
-
27
- **Note:** Version bump only for package @capacitor/ios
28
+ * **ios:** add getConfig to CAPPlugin ([#5495](https://github.com/ionic-team/capacitor/issues/5495)) ([224a9d0](https://github.com/ionic-team/capacitor/commit/224a9d075629d9c9da9ddc658eb282617fc46d09))
28
29
 
29
30
 
30
31
 
@@ -42,7 +42,7 @@ import Cordova
42
42
  setScreenOrientationDefaults()
43
43
 
44
44
  // get the web view
45
- let assetHandler = WebViewAssetHandler(router: router())
45
+ let assetHandler = WebViewAssetHandler()
46
46
  assetHandler.setAssetPath(configuration.appLocation.path)
47
47
  let delegationHandler = WebViewDelegationHandler()
48
48
  prepareWebView(with: configuration, assetHandler: assetHandler, delegationHandler: delegationHandler)
@@ -89,11 +89,7 @@ import Cordova
89
89
  }
90
90
  return descriptor
91
91
  }
92
-
93
- open func router() -> Router {
94
- return _Router()
95
- }
96
-
92
+
97
93
  /**
98
94
  The WKWebViewConfiguration to use for the webview.
99
95
 
@@ -119,6 +115,15 @@ import Cordova
119
115
  webViewConfiguration.applicationNameForUserAgent = appendUserAgent
120
116
  }
121
117
  }
118
+ if let preferredContentMode = instanceConfiguration.preferredContentMode {
119
+ var mode = WKWebpagePreferences.ContentMode.recommended
120
+ if preferredContentMode == "mobile" {
121
+ mode = WKWebpagePreferences.ContentMode.mobile
122
+ } else if preferredContentMode == "desktop" {
123
+ mode = WKWebpagePreferences.ContentMode.desktop
124
+ }
125
+ webViewConfiguration.defaultWebpagePreferences.preferredContentMode = mode
126
+ }
122
127
  return webViewConfiguration
123
128
  }
124
129
 
@@ -23,6 +23,7 @@ NS_SWIFT_NAME(InstanceConfiguration)
23
23
  @property (nonatomic, readonly, nonnull) NSURL *appLocation;
24
24
  @property (nonatomic, readonly, nullable) NSString *appStartPath;
25
25
  @property (nonatomic, readonly) BOOL limitsNavigationsToAppBoundDomains;
26
+ @property (nonatomic, readonly, nullable) NSString *preferredContentMode;
26
27
 
27
28
  @property (nonatomic, readonly, nonnull) NSDictionary *legacyConfig DEPRECATED_MSG_ATTRIBUTE("Use direct properties instead");
28
29
 
@@ -35,6 +35,7 @@
35
35
  _appLocation = descriptor.appLocation;
36
36
  _appStartPath = descriptor.appStartPath;
37
37
  _limitsNavigationsToAppBoundDomains = descriptor.limitsNavigationsToAppBoundDomains;
38
+ _preferredContentMode = descriptor.preferredContentMode;
38
39
  _pluginConfigurations = descriptor.pluginConfigurations;
39
40
  _legacyConfig = descriptor.legacyConfig;
40
41
  // construct the necessary URLs
@@ -15,10 +15,18 @@ extension InstanceConfiguration {
15
15
  return serverURL
16
16
  }
17
17
 
18
+ @available(*, deprecated, message: "Use getPluginConfig")
18
19
  @objc public func getPluginConfigValue(_ pluginId: String, _ configKey: String) -> Any? {
19
20
  return (pluginConfigurations as? JSObject)?[keyPath: KeyPath("\(pluginId).\(configKey)")]
20
21
  }
21
22
 
23
+ @objc public func getPluginConfig(_ pluginId: String) -> PluginConfig {
24
+ if let cfg = (pluginConfigurations as? JSObject)?[keyPath: KeyPath("\(pluginId)")] as? JSObject {
25
+ return PluginConfig(config: cfg)
26
+ }
27
+ return PluginConfig(config: JSObject())
28
+ }
29
+
22
30
  @objc public func shouldAllowNavigation(to host: String) -> Bool {
23
31
  for hostname in allowedNavigationHostnames {
24
32
  if doesHost(host, match: hostname) {
@@ -108,6 +108,11 @@ NS_SWIFT_NAME(InstanceDescriptor)
108
108
  @discussion Defaults to @c false. Set by @c ios.limitsNavigationsToAppBoundDomains in the configuration file. Required to be @c true for plugins to work if the app includes @c WKAppBoundDomains in the Info.plist.
109
109
  */
110
110
  @property (nonatomic, assign) BOOL limitsNavigationsToAppBoundDomains;
111
+ /**
112
+ @brief The content mode for the web view to use when it loads and renders web content.
113
+ @discussion Defaults to @c recommended. Set by @c ios.preferredContentMode in the configuration file.
114
+ */
115
+ @property (nonatomic, copy, nullable) NSString *preferredContentMode;
111
116
  /**
112
117
  @brief The parser used to load the cofiguration for Cordova plugins.
113
118
  */
@@ -125,6 +125,9 @@ internal extension InstanceDescriptor {
125
125
  if let limitsNavigations = config[keyPath: "ios.limitsNavigationsToAppBoundDomains"] as? Bool {
126
126
  limitsNavigationsToAppBoundDomains = limitsNavigations
127
127
  }
128
+ if let preferredMode = (config[keyPath: "ios.preferredContentMode"] as? String) {
129
+ preferredContentMode = preferredMode
130
+ }
128
131
  }
129
132
  }
130
133
  // swiftlint:enable cyclomatic_complexity
@@ -4,6 +4,8 @@
4
4
  @protocol CAPBridgeProtocol;
5
5
  @class CAPPluginCall;
6
6
 
7
+ @class PluginConfig;
8
+
7
9
  @interface CAPPlugin : NSObject
8
10
 
9
11
  @property (nonatomic, weak, nullable) WKWebView *webView;
@@ -44,8 +46,9 @@
44
46
  -(NSString* _Nonnull)getId;
45
47
  -(BOOL)getBool:(CAPPluginCall* _Nonnull) call field:(NSString* _Nonnull)field defaultValue:(BOOL)defaultValue DEPRECATED_MSG_ATTRIBUTE("Use accessors on CAPPluginCall instead. See CAPBridgedJSTypes.h for Obj-C implementations.");
46
48
  -(NSString* _Nullable)getString:(CAPPluginCall* _Nonnull)call field:(NSString* _Nonnull)field defaultValue:(NSString* _Nonnull)defaultValue DEPRECATED_MSG_ATTRIBUTE("Use accessors on CAPPluginCall instead. See CAPBridgedJSTypes.h for Obj-C implementations.");
47
- -(id _Nullable)getConfigValue:(NSString* _Nonnull)key;
49
+ -(id _Nullable)getConfigValue:(NSString* _Nonnull)key __deprecated_msg("use getConfig() and access config values using the methods available depending on the type.");
50
+ -(PluginConfig* _Nonnull)getConfig;
48
51
  -(void)setCenteredPopover:(UIViewController* _Nonnull)vc;
49
- -(BOOL)supportsPopover;
52
+ -(BOOL)supportsPopover DEPRECATED_MSG_ATTRIBUTE("All iOS 13+ devices support popover");
50
53
 
51
54
  @end
@@ -29,10 +29,14 @@
29
29
  return [call getString:field defaultValue:defaultValue];
30
30
  }
31
31
 
32
- -(id)getConfigValue:(NSString *)key {
32
+ -(id)getConfigValue:(NSString *)key __deprecated {
33
33
  return [self.bridge.config getPluginConfigValue:self.pluginName :key];
34
34
  }
35
35
 
36
+ -(PluginConfig*)getConfig {
37
+ return [self.bridge.config getPluginConfig:self.pluginName];
38
+ }
39
+
36
40
  -(void)load {}
37
41
 
38
42
  - (void)addEventListener:(NSString *)eventName listener:(CAPPluginCall *)listener {
@@ -105,6 +109,7 @@
105
109
 
106
110
  - (void)removeAllListeners:(CAPPluginCall *)call {
107
111
  [self.eventListeners removeAllObjects];
112
+ [call resolve];
108
113
  }
109
114
 
110
115
  - (NSArray<CAPPluginCall *>*)getListeners:(NSString *)eventName {
@@ -141,11 +146,7 @@
141
146
  }
142
147
 
143
148
  -(BOOL)supportsPopover {
144
- if (@available(iOS 13, *)) {
145
149
  return YES;
146
- } else {
147
- return UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad;
148
- }
149
150
  }
150
151
 
151
152
  - (NSNumber*)shouldOverrideLoad:(WKNavigationAction*)navigationAction {
@@ -97,7 +97,7 @@ internal class JSExport {
97
97
  let methods = [
98
98
  PluginHeaderMethod(name: "addListener", rtype: nil),
99
99
  PluginHeaderMethod(name: "removeListener", rtype: nil),
100
- PluginHeaderMethod(name: "removeAllListeners", rtype: nil),
100
+ PluginHeaderMethod(name: "removeAllListeners", rtype: "promise"),
101
101
  PluginHeaderMethod(name: "checkPermissions", rtype: "promise"),
102
102
  PluginHeaderMethod(name: "requestPermissions", rtype: "promise")
103
103
  ]
@@ -0,0 +1,56 @@
1
+ import Foundation
2
+
3
+ @objc public class PluginConfig: NSObject {
4
+
5
+ // The object containing the plugin config values
6
+ private var config: JSObject
7
+
8
+ init(config: JSObject) {
9
+ self.config = config
10
+ }
11
+
12
+ @objc public func getString(_ configKey: String, _ defaultValue: String? = nil) -> String? {
13
+ if let val = (self.config)[keyPath: KeyPath(configKey)] as? String {
14
+ return val
15
+ }
16
+ return defaultValue
17
+ }
18
+
19
+ @objc public func getBoolean(_ configKey: String, _ defaultValue: Bool) -> Bool {
20
+ if let val = (self.config)[keyPath: KeyPath(configKey)] as? Bool {
21
+ return val
22
+ }
23
+ return defaultValue
24
+ }
25
+
26
+ @objc public func getInt(_ configKey: String, _ defaultValue: Int) -> Int {
27
+ if let val = (self.config)[keyPath: KeyPath(configKey)] as? Int {
28
+ return val
29
+ }
30
+ return defaultValue
31
+ }
32
+
33
+ public func getArray(_ configKey: String, _ defaultValue: JSArray? = nil) -> JSArray? {
34
+ if let val = (self.config)[keyPath: KeyPath(configKey)] as? JSArray {
35
+ return val
36
+ }
37
+ return defaultValue
38
+ }
39
+
40
+ public func getObject(_ configKey: String) -> JSObject? {
41
+ return (self.config)[keyPath: KeyPath(configKey)] as? JSObject
42
+ }
43
+
44
+ @objc public func isEmpty() -> Bool {
45
+ return self.config.isEmpty
46
+ }
47
+
48
+ /**
49
+ * Gets the JSObject containing the config of the the provided plugin ID.
50
+ *
51
+ * @return The config for that plugin
52
+ */
53
+ public func getConfigJSON() -> JSObject {
54
+ return self.config
55
+ }
56
+ }
@@ -3,13 +3,8 @@ import MobileCoreServices
3
3
 
4
4
  @objc(CAPWebViewAssetHandler)
5
5
  internal class WebViewAssetHandler: NSObject, WKURLSchemeHandler {
6
- private let router: Router
6
+
7
7
  private var basePath: String = ""
8
-
9
- init(router: Router) {
10
- self.router = router
11
- super.init()
12
- }
13
8
 
14
9
  func setAssetPath(_ assetPath: String) {
15
10
  self.basePath = assetPath
@@ -19,14 +14,14 @@ internal class WebViewAssetHandler: NSObject, WKURLSchemeHandler {
19
14
  var startPath = self.basePath
20
15
  let url = urlSchemeTask.request.url!
21
16
  let stringToLoad = url.path
22
-
23
- let resolvedRoute = router.route(for: stringToLoad)
17
+
24
18
  if stringToLoad.starts(with: CapacitorBridge.fileStartIdentifier) {
25
19
  startPath = stringToLoad.replacingOccurrences(of: CapacitorBridge.fileStartIdentifier, with: "")
20
+ } else if stringToLoad.isEmpty || url.pathExtension.isEmpty {
21
+ startPath.append("/index.html")
26
22
  } else {
27
- startPath.append(resolvedRoute)
23
+ startPath.append(stringToLoad)
28
24
  }
29
-
30
25
  let localUrl = URL.init(string: url.absoluteString)!
31
26
  let fileUrl = URL.init(fileURLWithPath: startPath)
32
27
 
@@ -47,8 +47,6 @@ internal class WebViewDelegationHandler: NSObject, WKNavigationDelegate, WKUIDel
47
47
  bridge?.reset()
48
48
  }
49
49
 
50
- // TODO: remove once Xcode 12 support is dropped
51
- #if compiler(>=5.5)
52
50
  @available(iOS 15, *)
53
51
  func webView(
54
52
  _ webView: WKWebView,
@@ -67,7 +65,6 @@ internal class WebViewDelegationHandler: NSObject, WKNavigationDelegate, WKUIDel
67
65
  decisionHandler: @escaping (WKPermissionDecision) -> Void) {
68
66
  decisionHandler(.grant)
69
67
  }
70
- #endif
71
68
 
72
69
  public func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
73
70
  // post a notification for any listeners
package/Capacitor.podspec CHANGED
@@ -7,7 +7,7 @@ Pod::Spec.new do |s|
7
7
  s.social_media_url = 'https://twitter.com/capacitorjs'
8
8
  s.license = 'MIT'
9
9
  s.homepage = 'https://capacitorjs.com/'
10
- s.ios.deployment_target = '12.0'
10
+ s.ios.deployment_target = '13.0'
11
11
  s.authors = { 'Ionic Team' => 'hi@ionicframework.com' }
12
12
  s.source = { :git => 'https://github.com/ionic-team/capacitor.git', :branch => "portals-dev" }
13
13
  s.source_files = 'Capacitor/Capacitor/*.{swift,h,m}', 'Capacitor/Capacitor/Plugins/*.{swift,h,m}', 'Capacitor/Capacitor/Plugins/**/*.{swift,h,m}'
@@ -9,7 +9,7 @@ Pod::Spec.new do |s|
9
9
  s.license = 'MIT'
10
10
  s.authors = { 'Ionic Team' => 'hi@ionicframework.com' }
11
11
  s.source = { :git => 'https://github.com/ionic-team/capacitor', :tag => s.version.to_s }
12
- s.platform = :ios, 12.0
12
+ s.platform = :ios, 13.0
13
13
  s.source_files = 'CapacitorCordova/CapacitorCordova/**/*.{h,m}'
14
14
  s.public_header_files = 'CapacitorCordova/CapacitorCordova/Classes/Public/*.h', 'CapacitorCordova/CapacitorCordova/CapacitorCordova.h'
15
15
  s.module_map = 'CapacitorCordova/CapacitorCordova/CapacitorCordova.modulemap'
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@capacitor/ios",
3
- "version": "3.5.0",
3
+ "version": "4.0.0-alpha.2",
4
4
  "description": "Capacitor: Cross-platform apps with JavaScript and the web",
5
5
  "homepage": "https://capacitorjs.com",
6
6
  "author": "Ionic Team <hi@ionic.io> (https://ionic.io)",
@@ -24,10 +24,10 @@
24
24
  "xc:build:CapacitorCordova": "cd CapacitorCordova && xcodebuild && cd .."
25
25
  },
26
26
  "peerDependencies": {
27
- "@capacitor/core": "^3.5.0"
27
+ "@capacitor/core": "^3.4.0"
28
28
  },
29
29
  "publishConfig": {
30
30
  "access": "public"
31
31
  },
32
- "gitHead": "f03e1a67140c8af25288456f9e99dd6234b50f25"
32
+ "gitHead": "5c588d5bd15b2b939c6efc25b7db9d6af29afae0"
33
33
  }
@@ -1,27 +0,0 @@
1
- //
2
- // Router.swift
3
- // Capacitor
4
- //
5
- // Created by Steven Sherry on 3/29/22.
6
- // Copyright © 2022 Drifty Co. All rights reserved.
7
- //
8
-
9
- import Foundation
10
-
11
- public protocol Router {
12
- func route(for path: String) -> String
13
- }
14
-
15
- // swiftlint:disable:next type_name
16
- internal struct _Router: Router {
17
- func route(for path: String) -> String {
18
- let pathUrl = URL(string: path)
19
-
20
- // if the pathUrl is null, then it is an invalid url (meaning it is empty or just plain invalid) then we want to route to /index.html
21
- if pathUrl?.pathExtension.isEmpty ?? true {
22
- return "/index.html"
23
- }
24
-
25
- return path
26
- }
27
- }