由于今天的扩展作为一个单独的进程运行,我相信他们不会记录任何开箱即用的崩溃。我假设我们需要分别在小部件上初始化 Crashlytics。例如viewDidLoad
在TodayViewController
.
- 是否有人已经在任何 iOS / OS X 扩展中使用 Crashlytics?如果是这样,您是如何实施的?
- 我还想知道在 Crashlytics 中为扩展创建一个单独的应用程序是否有意义。
由于今天的扩展作为一个单独的进程运行,我相信他们不会记录任何开箱即用的崩溃。我假设我们需要分别在小部件上初始化 Crashlytics。例如viewDidLoad
在TodayViewController
.
Crashlytics 支持与我联系并提供了这些步骤。我对它们进行了测试,现在它适用于我的 iOS 8 应用程序。
将 Crashlytics Run Script Build Phase 添加到您的扩展程序的目标中(复制/粘贴您添加到主应用程序的内容)
添加Crashlytics.framework
到您的扩展的链接库(例如,只需在其文件检查器中检查扩展目标)
添加Crashlytics.startWithAPIKey("yourApiKey")
到您的扩展的视图控制器的initWithCoder
方法。(在 Apple 的今日扩展模板中 TodayViewController
,默认调用它)
> 如果你还没有initWithCoder
方法,之后应该是这样的:
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
Crashlytics.startWithAPIKey("yourApiKey")
}
这是 Twitter 自己的实现指南:
https://twittercommunity.com/t/integrate-fabric-crashlytics-with-ios-8-extension/28905
因此,复制库,例如,如果您使用的是 CocoaPods,您可以将 Fabric 和 Crashlytics 添加到 Extension 目标:
在 Podfile 中:
target :TodayExtension do
pod 'Fabric'
pod 'Crashlytics'
end
并运行pod install
。并且不要忘记设置Build Active Architecture Only
为NO
,否则您可能会收到链接器错误
然后在你的 TodayViewController 中:
#import <Fabric/Fabric.h>
#import <Crashlytics/Crashlytics.h>
...
-(id)initWithCoder:(NSCoder *)aDecoder {
self = [super initWithCoder:aDecoder];
[Fabric with:@[CrashlyticsKit]];
return self;
}
并将构建阶段中的 Fabric Run Script复制到您的 Today Extension 目标,并将主应用程序的 info plist 中的 Fabric 条目复制到 Today Extension 的 info plist
以下是官方说明如何在 iOS 扩展中使用 Crashlytics:
viewController
的initWithCoder
方法中Fabric.with([Crashlytics.self])
而且……你很高兴!
如果您想添加 Crashlytics 以在 iOS 8.0+ 上共享扩展,来自 maremmle 的回答也有效。只要记住从你的第一个 ViewController 中放入方法[Crashlytics startWithAPIKey:@"apiKey"];
。init
感谢您的所有说明,它在我的共享扩展中运行良好。
我确实注意到对于我的共享扩展,Fabric Answers 仪表板没有显示以下实际数据:
它适用于配套应用程序。所以我想知道 Answers SDK 将如何确定这一点。最合乎逻辑的似乎是监视 UIApplication 通知。由于扩展的生命周期与 ViewController 相关,因此不会发布这些 UIApplication 通知。因此 Fabric 不知道扩展程序何时处于活动状态。
所以我实现了以下解决方案,它在 Fabric Dashboard 中提供了上述数据:
请注意,设备上的操作与数据在仪表板中可见之间存在延迟。特别是对于活跃用户。扩展显示后大约需要 20-30 秒。但是,当扩展程序关闭时,可能需要 5分钟才能减少活动用户。