Git Product home page Git Product logo

googleutilities's Introduction

Version License Platform

Actions Status

GoogleUtilities

GoogleUtilities provides a set of utilities for Firebase and other Google SDKs for Apple platform development.

The utilities are not directly supported for non-Google library usage.

Integration Testing

These instructions apply to minor and patch version updates. Major versions need a customized adaptation.

After the CI is green:

  • Determine the next version for release by checking the tagged releases. Ensure that the next release version keeps the Swift PM and CocoaPods versions in sync.
  • Verify that the releasing version is the latest entry in the CHANGELOG.md, updating it if necessary.
  • Update the version in the podspec to match the latest entry in the CHANGELOG.md
  • Checkout the main branch and ensure it is up to date
    git checkout main
    git pull
  • Add the CocoaPods tag ({version} will be the latest version in the podspec)
    git tag CocoaPods-{version}
    git push origin CocoaPods-{version}
  • Push the podspec to the designated repo
    • If this version of GoogleUtilities is intended to launch before or with the next Firebase release:

      Push to SpecsStaging
      pod repo push --skip-tests staging GoogleUtilities.podspec

      If the command fails with Unable to find the 'staging' repo., add the staging repo with:

      pod repo add staging [email protected]:firebase/SpecsStaging.git
    • Otherwise:

      Push to SpecsDev
      pod repo push --skip-tests dev GoogleUtilities.podspec

      If the command fails with Unable to find the 'dev' repo., add the dev repo with:

      pod repo add dev [email protected]:firebase/SpecsDev.git
  • Run Firebase CI by waiting until next nightly or adding a PR that touches Gemfile.
  • On google3, run copybara using the command below. Then, start a global TAP on the generated CL. Deflake as needed.
    third_party/firebase/ios/Releases/run_copy_bara.py --directory GoogleUtilities --branch main

Publishing

The release process is as follows:

  1. Tag and release for Swift PM
  2. Publish to CocoaPods
  3. Create GitHub Release
  4. Perform post release cleanup

Swift Package Manager

By creating and pushing a tag for Swift PM, the newly tagged version will be immediately released for public use. Given this, please verify the intended time of release for Swift PM.

  • Add a version tag for Swift PM
git tag {version}
git push origin {version}

Note: Ensure that any inflight PRs that depend on the new GoogleUtilities version are updated to point to the newly tagged version rather than a checksum.

CocoaPods

  • Publish the newly versioned pod to CocoaPods

    It's recommended to point to the GoogleUtilities.podspec in staging to make sure the correct spec is being published.

    pod trunk push ~/.cocoapods/repos/staging/GoogleUtilities/{version}/GoogleUtilities.podspec

    Note: In some cases, it may be acceptable to pod trunk push with the --skip-tests flag. Please double check with the maintainers before doing so.

    The pod push was successful if the above command logs: ๐Ÿš€ GoogleUtilities ({version}) successfully published. In addition, a new commit that publishes the new version (co-authored by CocoaPodsAtGoogle) should appear in the CocoaPods specs repo. Last, the latest version should be displayed on GoogleUtilities's CocoaPods page.

Update the release template's Tag version and Release title fields with the latest version. In addition, reference the Release Notes in the release's description.

See this release for an example.

Don't forget to perform the post release cleanup!

Post Release Cleanup

Clean up SpecsStaging
pwd=$(pwd)
mkdir -p /tmp/release-cleanup && cd $_
git clone [email protected]:firebase/SpecsStaging.git
cd SpecsStaging/
git rm -rf GoogleUtilities/
git commit -m "Post publish cleanup"
git push origin master
rm -rf /tmp/release-cleanup
cd $pwd

Development

To develop in this repository, ensure that you have at least the following software:

For the pod that you want to develop:

pod gen GoogleUtilities.podspec --local-sources=./ --auto-open --platforms=ios

Note: If the CocoaPods cache is out of date, you may need to run pod repo update before the pod gen command.

Note: Set the --platforms option to macos or tvos to develop/test for those platforms. Since 10.2, Xcode does not properly handle multi-platform CocoaPods workspaces.

