Skip to content

Commit d405194

Browse files
authored
Merge pull request #3 from icerockdev/#2-ios-crash-at-init
#2 ios crash at init
2 parents 7cf9d4d + ec61255 commit d405194

File tree

14 files changed

+190
-151
lines changed

14 files changed

+190
-151
lines changed

MCRCDynamicProxy.podspec

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
Pod::Spec.new do |spec|
2+
spec.name = 'MCRCDynamicProxy'
3+
spec.version = '0.1.0'
4+
spec.homepage = 'https://github.com/icerockdev/moko-crash-reporting'
5+
spec.source = { :git => "https://github.com/icerockdev/moko-crash-reporting.git", :tag => "release/#{spec.version}" }
6+
spec.authors = 'IceRock Development'
7+
spec.license = { :type => 'Apache 2', :file => 'LICENSE.md' }
8+
spec.summary = 'summary'
9+
spec.module_name = "#{spec.name}"
10+
11+
spec.ios.deployment_target = '11.0'
12+
spec.swift_version = '5'
13+
14+
spec.source_files = "crash-reporting-crashlytics/src/iosMain/swift/DynamicProxy/**/*.{h,m,swift}"
15+
end

MCRCStaticReporter.podspec

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
Pod::Spec.new do |spec|
2+
spec.name = 'MCRCStaticReporter'
3+
spec.version = '0.1.0'
4+
spec.homepage = 'https://github.com/icerockdev/moko-crash-reporting'
5+
spec.source = { :git => "https://github.com/icerockdev/moko-crash-reporting.git", :tag => "release/#{spec.version}" }
6+
spec.authors = 'IceRock Development'
7+
spec.license = { :type => 'Apache 2', :file => 'LICENSE.md' }
8+
spec.summary = 'summary'
9+
spec.module_name = "#{spec.name}"
10+
11+
spec.ios.deployment_target = '11.0'
12+
spec.swift_version = '5'
13+
spec.static_framework = true
14+
15+
spec.dependency 'FirebaseCrashlytics', '~> 7.3'
16+
spec.dependency 'MCRCDynamicProxy'
17+
18+
spec.source_files = "crash-reporting-crashlytics/src/iosMain/swift/StaticReporter/**/*.{h,m,swift}"
19+
end

README.md

