Skip to content

Commit

Permalink
Merge 75e0ce9 into dd0557f
Browse files Browse the repository at this point in the history
  • Loading branch information
brustolin authored Nov 2, 2023
2 parents dd0557f + 75e0ce9 commit dc0d331
Show file tree
Hide file tree
Showing 4 changed files with 75 additions and 3 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@

- Stop sending empty thread names (#3361)
- Work around edge case with a thread info kernel call sometimes returning invalid data, leading to a crash (#3364)
- Reading applicationState in the background (#3372)

## 8.14.2

Expand Down
44 changes: 42 additions & 2 deletions Sources/Sentry/SentryUIApplication.m
Original file line number Diff line number Diff line change
@@ -1,10 +1,40 @@
#import "SentryUIApplication.h"
#import "SentryDependencyContainer.h"
#import "SentryNSNotificationCenterWrapper.h"

#if SENTRY_HAS_UIKIT

# import <UIKit/UIKit.h>

@implementation SentryUIApplication
@implementation SentryUIApplication {
UIApplicationState appState;
}

- (instancetype)init
{
if (self = [super init]) {

[SentryDependencyContainer.sharedInstance.notificationCenterWrapper
addObserver:self
selector:@selector(didEnterBackground)
name:UIApplicationDidEnterBackgroundNotification];

[SentryDependencyContainer.sharedInstance.notificationCenterWrapper
addObserver:self
selector:@selector(didBecomeActive)
name:UIApplicationDidBecomeActiveNotification];
// We store the application state when the app is initialized
// and we keep track of its changes by the notifications
// this way we avoid calling sharedApplication in a background thread
appState = self.sharedApplication.applicationState;
}
return self;
}

- (void)dealloc
{
[SentryDependencyContainer.sharedInstance.notificationCenterWrapper removeObserver:self];
}

- (UIApplication *)sharedApplication
{
Expand Down Expand Up @@ -58,7 +88,17 @@ - (UIApplication *)sharedApplication

- (UIApplicationState)applicationState
{
return self.sharedApplication.applicationState;
return appState;
}

- (void)didEnterBackground
{
appState = UIApplicationStateBackground;
}

- (void)didBecomeActive
{
appState = UIApplicationStateActive;
}

@end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@ import Foundation
import SentryTestUtils

@objcMembers public class TestNSNotificationCenterWrapper: SentryNSNotificationCenterWrapper {

var ignoreRemoveObserver = false

var addObserverInvocations = Invocations<(observer: Any, selector: Selector, name: NSNotification.Name)>()
public var addObserverInvocationsCount: Int {
return addObserverInvocations.count
Expand All @@ -24,6 +27,8 @@ import SentryTestUtils
return removeObserverInvocations.count
}
public override func removeObserver(_ observer: Any) {
removeObserverInvocations.record(observer)
if ignoreRemoveObserver == false {
removeObserverInvocations.record(observer)
}
}
}
26 changes: 26 additions & 0 deletions Tests/SentryTests/SentryUIApplicationTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,32 @@ class SentryUIApplicationTests: XCTestCase {

XCTAssertEqual(sut.windows?.count, 0)
}

@available(iOS 13.0, tvOS 13.0, *)
func test_ApplicationState() {
let notificationCenter = TestNSNotificationCenterWrapper()
notificationCenter.ignoreRemoveObserver = true
SentryDependencyContainer.sharedInstance().notificationCenterWrapper = notificationCenter

let sut = MockSentryUIApplicationTests()
XCTAssertEqual(sut.applicationState, .active)

notificationCenter.addObserverInvocations.invocations.forEach { (observer: Any, selector: Selector, name: NSNotification.Name) in
if name == UIApplication.didEnterBackgroundNotification {
sut.perform(selector, with: observer)
}
}

XCTAssertEqual(sut.applicationState, .background)

notificationCenter.addObserverInvocations.invocations.forEach { (observer: Any, selector: Selector, name: NSNotification.Name) in
if name == UIApplication.didBecomeActiveNotification {
sut.perform(selector, with: observer)
}
}

XCTAssertEqual(sut.applicationState, .active)
}

private class TestApplicationDelegate: NSObject, UIApplicationDelegate {
var window: UIWindow?
Expand Down

0 comments on commit dc0d331

Please sign in to comment.