Development for Catalyst

  • pod gen GoogleUtilities.podspec --local-sources=./ --auto-open --platforms=ios
  • Check the Mac box in the App-iOS Build Settings
  • Sign the App in the Settings Signing & Capabilities tab
  • Click Pods in the Project Manager
  • Add Signing to the iOS host app and unit test targets
  • Select the Unit-unit scheme
  • Run it to build and test

Alternatively disable signing in each target:

  • Go to Build Settings tab
  • Click +
  • Select Add User-Defined Setting
  • Add CODE_SIGNING_REQUIRED setting with a value of NO

Code Formatting

To ensure that the code is formatted consistently, run the script ./scripts/check.sh before creating a PR.

GitHub Actions will verify that any code changes are done in a style compliant way. Install clang-format and mint:

brew install clang-format@17
brew install mint

Running Unit Tests

Select a scheme and press Command-u to build a component and run its unit tests.

Contributing

See Contributing.

License

The contents of this repository is licensed under the Apache License, version 2.0.

googleutilities's People

Contributors

andrewheard avatar asafkorem avatar bstpierr avatar charlotteliang avatar corrob avatar dependabot[bot] avatar ened avatar granluo avatar itslazyvar avatar jbampton avatar jszumski avatar maksymmalyhin avatar mikeger avatar mikelehen avatar morganchen12 avatar ncooke3 avatar paulb777 avatar philipphofmann avatar ryanwilson avatar salakar avatar samedson avatar tejasd avatar tsunghung avatar var-const avatar vinayguthal avatar vprajeetreddy-404 avatar wilhuff avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

googleutilities's Issues

issue with Third_party-IsAppEncrypted dependencies name

