如何在iOS / OS X Today视图扩展中使用Crashlytics?

28

由于今天扩展以单独的进程运行,因此我确定它们默认不会记录任何崩溃。 我认为我们需要单独在小部件中初始化Crashlytics。例如,在TodayViewController的viewDidLoad方法中。

  • 有人已经在iOS / OS X扩展中使用Crashlytics吗? 如果是这样,你是怎么实现的?
  • 我也想知道是否有意义为扩展创建一个单独的Crashlytics应用程序。

我几乎无法在扩展中使用任何东西(Flurry不起作用,crashlytics不起作用,甚至我有一个带有一些断言宏的.h文件也不起作用...) - wolffan
这是一个关于Crashlytics的支持问题。请直接联系他们。 - Kerni
@wolffan 到目前为止,这令人失望。 - martn_st
据我所知,他们要求人们在StackOverflow上使用他们的标签创建问题。然而,我现在找不到引用了...所以我可能是错的。 - martn_st
5个回答

30

Crashlytics支持团队联系了我并提供了以下步骤。我测试了它们,现在我的iOS 8应用程序可以正常工作。

  1. 将Crashlytics运行脚本构建阶段添加到您的扩展目标中(复制/粘贴与您添加到主应用程序中的相同内容)

  2. Crashlytics.framework添加到您的扩展链接库中 (例如,在其文件检查器中简单地检查扩展目标)

  3. Crashlytics.startWithAPIKey("yourApiKey")添加到您的扩展视图控制器的initWithCoder方法中。 (在苹果的今天扩展模板中,默认为TodayViewController

    > 如果您还没有initWithCoder方法,那么它之后应该看起来像这样:

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        Crashlytics.startWithAPIKey("yourApiKey")
    }
    

1
忘了提到:由于每个扩展都需要有自己的捆绑标识符,Crashlytics会在仪表板上单独创建一个应用程序。 - martn_st
这个对我来说有50%的失败率。可能是由于多个扩展(Today和Watch)的问题。基本上,我需要一直重建我的项目,因为它会由于Crashlytics每隔一段时间找不到dSYM而失败。 - cyphers
怎么会这样?我在 init(coder aDecoder: NSCoder) 中执行了 Fabric.with([Crashlytics.self]),它说 [Fabric] [Fabric +with] called multiple times. Only the first call is honored, please pass all kits you wish to initialize - Oleksii Nezhyborets
Crashlytics在应用程序扩展上发生崩溃时是否调用CrashlyticsDelegate?https://stackoverflow.com/q/61801745/9636 - Heath Borders

8

这是 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 运行脚本 复制到构建阶段中的您的Today Extension目标,并从主应用程序的info plist中复制Fabric条目到您的Today Extension的info plist中


这是我忘记的事情:“将 Fabric Run Script 复制到构建阶段以针对您的 Today Extension 目标”。 - Constantin Saulenco

6

这里是官方说明如何在iOS扩展中使用Crashlytics:

  • 将以下代码添加到您的viewControllerinitWithCoder方法中:Fabric.with([Crashlytics.self])
  • 从您的主应用程序的Info.plist中复制“Fabric”字典,并粘贴到您的扩展的Info.plist中。
  • 从您的主应用程序的目标中复制/粘贴Run Script Build Phase到您的扩展的Run Script Build Phase中。

然后...你就可以使用了!


1
另一个槽点:您必须在 Fabric 仪表板中启用“Answers”扩展。不知道该信息是否包含在上面链接的说明中,因为当我跟随链接时,我看到“抱歉,您无权访问该主题!”。 - bfx

5

如果您想将Crashlytics添加到iOS 8.0+的共享扩展中,maremmle的答案也适用。只需记得将[Crashlytics startWithAPIKey:@"apiKey"];放在您的第一个ViewController的init方法中。


1
感谢您提供的所有指导,它在我的分享扩展中很好地运行。
我确实注意到对于我的分享扩展,Fabric Answers 仪表板没有显示以下实际数据: 1. 活跃用户 2. 每个用户在应用程序中花费的中位总时间
但是伴随应用程序可以显示这些数据。 因此,我想知道 Answers SDK 如何确定这些数据。最合理的方法似乎是监控 UIApplication 通知。 由于扩展的生命周期与 ViewController 相关联,这些 UIApplication 通知不会被发布。因此,Fabric 不知道何时扩展处于活动状态。
所以我实施了以下解决方案,在 Fabric 仪表板中提供了上述数据。
  1. 在扩展的主视图控制器中的 'viewDidLoad' 中,发布 UIApplicationDidBecomeActiveNotification,这将触发 Fabric 的启动。
  2. 在关闭扩展之前(通过 completeRequestReturningItems:completionHandler:cancelRequestWithError:),发布 UIApplicationWillResignActiveNotification。这将触发 Fabric 的停止。

请注意,在设备上执行操作和数据在仪表板上可见之间存在延迟。 特别是对于活跃用户。它需要大约20-30秒才能呈现扩展程序。但是当扩展被关闭时,可能需要多达5分钟才能减少活跃用户数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接