最近項(xiàng)目中把以前的各個(gè)第三方分享統(tǒng)一使用友盟SDK管理, 發(fā)現(xiàn)一個(gè)問題就是分享facebook一直失敗. 而且是在分享圖片的時(shí)候失敗, 分享網(wǎng)頁的時(shí)候是可以的
分享失敗的時(shí)候一直報(bào)錯(cuò):
[core] isAvailableForServiceType: for com.apple.social.facebook returning NO
這句話不是我打印的, 我猜想是不是友盟內(nèi)部的代碼做了這個(gè)操作, 但是我又拿不到友盟的代碼, 查了很多資料, 都沒說到點(diǎn)子上. 但是怎么解決這個(gè)問題呢?
我發(fā)現(xiàn)isAvailableForServiceType
這個(gè)方法是系統(tǒng)框架Social
框架里SLComposeViewController
的方法, 于是我寫了一個(gè)SLComposeViewController
的分類, 對(duì)isAvailableForServiceType
進(jìn)行了方法交換, 因?yàn)橹皩懛椒ń粨Q都寫的是對(duì)象方法的方法交換, 所以類方法交換老是不成功, 參考了一下網(wǎng)上的方法, 找到了答案:
以下是我的代碼:
#import <Social/Social.h>
#import <objc/message.h>
#import "SLComposeViewController+TG_ShareExtension.h"
@implementation SLComposeViewController (TG_ShareExtension)
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
[objc_getClass("SLComposeViewController") tg_getOrigMenthod:@selector(isAvailableForServiceType:) swizzledMethod:@selector(tg_isAvailableForServiceType:)];
});
}
+ (BOOL)tg_getOrigMenthod:(SEL)orignalSel swizzledMethod:(SEL)swizzledSel{
Class kls = self;
Method origMethod = class_getClassMethod(kls, orignalSel);
Method altMethod = class_getClassMethod(kls, swizzledSel);
if (!origMethod || !altMethod) {
return NO;
}
Class metaClass = object_getClass(kls);
BOOL didAddMethod = class_addMethod(metaClass,orignalSel,
method_getImplementation(altMethod),
method_getTypeEncoding(altMethod));
if (didAddMethod) {
class_replaceMethod(metaClass,swizzledSel,
method_getImplementation(origMethod),
method_getTypeEncoding(origMethod));
} else {
method_exchangeImplementations(origMethod, altMethod);
}
return YES;
}
+ (BOOL)tg_isAvailableForServiceType:(NSString *)serviceType {
if ([serviceType isEqualToString:@"com.apple.social.facebook"]) {
return YES;
}
return [self tg_isAvailableForServiceType:serviceType];
}
@end
核心就是當(dāng)serviceType
是facebook時(shí), 始終返回YES, 于是解決了這個(gè)問題. 類方法交換只是一個(gè)工具, 解決問題的思路才是關(guān)鍵.