Hello everyone we faced an issue with your last version 7.12.0 that contains a dependency which his name is malformatted and cause a block from Apple when we upload to iTunes Connect.
this is the error
`Asset validation failed This bundle is invalid. The bundle at path Payload/******/Frameworks/third_party-IsAppEncrypted.framework has an invalid CFBundleIdentifier 'third_party-IsAppEncrypted' There are invalid characters(characters that are not dots, hyphen and alphanumerics) that have been replaced with their code point 'third\u005fparty-IsAppEncrypted' CFBundleIdentifier must be present, must contain only alphanumerics, dots, hyphens and must not end with a dot. [see the Core Foundation Keys at https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html#//apple_ref/doc/uid/TP40009249-102070-TPXREF105] (ID: 7bf7a09b-a8e9-438e-8591-442cd9f73f7e) (90049)
{
NSLocalizedDescription = "Asset validation failed";
NSLocalizedFailureReason = "This bundle is invalid. The bundle at path Payload/AppOfCards.app/Frameworks/third_party-IsAppEncrypted.framework has an invalid CFBundleIdentifier 'third_party-IsAppEncrypted' There are invalid characters(characters that are not dots, hyphen and alphanumerics) that have been replaced with their code point 'third\u005fparty-IsAppEncrypted' CFBundleIdentifier must be present, must contain only alphanumerics, dots, hyphens and must not end with a dot. [see the Core Foundation Keys at https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html#//apple_ref/doc/uid/TP40009249-102070-TPXREF105] (ID: 7bf7a09b-a8e9-438e-8591-442cd9f73f7e)";
NSUnderlyingError = "Error Domain=IrisAPI Code=-19241 "Asset validation failed" UserInfo={status=409, detail=This bundle is invalid. The bundle at path Payload/AppOfCards.app/Frameworks/third_party-IsAppEncrypted.framework has an invalid
}
I resolved the issue by rollback to the 7.11.5 I think that you should update your third_party-IsAppEncrypted.framework CFBundleIdentifier to respect Apple recommendation

regards

Investigate flaky `GULNetworkTests`

While publishing the 7.11.0 pod, the podspec failed to validate. Further investigation showed that something about the GULNetworkTests is causing flakes. They flakes seem to emerge depending on the Xcode version. Flakes were reproducible on Xcode 14.2.

Steps to reproduce:

  1. pod gen GoogleUtilities.podspec --platforms=macos
  2. Navigate to GULNetworkTests.m
  3. Right-click the testing icon on GULNetworkTests and run the test repeatedly (~100 times should be fine)

Screen Shot 2023-01-10 at 2 54 10 PM

[visionOS] Outstanding API availability gaps for visionOS

Below is a. list of open API availability questions for the visionOS platform.

  1. See the disabled - [GULAppDelegateSwizzlerTest testApplicationDidReceiveRemoteNotificationIsInvokedOnInterceptors] test for additional context. (See discussion thread in #108)
  2. ...

iOS 15 start app crash

build Xcode 13.2

Version:             1.0.380 (77)
Code Type:           ARM-64 (Native)
Role:                Foreground
Parent Process:      launchd [1]
Coalition:           com.fourxfun.ios.cyber [12505]

Date/Time:           2021-12-17 13:49:19.1418 +0800
Launch Time:         2021-12-17 13:49:16.2291 +0800
OS Version:          iPhone OS 15.1 (19B74)
Release Type:        User
Baseband Version:    7.02.00
Report Version:      104

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Subtype: KERN_INVALID_ADDRESS at 0x0000000000000010
Exception Codes: 0x0000000000000001, 0x0000000000000010
VM Region Info: 0x10 is not in any region.  Bytes before following region: 4362944496
      REGION TYPE                 START - END      [ VSIZE] PRT/MAX SHRMOD  REGION DETAIL
      UNUSED SPACE AT START
--->  
      __TEXT                   1040d4000-1040dc000 [   32K] r-x/r-x SM=COW  ...berpunkMobile
Exception Note:  EXC_CORPSE_NOTIFY
Termination Reason: SIGNAL; [11]
Terminating Process: exc handler [65269]

Terminating Process: exc handler [65269]
Triggered by Thread:  0

Thread 0 name:   Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   UnityFramework                	       0x10c4a38d4 0x10c21c000 + 2652372
1   UnityFramework                	       0x10c4a38cc 0x10c21c000 + 2652364
2   CoreFoundation                	       0x1851c0c4c __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ + 20
3   CoreFoundation                	       0x185255554 ___CFXRegistrationPost_block_invoke + 48
4   CoreFoundation                	       0x18522ab34 _CFXRegistrationPost + 416
5   CoreFoundation                	       0x1851d5754 _CFXNotificationPost + 696
6   Foundation                    	       0x1868f0138 -[NSNotificationCenter postNotificationName:object:userInfo:] + 92
7   UnityFramework                	       0x10c230cd0 0x10c21c000 + 85200
8   UnityFramework                	       0x10c230dac 0x10c21c000 + 85420
9   UnityFramework                	       0x10dad507c 0x10c21c000 + 25923708
10  GoogleUtilities               	       0x1068ebb68 -[GULAppDelegateSwizzler application:donor_didRegisterForRemoteNotificationsWithDeviceToken:] + 264
11  UIKitCore                     	       0x18839c43c __63-[UIApplication pushRegistry:didUpdatePushCredentials:forType:]_block_invoke + 108
12  libdispatch.dylib             	       0x184ef5194 _dispatch_call_block_and_release + 24
13  libdispatch.dylib             	       0x184ef6198 _dispatch_client_callout + 16
14  libdispatch.dylib             	       0x184ed74a8 _dispatch_main_queue_callback_4CF$VARIANT$armv81 + 908
15  CoreFoundation                	       0x1851e57e8 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 12
16  CoreFoundation                	       0x1851a30e8 __CFRunLoopRun + 2528
17  CoreFoundation                	       0x1851b5d7c CFRunLoopRunSpecific + 572
18  GraphicsServices              	       0x19f42a9a0 GSEventRunModal + 160
19  UIKitCore                     	       0x1879e805c -[UIApplication _run] + 1080
20  UIKitCore                     	       0x18777dce0 UIApplicationMain + 2028
21  UnityFramework                	       0x10c235c34 0x10c21c000 + 105524
22  CyberpunkMobile               	       0x1040dbe00 0x1040d4000 + 32256
23  dyld                          	       0x1043b4190 start + 444

ref:
https://giters.com/Unity-Technologies/com.unity.mobile.notifications/issues/121

issue with 7.13 version

Hello I think that the 7.13 version has an issue with the Privacy dependency

error: module name "GoogleUtilities-Privacy" is not a valid identifier

which block the upload symbols on Apple platform. Can you please resolve this issue of naming.

regards

Usage of TARGET_OS_IPHONE breaks visionOS simulator (Xcode 15.1 beta 1)

The line above should use TARGET_OS_IOS instead TARGET_OS_IPHONE. Using TARGET_OS_IPHONE makes this section valid in the Vision simulator. The definition of target defs are as follows in TargetConditionals.h on Xcode 15.1 beta 1 for the vision sim:

 #if (__is_target_arch(x86_64) || __is_target_arch(arm64) || __is_target_arch(arm64e)) && __is_target_vendor(apple) && __is_target_os(xros) && __is_target_environment(simulator)
        #define TARGET_OS_MAC               1
        #define TARGET_OS_OSX               0
        #define TARGET_OS_IPHONE            1

        #define TARGET_OS_IOS               0

        #define TARGET_OS_WATCH             0
        
        #define TARGET_OS_TV                0
        #define TARGET_OS_SIMULATOR         1
        #define TARGET_OS_EMBEDDED          0
        #define TARGET_OS_RTKIT             0
        #define TARGET_OS_MACCATALYST       0
        #define TARGET_OS_MACCATALYST            0

        #define TARGET_OS_VISION            1
        
        
        #ifndef TARGET_OS_UIKITFORMAC
         #define TARGET_OS_UIKITFORMAC      0
        #endif
        #define TARGET_OS_DRIVERKIT         0
        #define DYNAMIC_TARGETS_ENABLED     1
    #endif

application:openURL:options: in AppDelegate is not called

GoogleUtilities/AppDelegateSwizzler (7.2.2)

When I tried to wake up the App using scheme, if the App was running in the background, I found that the method in AppDelegate was not called. Through Debug, it is found that the hook in Google Utilities did not call the original method. Please see the screenshot. I hope it can be resolved as soon as possible. This is a very serious online problem.

89021616497705_ pic_hd

Remove `+ [GULAppEnvironmentUtil isIOS7OrHigher]` in next major version

The minimum supported iOS version is great than 7.0 so the + [GULAppEnvironmentUtil isIOS7OrHigher] API can be removed.

/// @return Returns @YES when is run on iOS version greater or equal to 7.0
+ (BOOL)isIOS7OrHigher DEPRECATED_MSG_ATTRIBUTE(
"Always `YES` because only iOS 8 and higher supported. The method will be removed.");

iOS 17 New required reason API

From Apple's newly published document "Describing use of required reason API":

Your app or third-party SDK must declare one or more approved reasons that accurately reflect your use of each of these APIs and the data derived from their use. You may use these APIs and the data derived from their use for the declared reasons only. These declared reasons must be consistent with your appโ€™s functionality as presented to users, and you may not use the APIs or derived data for tracking.

Will GoogleUtilities sdk be either removing the use of these APIs or providing a privacy manifest file for the iOS SDK? Or perhaps are you in contact with Apple about this issue?

Unable to read the license file `LICENSE` for the spec `GoogleUtilities (7.3.1)`

Environment

  • Xcode version: 12.4 (12D4e)
  • Firebase SDK version: 7.9.0
  • Installation method: CocoaPods
  • Firebase Component: Analytics, Crashlytics, RemoteConfig

Steps to reproduce

pod update

or

pod install

Console warning:

[!] Unable to read the license file `LICENSE` for the spec `Firebase (7.9.0)`

[!] Unable to read the license file `LICENSE` for the spec `GoogleUtilities (7.3.1)`

[!] Unable to read the license file `LICENSE` for the spec `Firebase (7.9.0)`

[!] Unable to read the license file `LICENSE` for the spec `GoogleUtilities (7.3.1)`

[!] [Xcodeproj] Generated duplicate UUIDs:

...

Bazel/Blaze BUILD

Hey Googlers!

Any chance you'd be down to release the Blaze/Bazel (Blazel!) BUILD files for this code? Would be handy to those of us building with Bazel, and I assume you've got them internally already. I think the only external dep, PromisesObjC, already has released theirs, which should keep things pretty easy.

If useful, here's the start of one I spun up for the subspecs I needed:

# Created referencing https://github.com/google/GoogleUtilities/blob/406c461ae85acbc2da327f13619ffa187f7b729e/GoogleUtilities.podspec

objc_library(
    name = "Environment",
    hdrs = glob(["GoogleUtilities/Environment/Public/GoogleUtilities/*.h"]),
    includes = ["GoogleUtilities/Environment/Public"],
    visibility = ["//visibility:public"],

    srcs = glob(["GoogleUtilities/Environment/**/*.m", "GoogleUtilities/Environment/**/*.h"]),
    deps = ["@GooglePromises//:FBLPromises", ":IsAppEncrypted"],
    sdk_frameworks = ["Security"],
)

objc_library(
    name = "Logger",
    hdrs = glob(["GoogleUtilities/Logger/Public/GoogleUtilities/*.h"]),
    includes = ["GoogleUtilities/Logger/Public"],
    visibility = ["//visibility:public"],

    srcs = glob(["GoogleUtilities/Logger/**/*.m", "GoogleUtilities/Logger/**/*.h"]),
    deps = [":Environment"],
)

objc_library(
    name = "IsAppEncrypted",
    hdrs = ["third_party/IsAppEncrypted/Public/IsAppEncrypted.h"],
    srcs = ["third_party/IsAppEncrypted/IsAppEncrypted.m"],
)

Thanks for your consideration!
Chris
(ex-Googler)

Consider removing Promises dependency in major version update

The Promises dependency is currently broken on macOS because it hasn't yet updated from a 10.10 minimum version.

On closer look, the dependency seems heavyweight for a single public API that is used in just one place in Firebase.

In Firebase:

$ git grep gul_dataTaskPromiseWithRequest
FirebaseAppCheck/Sources/Core/APIService/FIRAppCheckAPIService.m:  return [self.URLSession gul_dataTaskPromiseWithRequest:request]
FirebaseAppCheck/Tests/Unit/Core/FIRAppCheckAPIServiceTests.m:  OCMExpect([URLSessionMock gul_dataTaskPromiseWithRequest:URLRequestValidationArg])

The swizzling in this module is crashing the KochavaCore SDK with .cxx_destruct

The module KochavaCore (used by the KochavaTracker SDK) was reported to be experiencing a crash by the clients of Kochava. These clients happened to be using the Firebase Performance SDK. Some of them had recently upgraded to a newer version of the Firebase SDK while others only installed it recently. We tracked down the problem down to the Swizzling of our KVANetTransaction class, which was being selected by the Firebase Performance SDK to be Swizzled on the basis that it conformed to protocols NSURLSessionDataDelegate and NSURLSessionTaskDelegate. The actual cause of the crash is code located within the GoogleUtilities class GULObjectSwizzler.

To preface this, this swizzling is first creating two problematic or otherwise dangerous situations within the Kochava SDK:

  1. The Kochava SDK retrieves the names of its classes through NSStringFromClass(), and it embeds these names within persisted objects stored within NSUserDefaults. Later these objects may be restored using these persisted class names. While the SDK does exert some control (type checking) over the target class on restore, it is expected that these class names would be the same as they started with. Class KVANetTransaction through the swizzling process was being turned into values in the form of fir_{someUUID}_KVANetTransaction. Since this UUID is not consistent across launch, and since that new class will not exist on a subsequent launch, it creates the possibility that persistently stored objects will be irrecoverable. Although we code for this possibility, this is unexpected and could also lead to another future crash.

  2. The Kochava SDK uses the names of classes through NSStringFromClass() to display log messages. It uses the format: {Org} {Class Name} {Headline} on the main line. In this process it looks for prefixes such as Kochava or KVA and removes them prior to printing. When functioning properly this results in log messages such as:

Kochava NetTransaction - InstallNetTransaction - Request

However, with the Firebase Performance SDK running, the KVANetTransaction class is swizzled and its class is replaced. The new resulting class is fir_{someUUID}_KVANetTransaction. This results in unexpected log messages such as:

Kochava fir_UUID_KVANetTransaction - InstallNetTransaction - Request

While this behavior is not serious, it is improper for the functioning of the Kochava SDK. When our clients look for specific log messages they cannot be located as expected. Kochava also has automated systems which scan logs for certain log messages and these also would not function properly.


Most importantly, however, the swizzling is leading to a fairly reproducible crash. We tracked the crash down to the following file:

https://github.com/google/GoogleUtilities/blob/main/GoogleUtilities/ISASwizzler/GULObjectSwizzler.m

And to these lines of code in the dealloc method:

if (_swizzledObject == nil) {
      // The swizzled object has been deallocated already, so the generated class can be disposed
      // now.
      objc_disposeClassPair(_generatedClass);
      return;
}

Following the execution of this code on our KVANetTransaction class, specifically it does go into this if condition and calls objc_disposeClassPair(), and an unstable state is effected which ultimately leads to a crash with the associated label .cxx_destruct. The crash occurs shortly there after within the Kochava SDK, and usually on the deallocation of an instance of class KVALogMessage. A log message is probably involved here because when a trace log level is active there is a log message generated when instances of class KVANetTransaction are completing and will deallocate. We've also seen a crash on an object not our own, perhaps within the Firebase SDK, and will attach that screen shot as well.

From this we believe that the line if (_swizzledObject == nil) { may be occurring at an unsafe time. We're uncertain of the exact nature of the crash at the time of this writing. We've speculated this could be a problem related to the weak reference which you take on _swizzledObject and when that weak reference becomes nil during the dealloc process. Ref here:

__weak id _swizzledObject;

We have identified a workaround for the problem. We have modified module KochavaCore class KVANetTransaction beginning in version 4.5.0 to no longer conform to protocols NSURLSessionDataDelegate and NSURLSessionTaskDelegate, and we are instead using functions to create a data task which take a completion handler as a parameter. Having made this change in development, we can observe that the Firebase Performance SDK no longer swizzles class KVANetTransaction and the problem goes away.

Nevertheless, we want to express some concerns about the existing architecture within class GULObjectSwizzler.

First, we have clients which are using older versions of our SDK, and some will continue to use these versions for years into the future. If they install the Firebase Performance SDK, or perhaps some other SDK which uses GULObjectSwizzler on objects within our SDK, these mutual clients are likely to experience crashes.

Second, we have seen errors similar to these a couple years ago. They were deallocation errors on class KVALogMessage. At that time we thought we had tracked the problem down to the inclusion of the Firebase SDK, and we appeared to have compensated for the problem by prefixing our category extension methods on Apple foundation classes with the prefix kva_. We believed at that time that something within the Firebase SDK was colliding with our SDK, and we assumed that perhaps we had a common name collision on a category extension method on an Apple foundation class. This determination was made in collaboration between Kochava and Apple, and the prefixing of our category extension methods appeared to fix that problem at that time. We're now wondering, however, if the source of the problem actually had something to do with swizzling in some Firebase SDK, and that the method names might have been involved in the selection of what was being swizzled. We are speculating this based on how the Firebase Performance selects objects to swizzle based on protocol conformance (or the existence of methods named within protocols).

If the Firebase SDK goes on to swizzle Kochava classes in the future, these classes should be expected to function unexpectedly, as they rely on their class names for certain purposes such as 1) persistent storage identification. 2) the identification of the source of activity within log messages. 3) the identification of objects being sent to third party systems, wrappers, and the host. These objects are identified in JSON by their class names.

While we recognize that the performance monitoring feature of your SDK may require the use of swizzling, perhaps this could be engineered to be safer. And if not, there could be some way that developers could identify classes which are unsafe to swizzle. None of this however should detract from the central focus of this issue, which is that something is currently unsafe about the use of objc_disposeClassPair(_generatedClass); as demonstrated with the use of class KVANetTransaction, and this sometimes leads to a crash.

We will attach some screen shots for your reference. We will also provide a sample project which crashes most of the time for us. You should just need to pod update and add your own GoogleService-info.plist. Then you can run it in the simulator.

Thank you in advance for your assistance.

2021-03-22 14:39:04.626572-0700 PerformanceExample[97420:1216555] debug
Kochava fir_E3135118-8898-42C6-9A37-848F4747030C_KVANetTransaction - InstallNetTransaction - Request (7FC322F9-65E1172C-B136-412D-A0E1-416521B8E2CD)
{

Screen shot of later crash:
image

Screen shot of later crash not in Kochava, presumed to possibly be a Firebase class:
image

Sample App:
performance.zip

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.