2

私の iOS はBugsnagを使用しており、バージョン 4.1.0 からバージョン 5 にアップグレードしようとしています。

新しい SDK では、バージョン 4.x で使用できた機能が壊れています。

[[[Bugsnag configuration] metaData] mergeWith:parameters];

parametersのタイプはですNSDictionary

私はSDKに代替品を見つけることができませんでした.

- (void)addAttribute:(NSString*)attributeName withValue:(id)value toTabWithName:(NSString*)tabName

valueただし、それ自体である可能性がある場合と同じ機能は提供しませんNSDictionary。さらに、[self.delegate metaDataChanged:self]追加のたびに呼び出されます (非常に非効率的です)。

4

1 に答える 1

2

Github リポジトリを調べてBugsnagMetaDataバージョン間の違いを確認した後、この機能を復元する方法を見つけました。クラスを拡張するカテゴリを作成しました。

@interface BugsnagMetaData (BugsnagExtension)

- (void)mergeWith:(NSDictionary *)data;

@end

@implementation BugsnagMetaData (BugsnagExtension)

- (void)mergeWith:(NSDictionary *)data {
    @synchronized(self) {
        NSString *customDataKey = @"customData";
        [data enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL *stop) {
            NSMutableDictionary *destination = [self getTab:customDataKey];
            if ([value isKindOfClass:[NSDictionary class]]) {
                NSDictionary *source = value;
                [source enumerateKeysAndObjectsUsingBlock:^(id sourceKey, id sourceValue, BOOL *stop) {
                    if ([destination objectForKey:sourceKey] && [sourceValue isKindOfClass:[NSDictionary class]]) {
                        [[destination objectForKey:sourceKey] mergeWith:(NSDictionary *)sourceValue];
                    } else {
                        [destination setObject:sourceValue forKey:sourceKey];
                    }
                }];

            } else {
                [destination setObject:value forKey:key];
            }
        }];

        [self.delegate metaDataChanged:self];
    }
}

@end

この関数は、以前と同様に NSDictionary を含む NSDictionary を受け入れることができ、[self.delegate metaDataChanged:self]必要な場合にのみ効率的に呼び出します。

于 2016-02-28T13:14:00.853 に答える