어떻게 당신의 AppDelegate 다이어트를
이런 코드를 본 적이 있어요.
Appdelegate.m
[UMSocialData setAppKey:UMENG_APPKEY];
// log
[UMSocialData openLog:YES];
//
[WXApi registerApp:WXAppId];
// AppId, url,
[UMSocialWechatHandler setWXAppId:WXAppId appSecret:WXAppSecret url:UMSocialShareUrl];
[UMSocialQQHandler setQQWithAppId:WXQQId appKey:WXQQKey url:UMSocialShareUrl];
//
[UMSocialSinaHandler openSSOWithRedirectURL:SinaRedirectURL];
// SSO
[UMSocialQQHandler setSupportWebView:YES];
。。。
。。。
Push
......
......
....
。。。。
App delegate 안에 물건이 쌓여 있어 스스로 보기만 해도 머리가 아프다.처음에는 동맹 공유만 추가했을 수도 있었기 때문에 회사에서 Jpush를 추가한 다음에 Appdelegate에 계속 추가했고 나중에...무궁무진한 수요, 그리고 Appdelegate는 차마 직시할 수 없었다.
AppDelegate 다이어트
ViewController는 관리자 클래스를 통해 살을 뺄 수 있는 만큼 앱데일리게이트에 활용할 수 있을까. 물론이다.동맹의 초기화와 유사하게 우리는 이렇게 할 수 있다- (void)launchApp:(UIApplication *)application withOptions:(NSDictionary *)launchOptions {
[UMManager getInstance];
}
그리고 다시 한 번 UMM 관리자의 예를 써서 위에 있는 Appdelegate 안의 동맹 통계 코드를 UMM 관리자에서 실현한다.@implementation UMManager
+ (UMManager *)getInstance{
static UMManager *sharedInstance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
- (id)init{
if (self = [super init]) {
[self setUM];
}
return self;
}
- (void)setUM
{
[UMSocialData setAppKey:UMENG_APPKEY];
// log
[UMSocialData openLog:YES];
//
[WXApi registerApp:WXAppId];
// AppId, url,
[UMSocialWechatHandler setWXAppId:WXAppId appSecret:WXAppSecret url:UMSocialShareUrl];
[UMSocialQQHandler setQQWithAppId:WXQQId appKey:WXQQKey url:UMSocialShareUrl];
//
[UMSocialSinaHandler openSSOWithRedirectURL:SinaRedirectURL];
// SSO
[UMSocialQQHandler setSupportWebView:YES];
}
@end
이렇게 하면 AppDelegate가 훨씬 깨끗해 보인다.그 외에 더 중요한 것은 Method Swizzing을 통해 App Delegate의 살을 빼는 것이다
Method Swizzing을 통해 App Delegate의 살을 빼줍니다.
Method Swizzing에 관해서는 Objective-C Runtime가 실행될 때의 4가지 글이 있습니다. Method Swizzling Objective-C Method Swizling의 가장 좋은 실천입니다.@implementation AppDelegate (PushManager)
+ (void)load
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
Class class = [self class];
swizzleMethod(class, @selector(application:didFinishLaunchingWithOptions:),
@selector(aop_application:didFinishLaunchingWithOptions:));
swizzleMethod(class, @selector(application:didRegisterForRemoteNotificationsWithDeviceToken:),
@selector(aop_application:didRegisterForRemoteNotificationsWithDeviceToken:));
swizzleMethod(class, @selector(application:didFailToRegisterForRemoteNotificationsWithError:),
@selector(aop_application:didFailToRegisterForRemoteNotificationsWithError:));
swizzleMethod(class, @selector(application:didReceiveRemoteNotification:),
@selector(aop_application:didReceiveRemoteNotification:));
swizzleMethod(class, @selector(application:didReceiveRemoteNotification:fetchCompletionHandler:),
@selector(aop_application:didReceiveRemoteNotification:fetchCompletionHandler:));
});
}
static inline void swizzleMethod(Class class, SEL originalSelector, SEL swizzledSelector) {
Method originalMethod = class_getInstanceMethod(class, originalSelector);
Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);
BOOL didAddMethod =
class_addMethod(class,
originalSelector,
method_getImplementation(swizzledMethod),
method_getTypeEncoding(swizzledMethod));
if (didAddMethod) {
class_replaceMethod(class,
swizzledSelector,
method_getImplementation(originalMethod),
method_getTypeEncoding(originalMethod));
} else {
method_exchangeImplementations(originalMethod, swizzledMethod);
}
}
- (BOOL)aop_application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[self setUpJPushManagerWithOptions:launchOptions];
BOOL result = [self aop_application:application didFinishLaunchingWithOptions:launchOptions];
NSDictionary *userInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if(userInfo)
{
//
[self pushDispatch:userInfo];
}
return result;
}
// push
- (void)aop_application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
[self aop_application:application didRegisterForRemoteNotificationsWithDeviceToken:deviceToken];
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
NSString *tokenStr = [NSString stringWithFormat:@"%@",deviceToken];
[ud setObject:tokenStr forKey:@"deviceToken"];
[ud synchronize];
UI_LOG(@"deviceToken = %@", tokenStr);
// Required
[APService registerDeviceToken:deviceToken];
}
// push
- (void)aop_application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
{
[self aop_application:application didFailToRegisterForRemoteNotificationsWithError:error];
}
// iOS7
- (void)aop_application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
[self aop_application:application didReceiveRemoteNotification:userInfo];
}
// iOS8
- (void)aop_application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
[self aop_application:application didReceiveRemoteNotification:userInfo fetchCompletionHandler:completionHandler];
}
......
......
어떤 이는 Method Swzzing은 사용하기에 시원하고 잘 쓰지 못하면 문제가 생길 뿐만 아니라 조사도 어렵다고 말한다.나는 일찍이 인터넷에서 이런 말을 본 적이 있어 매우 고전적이라고 느낀다.여러분께 공유할 수 있습니다.
Method Swzzing은 마치 날카로운 칼과 같아서 날카로운 칼로 채소를 썰면 시원하지만 손을 베기 쉽다.너는 칼이 날카롭다고 해서 쓰지 않아도 된다.반대로 무딘 칼을 사용하면 위험이 더 클 수 있다.단일 디자인 모델처럼 논란이 많았지만 여전히 많은 사람들이 사용하고 있다.
여기에는 Method Swzzing에 대한 Stack Over Flow의 토론이 있습니다.
What are the Dangers of Method Swizzling in Objective C?
어쨌든 우리는 이 날카로운 칼을 잘 쓰는 것을 배워야 한다. 버려서는 안 된다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSON
JSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다.
그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다.
저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
- (void)launchApp:(UIApplication *)application withOptions:(NSDictionary *)launchOptions {
[UMManager getInstance];
}
@implementation UMManager
+ (UMManager *)getInstance{
static UMManager *sharedInstance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
- (id)init{
if (self = [super init]) {
[self setUM];
}
return self;
}
- (void)setUM
{
[UMSocialData setAppKey:UMENG_APPKEY];
// log
[UMSocialData openLog:YES];
//
[WXApi registerApp:WXAppId];
// AppId, url,
[UMSocialWechatHandler setWXAppId:WXAppId appSecret:WXAppSecret url:UMSocialShareUrl];
[UMSocialQQHandler setQQWithAppId:WXQQId appKey:WXQQKey url:UMSocialShareUrl];
//
[UMSocialSinaHandler openSSOWithRedirectURL:SinaRedirectURL];
// SSO
[UMSocialQQHandler setSupportWebView:YES];
}
@end
Method Swizzing에 관해서는 Objective-C Runtime가 실행될 때의 4가지 글이 있습니다. Method Swizzling Objective-C Method Swizling의 가장 좋은 실천입니다.
@implementation AppDelegate (PushManager)
+ (void)load
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
Class class = [self class];
swizzleMethod(class, @selector(application:didFinishLaunchingWithOptions:),
@selector(aop_application:didFinishLaunchingWithOptions:));
swizzleMethod(class, @selector(application:didRegisterForRemoteNotificationsWithDeviceToken:),
@selector(aop_application:didRegisterForRemoteNotificationsWithDeviceToken:));
swizzleMethod(class, @selector(application:didFailToRegisterForRemoteNotificationsWithError:),
@selector(aop_application:didFailToRegisterForRemoteNotificationsWithError:));
swizzleMethod(class, @selector(application:didReceiveRemoteNotification:),
@selector(aop_application:didReceiveRemoteNotification:));
swizzleMethod(class, @selector(application:didReceiveRemoteNotification:fetchCompletionHandler:),
@selector(aop_application:didReceiveRemoteNotification:fetchCompletionHandler:));
});
}
static inline void swizzleMethod(Class class, SEL originalSelector, SEL swizzledSelector) {
Method originalMethod = class_getInstanceMethod(class, originalSelector);
Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);
BOOL didAddMethod =
class_addMethod(class,
originalSelector,
method_getImplementation(swizzledMethod),
method_getTypeEncoding(swizzledMethod));
if (didAddMethod) {
class_replaceMethod(class,
swizzledSelector,
method_getImplementation(originalMethod),
method_getTypeEncoding(originalMethod));
} else {
method_exchangeImplementations(originalMethod, swizzledMethod);
}
}
- (BOOL)aop_application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[self setUpJPushManagerWithOptions:launchOptions];
BOOL result = [self aop_application:application didFinishLaunchingWithOptions:launchOptions];
NSDictionary *userInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if(userInfo)
{
//
[self pushDispatch:userInfo];
}
return result;
}
// push
- (void)aop_application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
[self aop_application:application didRegisterForRemoteNotificationsWithDeviceToken:deviceToken];
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
NSString *tokenStr = [NSString stringWithFormat:@"%@",deviceToken];
[ud setObject:tokenStr forKey:@"deviceToken"];
[ud synchronize];
UI_LOG(@"deviceToken = %@", tokenStr);
// Required
[APService registerDeviceToken:deviceToken];
}
// push
- (void)aop_application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
{
[self aop_application:application didFailToRegisterForRemoteNotificationsWithError:error];
}
// iOS7
- (void)aop_application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
[self aop_application:application didReceiveRemoteNotification:userInfo];
}
// iOS8
- (void)aop_application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
[self aop_application:application didReceiveRemoteNotification:userInfo fetchCompletionHandler:completionHandler];
}
......
......
어떤 이는 Method Swzzing은 사용하기에 시원하고 잘 쓰지 못하면 문제가 생길 뿐만 아니라 조사도 어렵다고 말한다.나는 일찍이 인터넷에서 이런 말을 본 적이 있어 매우 고전적이라고 느낀다.여러분께 공유할 수 있습니다.
Method Swzzing은 마치 날카로운 칼과 같아서 날카로운 칼로 채소를 썰면 시원하지만 손을 베기 쉽다.너는 칼이 날카롭다고 해서 쓰지 않아도 된다.반대로 무딘 칼을 사용하면 위험이 더 클 수 있다.단일 디자인 모델처럼 논란이 많았지만 여전히 많은 사람들이 사용하고 있다.
여기에는 Method Swzzing에 대한 Stack Over Flow의 토론이 있습니다.
What are the Dangers of Method Swizzling in Objective C?
어쨌든 우리는 이 날카로운 칼을 잘 쓰는 것을 배워야 한다. 버려서는 안 된다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.