无法识别的选择器+ [AFAnalytics sharedAnalytics]?

时间:2018-08-30 19:25:18

标签: xcode ios11 ios12

我目前正在为 iOS 12 准备好我的应用程序,但是,每当我点击任何UITextFieldUITextView时,应用程序都会崩溃,并且出现此无法识别的选择器错误。

我尝试过的

  • 他们的代表链接到文件所有者(是的,我知道-旧术语),但是它们与众不同,并在UIViewController中停止引用它,但是仍然会出现相同的崩溃和错误消息。
  • 添加了全新的UITextView / UITextField,但同样出现了崩溃错误。
  • 在网上到处搜索,但没有什么有用的东西。
  • 仅在 iOS 12 上崩溃。 iOS 11及更低版本可完美运行,没有问题。
  • 应用使用 Firebase Crashlytics / Fabric 和其他一些第三方库,这些库均使用最新的SDK / API版本。

我发现最近的事情是AFAnalytics.hAssistantServices.framework的一部分,而我在Xcode 10 Beta 6和公共Xcode 9中都找不到?

老实说,我已经开始用尽所有想法,因此,尝试解决此问题的任何帮助都是巨大的帮助。

我正在用Objective-C写作。

完整的堆栈跟踪:http://crashes.to/s/dd22fb06f7b


更新-2/09/2018 -奇怪的是,在界面生成器中将Keyboard Type设置为E-mail Address时,该字段可以正常工作。将其设置为其他任何东西都会使应用程序崩溃。


更新-14/9/2018 另一个崩溃日志似乎表明该错误与[UIDictationConnection analytics]有关?

这对任何人有意义吗? -这是Apple的当机报告。 enter image description here


更新-2018年2月10日 我发现了此错误消息:

Class AFAnalytics is implemented in both /Users/ashleyrichards/Library/Developer/CoreSimulator/Devices/C155EF28-3C0B-4AFF-9EF6-0235295A26DC/data/Containers/Bundle/Application/562B100D-F657-424E-8B77-99D0325F6035/Social Dummy.app/Social Dummy (0x10a33d610) and /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/AssistantServices.framework/AssistantServices (0x13654d178). One of the two will be used. Which one is undefined.

我已经搜索了整个项目,但是没有找到与AFAnalytics相关的任何类。 作为记录,我不想使用AFAnalytics。我什至不知道它是做什么的。如何摆脱它?

1 个答案:

答案 0 :(得分:5)

我找到了一种防止崩溃的解决方法。我们可以使用iOS运行时来混淆类方法。主要思想是将邮件从+[AFAnalytics sharedAnalytics]重定向到+[iOS12AFAnalyticsBug newSharedAnalytics]。类方法“ newSharedAnalytics”有意返回 nil ,消息为nil不会导致崩溃。但请谨慎使用此替代方法,因为您的应用中的某些代码出于某些目的使用AFAnalytics。

AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [iOS12AFAnalyticsBug fix];
    //your code
}

iOS12AFAnalyticsBug.h

@interface iOS12AFAnalyticsBug : NSObject

+ (void)fix;

@end

iOS12AFAnalyticsBug.m

#import "iOS12AFAnalyticsBug.h"
#include <objc/message.h>

void SwizzleClassMethod(Class originClass, SEL originSelector, Class destClass, SEL newSelector) {

    Method originMethod = class_getClassMethod(originClass, originSelector);
    Method newMethod = class_getClassMethod(destClass, newSelector);

    originClass = object_getClass((id)originClass);

    if (class_addMethod(originClass, originSelector, method_getImplementation(newMethod), method_getTypeEncoding(newMethod))) {
        class_replaceMethod(originClass, newSelector, method_getImplementation(originMethod), method_getTypeEncoding(originMethod));
    } else {
        method_exchangeImplementations(originMethod, newMethod);
    }
}

@implementation iOS12AFAnalyticsBug

+ (instancetype)newSharedAnalytics {

    return nil; //All messages to nil won't cause a crash

}

+ (void)fix {

    Class originClass = NSClassFromString(@"AFAnalytics");
    SEL originSelector = NSSelectorFromString(@"sharedAnalytics");

    SwizzleClassMethod(originClass, originSelector, self.class, @selector(newSharedAnalytics));
}

@end