dpa99c opened a new issue #230:
URL: https://github.com/apache/cordova-plugin-geolocation/issues/230


   # Bug Report
   
   ## Problem
   
   ### What is expected to happen?
   The plugin returns native location data without causing the app to crash.
   
   
   ### What does actually happen?
   The plugin sometimes causes the app to crash when attempting to return 
native location data.
   
   
   ## Information
   <!-- Include all relevant information that might help understand and 
reproduce the problem -->
   Firebase has reported a spike in crashes the iOS versions of several of my 
apps.
   The Crashlytics data indicates the crashes are only occurring on devices 
running iOS 14.
   
   The stack trace indicates the crash originates in the geolocation plugin 
because one of the values being extracted from the native location object has 
an infinite value and therefore an exception is raised when trying to extract 
the values and transform then into a JSON object.
   
   This can be resolved by checking the `NSMutableDictionary`, into which the 
values from the `CLLocation` object are copied, is valid for conversion to JSON 
before attempting the conversion.
   
   
   Example crash stacktrace:
   
   ```
   Fatal Exception: NSInvalidArgumentException
   Invalid number value (infinite) in JSON write
   Fatal Exception: NSInvalidArgumentException
   0  CoreFoundation                 0x18f35e754 __exceptionPreprocess
   1  libobjc.A.dylib                0x1a3e257a8 objc_exception_throw
   2  Foundation                     0x190775ad8 _writeJSONNumber
   3  Foundation                     0x19077687c ___writeJSONObject_block_invoke
   4  CoreFoundation                 0x18f2c2a68 
__NSDICTIONARY_IS_CALLING_OUT_TO_A_BLOCK__
   5  CoreFoundation                 0x18f2371f8 -[__NSDictionaryM 
enumerateKeysAndObjectsWithOptions:usingBlock:]
   6  Foundation                     0x190775d7c _writeJSONObject
   7  Foundation                     0x190776ba0 ___writeJSONArray_block_invoke
   8  CoreFoundation                 0x18f2dc5bc 
__NSARRAY_IS_CALLING_OUT_TO_A_BLOCK__
   9  CoreFoundation                 0x18f236b8c -[__NSSingleObjectArrayI 
enumerateObjectsWithOptions:usingBlock:]
   10 Foundation                     0x19077625c _writeJSONArray
   11 Foundation                     0x190773db8 -[_NSJSONWriter 
dataWithRootObject:options:]
   12 Foundation                     0x19061d7a8 +[NSJSONSerialization 
dataWithJSONObject:options:error:]
   13 Greater_Anglia                 0x1025a71ac 
-[NSArray(CDVJSONSerializingPrivate) cdv_JSONString]
   14 Greater_Anglia                 0x10259deb8 -[CDVPluginResult 
argumentsAsJSON]
   15 Greater_Anglia                 0x10259a9f8 -[CDVCommandDelegateImpl 
sendPluginResult:callbackId:]
   16 Greater_Anglia                 0x1021bb48c -[CDVLocation 
returnLocationInfo:andKeepCallback:] + 300 (CDVLocation.m:300)
   17 Greater_Anglia                 0x1021ba4f8 -[CDVLocation 
locationManager:didUpdateToLocation:fromLocation:] + 177 (CDVLocation.m:177)
   18 CoreLocation                   0x19520f8fc 
CLClientStopVehicleHeadingUpdates
   19 CoreLocation                   0x19520ea80 
CLClientStopVehicleHeadingUpdates
   20 CoreLocation                   0x1951f4d1c 
CLClientCreateWithBundleIdentifierAndPathOnSilo
   21 CoreFoundation                 0x18f2d8718 
__CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__
   22 CoreFoundation                 0x18f2d796c __CFRunLoopDoBlocks
   23 CoreFoundation                 0x18f2d1f54 __CFRunLoopRun
   24 CoreFoundation                 0x18f2d1360 CFRunLoopRunSpecific
   25 GraphicsServices               0x1a690f734 GSEventRunModal
   26 UIKitCore                      0x191d4c584 -[UIApplication _run]
   27 UIKitCore                      0x191d51df4 UIApplicationMain
   28 Greater_Anglia                 0x10216e904 main + 32 (main.m:32)
   29 libdyld.dylib                  0x18ef8dcf8 start
   ```
   
   
   
   ### Command or Code
   <!-- What command or code is needed to reproduce the problem? -->
   I'm not certain exactly which value retrieved from the `CLLocation` object 
is `INFINITY` because the stack trace from the crash only points to the line 
where the conversion to JSON is attempted but doesn't actually indicate which 
field in the `NSMutableDictionary` contains the `INFINITE` value.
   
   However, the issue can be artificially reproduced by setting one of the 
values to `INFINITY` before the conversion is made, e.g. on [line 293 of 
`CDVLocation.m`](https://github.com/apache/cordova-plugin-geolocation/blob/master/src/ios/CDVLocation.m#L293):
   
   ```
   [returnInfo setObject:[NSNumber numberWithDouble:INFINITY] 
forKey@"timestamp"];
   ```
   
   
   
   ### Environment, Platform, Device
   <!-- In what environment, on what platform or on which device are you 
experiencing the issue? -->
   Devices/Simulators running iOS 14.x
   
   
   ### Version information
   <!-- 
   What are relevant versions you are using?
   For example:
   Cordova: Cordova CLI, Cordova Platforms, Cordova Plugins 
   Other Frameworks: Ionic Framework and CLI version
   Operating System, Android Studio, Xcode etc.
   -->
   `[email protected]`
   `[email protected]`
   `[email protected]`
   
   
   
   ## Checklist
   <!-- Please check the boxes by putting an x in the [ ] like so: [x] -->
   
   - [x] I searched for existing GitHub issues
   - [x] I updated all Cordova tooling to most recent version
   - [x] I included all the necessary information above
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to