Нераспознанный селектор + [AFAnalytics sharedAnalytics]? - PullRequest
0 голосов
/ 30 августа 2018

В настоящее время я готовлю свое приложение для iOS 12 , однако, когда я нажимаю на любое UITextField или UITextView, приложение вылетает, и я получаю эту нераспознанную ошибку селектора.

Что я пробовал

  • Они являются делегатами, связанными с Владельцем файлов (да, я знаю - старый термин), но они не понравились всем и перестали ссылаться на него в UIViewController, но все равно получают то же сообщение о сбое и ошибке.
  • Добавлен новый UITextView / UITextField, но опять та же ошибка сбоя.
  • Искать везде в Интернете, но ничего полезного не было.
  • Вылетает только на iOS 12 . iOS 11 и ниже работают отлично, без проблем.
  • Приложение использует Firebase , Crashlytics / Fabric и некоторые другие сторонние библиотеки, использующие последнюю версию SDK / API.

Самое близкое, что я нашел, это то, что AFAnalytics.h является частью AssistantServices.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


ОБНОВЛЕНИЕ - 2/10/2018 Я обнаружил это сообщение об ошибке:

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 голосов
/ 14 октября 2018

Я нашел обходной путь, который предотвращает сбой. Мы можем использовать среду выполнения 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
...