Lines changed: 21 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
![moko-crash-reporting](https://user-images.githubusercontent.com/701307/98216339-818ef400-1f7b-11eb-9273-083389b0f3b9.png)
22
[![GitHub license](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg?style=flat)](http://www.apache.org/licenses/LICENSE-2.0) [![Download]
3-
![kotlin-version](https://img.shields.io/badge/kotlin-1.4.10-orange)
3+
![kotlin-version](https://img.shields.io/badge/kotlin-1.4.21-orange)
44

55
# Mobile Kotlin crash report
66

@@ -29,6 +29,8 @@ This is a Kotlin MultiPlatform library that provides reporting fatal and non-fat
2929
## Versions
3030
- kotlin 1.4.10
3131
- 0.1.0
32+
- kotlin 1.4.21
33+
- 0.1.1
3234

3335
## Installation
3436
root build.gradle
@@ -43,9 +45,8 @@ allprojects {
4345
project build.gradle
4446
```groovy
4547
dependencies {
46-
commonMainApi("dev.icerock.moko:crash-reporting-core:0.1.0")
47-
commonMainApi("dev.icerock.moko:crash-reporting-crashlytics:0.1.0") // for CrashlyticsLogger
48-
commonMainApi("dev.icerock.moko:crash-reporting-napier:0.1.0") // for CrashReportingAntilog
48+
commonMainImplementation("dev.icerock.moko:crash-reporting-crashlytics:0.1.1") // for CrashlyticsLogger
49+
commonMainImplementation("dev.icerock.moko:crash-reporting-napier:0.1.1") // for CrashReportingAntilog
4950
commonMainImplementation("com.github.aakira:napier:1.4.1") // for CrashReportingAntilog
5051
}
5152
```
@@ -56,34 +57,29 @@ With [mobile-multiplatform-gradle-plugin](https://github.com/icerockdev/mobile-m
5657
cocoaPods {
5758
podsProject = file("ios-app/Pods/Pods.xcodeproj")
5859

59-
pod("GoogleUtilities", onlyLink = false)
60-
pod("FirebaseCrashlytics", onlyLink = true)
60+
pod("MCRCDynamicProxy", onlyLink = true)
6161
}
6262
```
6363
project Podfile
6464
```ruby
65-
pod 'Firebase', '6.33.0'
66-
pod 'FirebaseCrashlytics', '4.6.1'
65+
pod 'MCRCDynamicProxy', :git => 'https://github.com/icerockdev/moko-crash-reporting.git', :tag => 'release/0.1.1'
66+
pod 'MCRCStaticReporter', :git => 'https://github.com/icerockdev/moko-crash-reporting.git', :tag => 'release/0.1.1'
67+
```
6768

68-
# Firebase libraries already linked in moko-crash-reporting. Remove duplicated linking.
69-
post_install do |installer|
70-
host_targets = installer.aggregate_targets.select { |aggregate_target|
71-
aggregate_target.name.include? "Pods-"
72-
}
69+
On iOS side add to `AppDelegate`:
70+
```swift
71+
import FirebaseCore
72+
import MCRCStaticReporter
73+
74+
...
7375

74-
host_targets.each do |host_target|
75-
host_target.xcconfigs.each do |config_name, config_file|
76-
config_file.frameworks.delete("FirebaseCore")
77-
config_file.frameworks.delete("FirebaseCrashlytics")
78-
config_file.frameworks.delete("FirebaseInstallations")
79-
config_file.frameworks.delete("GoogleDataTransport")
80-
81-
xcconfig_path = host_target.xcconfig_path(config_name)
82-
config_file.save_as(xcconfig_path)
83-
end
84-
end
85-
end
76+
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil) -> Bool {
77+
FirebaseApp.configure()
78+
MokoFirebaseCrashlytics.setup()
79+
...
80+
}
8681
```
82+
8783
## Usage
8884

8985
### CrashlyticsLogger

buildSrc/build.gradle.kts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
*/
44

55
plugins {
6-
id("org.jetbrains.kotlin.jvm") version("1.4.10")
6+
id("org.jetbrains.kotlin.jvm") version("1.4.21")
77
}
88

99
repositories {
@@ -14,7 +14,7 @@ repositories {
1414
}
1515

1616
dependencies {
17-
implementation("dev.icerock:mobile-multiplatform:0.8.0")
18-
implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.10")
17+
implementation("dev.icerock:mobile-multiplatform:0.9.0")
18+
implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.21")
1919
implementation("com.android.tools.build:gradle:4.0.1")
2020
}

buildSrc/src/main/kotlin/Deps.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@
33
*/
44

55
object Deps {
6-
7-
private const val kotlinVersion = "1.4.10"
86
private const val detektVersion = "1.7.4"
97

108
private const val androidAppCompatVersion = "1.1.0"
@@ -16,7 +14,7 @@ object Deps {
1614
private const val firebaseCoreVersion = "17.4.3"
1715
private const val firebaseCrashlyticsVersion = "17.1.0"
1816

19-
const val mokoCrashReportingVersion = "0.1.0"
17+
const val mokoCrashReportingVersion = "0.1.1"
2018

2119

2220
object Android {

crash-reporting-crashlytics/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,5 +35,5 @@ publishing {
3535
cocoaPods {
3636
podsProject = file("../sample/ios-app/Pods/Pods.xcodeproj")
3737

38-
pod("FirebaseCrashlytics", onlyLink = false)
38+
pod("MCRCDynamicProxy")
3939
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/*
2+
* Copyright 2020 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license.
3+
*/
4+
5+
import Foundation
6+
7+
@objc
8+
public class FirebaseDynamicProxy: NSObject {
9+
@objc
10+
public static var reporter: FirebaseCrashlyticsReporter? = nil
11+
}
12+
13+
@objc
14+
public protocol FirebaseCrashlyticsReporter {
15+
func setUserId(userId: String)
16+
func setCustomValue(value: String, forKey: String)
17+
func recordException(name: String, reason: String, stackTrace: [UInt])
18+
func log(message: String)
19+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/*
2+
* Copyright 2020 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license.
3+
*/
4+
5+
import FirebaseCrashlytics
6+
import MCRCDynamicProxy
7+
8+
public class MokoFirebaseCrashlytics: FirebaseCrashlyticsReporter {
9+
public func setUserId(userId: String) {
10+
Crashlytics.crashlytics().setUserID(userId)
11+
}
12+
13+
public func setCustomValue(value: String, forKey: String) {
14+
Crashlytics.crashlytics().setCustomValue(value, forKey: forKey)
15+
}
16+
17+
public func recordException(name: String, reason: String, stackTrace: [UInt]) {
18+
let exceptionModel = ExceptionModel(
19+
name: name,
20+
reason: reason
21+
)
22+
let stackFrames = stackTrace.map {
23+
StackFrame(address: $0)
24+
}
25+
26+
exceptionModel.stackTrace = stackFrames
27+
28+
Crashlytics.crashlytics().record(exceptionModel: exceptionModel)
29+
}
30+
31+
public func log(message: String) {
32+
Crashlytics.crashlytics().log(message)
33+
}
34+
35+
public static func setup() {
36+
FirebaseDynamicProxy.reporter = MokoFirebaseCrashlytics()
37+
}
38+
}
Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,40 @@
11
package dev.icerock.moko.crashreporting.crashlytics
22

3-
import cocoapods.FirebaseCrashlytics.FIRCrashlytics
4-
import cocoapods.FirebaseCrashlytics.FIRExceptionModel
5-
import cocoapods.FirebaseCrashlytics.FIRStackFrame
3+
import cocoapods.MCRCDynamicProxy.FirebaseCrashlyticsReporterProtocol
4+
import cocoapods.MCRCDynamicProxy.FirebaseDynamicProxy
65
import dev.icerock.moko.crashreporting.core.CrashReportingCore
76
import dev.icerock.moko.crashreporting.core.ExceptionLogger
87
import dev.icerock.moko.crashreporting.core.getStackTrace
98

109
actual class CrashlyticsLogger actual constructor() : ExceptionLogger {
10+
private val reporter: FirebaseCrashlyticsReporterProtocol = FirebaseDynamicProxy.reporter()
11+
?: throw IllegalStateException("MokoFirebaseCrashlytics.setup() should be called in swift before creating CrashlyticsLogger")
12+
1113
override fun log(message: String) {
12-
FIRCrashlytics.crashlytics().log(message)
14+
reporter.logWithMessage(message)
1315
}
1416

1517
@ExperimentalUnsignedTypes
1618
override fun recordException(throwable: Throwable) {
1719
val crashReportingCore = CrashReportingCore
1820
val name = crashReportingCore.getExceptionName(throwable)
1921
val stackTrace = crashReportingCore.getStackTrace(throwable)
20-
val exceptionModel = FIRExceptionModel.exceptionModelWithName(
22+
23+
reporter.recordExceptionWithName(
2124
name = name,
22-
reason = throwable.message.orEmpty()
25+
reason = throwable.message.orEmpty(),
26+
stackTrace = stackTrace
2327
)
24-
val stackFrames = stackTrace.map {
25-
FIRStackFrame.stackFrameWithAddress(address = it.toULong())
26-
}
27-
28-
exceptionModel.stackTrace = stackFrames
29-
30-
FIRCrashlytics.crashlytics().recordExceptionModel(exceptionModel)
3128
}
3229

3330
override fun setCustomValue(value: String, forKey: String) {
34-
FIRCrashlytics.crashlytics().setCustomValue(value = value, forKey = forKey)
31+
reporter.setCustomValueWithValue(
32+
value = value,
33+
forKey = forKey
34+
)
3535
}
3636

3737
override fun setUserId(userId: String) {
38-
FIRCrashlytics.crashlytics().setUserID(userId)
38+
reporter.setUserIdWithUserId(userId)
3939
}
4040
}

sample/ios-app/Podfile

Lines changed: 3 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -12,25 +12,7 @@ install! 'cocoapods', :disable_input_output_paths => true
1212

1313
target 'TestProj' do
1414
pod 'MultiPlatformLibrary', :path => '../mpp-library'
15-
pod 'Firebase', '6.33.0'
16-
pod 'FirebaseCrashlytics', '4.6.1'
17-
18-
# Firebase libraries already linked in moko-crash-reporting. Remove duplicated linking.
19-
post_install do |installer|
20-
host_targets = installer.aggregate_targets.select { |aggregate_target|
21-
aggregate_target.name.include? "Pods-"
22-
}
23-
24-
host_targets.each do |host_target|
25-
host_target.xcconfigs.each do |config_name, config_file|
26-
config_file.frameworks.delete("FirebaseCore")
27-
config_file.frameworks.delete("FirebaseCrashlytics")
28-
config_file.frameworks.delete("FirebaseInstallations")
29-
config_file.frameworks.delete("GoogleDataTransport")
30-
31-
xcconfig_path = host_target.xcconfig_path(config_name)
32-
config_file.save_as(xcconfig_path)
33-
end
34-
end
35-
end
15+
16+
pod 'MCRCDynamicProxy', :path => '../..'
17+
pod 'MCRCStaticReporter', :path => '../..'
3618
end

0 commit comments

Comments
 (0)