1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
//
// AppDelegate+AppService.m
// MiAiApp
//
// Created by 徐阳 on 2017/5/19.
// Copyright © 2017年 徐阳. All rights reserved.
//
#import "AppDelegate+AppService.h"
#import <UMSocialCore/UMSocialCore.h>
#import "ZCLoginViewController.h"
#import "OpenUDID.h"
#import "IQKeyboardManager.h"
#import <YTKNetwork/YTKNetwork.h>
#import "AvoidCrash.h"
@implementation AppDelegate (AppService)
#pragma mark ————— 初始化服务 —————
-(void)initService{
//注册登录状态监听
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(loginStateChange:)
name:KNotificationLoginStateChange
object:nil];
//网络状态监听
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(netWorkStateChange:)
name:KNotificationNetWorkStateChange
object:nil];
}
#pragma mark ————— 初始化window —————
-(void)initWindow{
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.window.backgroundColor = KWhiteColor;
[self.window makeKeyAndVisible];
[[UIButton appearance] setExclusiveTouch:YES];
[UIActivityIndicatorView appearanceWhenContainedIn:[MBProgressHUD class], nil].color = KWhiteColor;
if (@available(iOS 11.0, *)){
[[UIScrollView appearance] setContentInsetAdjustmentBehavior:UIScrollViewContentInsetAdjustmentNever];
}
}
#pragma mark ————— 初始化网络配置 —————
-(void)NetWorkConfig{
YTKNetworkConfig *config = [YTKNetworkConfig sharedConfig];
config.baseUrl = URL_main;
}
#pragma mark ————— 初始化用户系统 —————
-(void)initUserManager{
//获取用户登录token
NSString *token = kSTRING([[NSUserDefaults standardUserDefaults] objectForKey:@"merchant_token"]);
if (token.length == 0) {
//没有登录过,展示登录页面
KPostNotification(KNotificationLoginStateChange, @NO)
}
else{
//有缓存到主页面,再更新用户信息
TokenInfo *tokenInfo = [[TokenInfo alloc] init];
tokenInfo.token = token;
[UserManager sharedUserManager].needUpdate = YES;
[UserManager sharedUserManager].tokenInfo = tokenInfo;
self.mainTabBar = [MainTabBarController new];
self.window.rootViewController = self.mainTabBar;
}
}
#pragma mark - ————— 开启防崩溃框架 —————
-(void)openAvoidCrash{
[AvoidCrash becomeEffective];
}
#pragma mark ————— 登录状态处理 —————
- (void)loginStateChange:(NSNotification *)notification
{
BOOL loginSuccess = [notification.object boolValue];
if (loginSuccess) {//登陆成功加载主窗口控制器
//为避免自动登录成功刷新tabbar
if (!self.mainTabBar || ![self.window.rootViewController isKindOfClass:[MainTabBarController class]]) {
self.mainTabBar = [MainTabBarController new];
CATransition *anima = [CATransition animation];
anima.type = @"fade";//设置动画的类型
anima.subtype = kCATransitionFade; //设置动画的方向
anima.duration = 0.3f;
self.window.rootViewController = self.mainTabBar;
[kAppWindow.layer addAnimation:anima forKey:@"revealAnimation"];
}
}else {//登陆失败加载登陆页面控制器
self.mainTabBar = nil;
RootNavigationController *loginNavi = [[RootNavigationController alloc] initWithRootViewController:[ZCLoginViewController new]];
CATransition *anima = [CATransition animation];
anima.type = @"fade";//设置动画的类型
anima.subtype = kCATransitionFromRight; //设置动画的方向
anima.duration = 0.3f;
self.window.rootViewController = loginNavi;
[kAppWindow.layer addAnimation:anima forKey:@"revealAnimation"];
}
//展示FPS
// [AppManager showFPS];
}
#pragma mark ————— 网络状态变化 —————
- (void)netWorkStateChange:(NSNotification *)notification
{
// BOOL isNetWork = [notification.object boolValue];
//
// if (isNetWork) {//有网络
// if ([userManager loadUserInfo] && !isLogin) {//有用户数据 并且 未登录成功 重新来一次自动登录
// [userManager autoLoginToServer:^(BOOL success, NSString *des) {
// if (success) {
// DLog(@"网络改变后,自动登录成功");
//// [MBProgressHUD showSuccessMessage:@"网络改变后,自动登录成功"];
// KPostNotification(KNotificationAutoLoginSuccess, nil);
// }else{
// [MBProgressHUD showErrorMessage:NSStringFormat(@"自动登录失败:%@",des)];
// }
// }];
// }
//
// }else {//登陆失败加载登陆页面控制器
// [MBProgressHUD showTopTipMessage:@"网络状态不佳" isWindow:YES];
// }
}
#pragma mark -————— 键盘弹出监听 —————
-(void)registerIQKeyboardManager{
IQKeyboardManager *manager = [IQKeyboardManager sharedManager];
manager.enable = YES;
manager.shouldResignOnTouchOutside = YES;
manager.shouldToolbarUsesTextFieldTintColor = YES;
manager.enableAutoToolbar = NO;
}
#pragma mark ————— 友盟 初始化 —————
-(void)initUMeng{
/* 打开调试日志 */
[[UMSocialManager defaultManager] openLog:YES];
/* 设置友盟appkey */
[[UMSocialManager defaultManager] setUmSocialAppkey:UMengKey];
[self configUSharePlatforms];
}
#pragma mark ————— 配置第三方 —————
-(void)configUSharePlatforms{
/* 设置微信的appKey和appSecret */
[[UMSocialManager defaultManager] setPlaform:UMSocialPlatformType_WechatSession appKey:kAppKey_Wechat appSecret:kSecret_Wechat redirectURL:nil];
/*
* 移除相应平台的分享,如微信收藏
*/
//[[UMSocialManager defaultManager] removePlatformProviderWithPlatformTypes:@[@(UMSocialPlatformType_WechatFavorite)]];
/* 设置分享到QQ互联的appID
* U-Share SDK为了兼容大部分平台命名,统一用appKey和appSecret进行参数设置,而QQ平台仅需将appID作为U-Share的appKey参数传进即可。
*/
[[UMSocialManager defaultManager] setPlaform:UMSocialPlatformType_QQ appKey:kAppKey_Tencent/*设置QQ平台的appID*/ appSecret:nil redirectURL:nil];
}
#pragma mark ————— OpenURL 回调 —————
// 支持所有iOS系统。注:此方法是老方法,建议同时实现 application:openURL:options: 若APP不支持iOS9以下,可直接废弃当前,直接使用application:openURL:options:
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
//6.3的新的API调用,是为了兼容国外平台(例如:新版facebookSDK,VK等)的调用[如果用6.2的api调用会没有回调],对国内平台没有影响
BOOL result = [[UMSocialManager defaultManager] handleOpenURL:url sourceApplication:sourceApplication annotation:annotation];
if (!result) {
// 其他如支付等SDK的回调
}
return result;
}
// NOTE: 9.0以后使用新API接口
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options
{
//6.3的新的API调用,是为了兼容国外平台(例如:新版facebookSDK,VK等)的调用[如果用6.2的api调用会没有回调],对国内平台没有影响
BOOL result = [[UMSocialManager defaultManager] handleOpenURL:url options:options];
if (!result) {
// 其他如支付等SDK的回调
if ([url.host isEqualToString:@"safepay"]) {
//跳转支付宝钱包进行支付,处理支付结果
// [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
// NSLog(@"result = %@",resultDic);
// }];
return YES;
}
// if ([OpenInstallSDK handLinkURL:url]){
// return YES;
// }
// //微信支付
// return [WXApi handleOpenURL:url delegate:[PayManager sharedPayManager]];
}
return result;
}
#pragma mark ————— 网络状态监听 —————
- (void)monitorNetworkStatus
{
// 网络状态改变一次, networkStatusWithBlock就会响应一次
[PPNetworkHelper networkStatusWithBlock:^(PPNetworkStatusType networkStatus) {
switch (networkStatus) {
// 未知网络
case PPNetworkStatusUnknown:
DLog(@"网络环境:未知网络");
// 无网络
case PPNetworkStatusNotReachable:
DLog(@"网络环境:无网络");
KPostNotification(KNotificationNetWorkStateChange, @NO);
break;
// 手机网络
case PPNetworkStatusReachableViaWWAN:
DLog(@"网络环境:手机自带网络");
// 无线网络
case PPNetworkStatusReachableViaWiFi:
DLog(@"网络环境:WiFi");
KPostNotification(KNotificationNetWorkStateChange, @YES);
break;
}
}];
}
+ (AppDelegate *)shareAppDelegate{
return (AppDelegate *)[[UIApplication sharedApplication] delegate];
}
-(UIViewController *)getCurrentVC{
UIViewController *result = nil;
UIWindow * window = [[UIApplication sharedApplication] keyWindow];
if (window.windowLevel != UIWindowLevelNormal)
{
NSArray *windows = [[UIApplication sharedApplication] windows];
for(UIWindow * tmpWin in windows)
{
if (tmpWin.windowLevel == UIWindowLevelNormal)
{
window = tmpWin;
break;
}
}
}
UIView *frontView = [[window subviews] objectAtIndex:0];
id nextResponder = [frontView nextResponder];
if ([nextResponder isKindOfClass:[UIViewController class]])
result = nextResponder;
else
result = window.rootViewController;
return result;
}
-(UIViewController *)getCurrentUIVC
{
UIViewController *superVC = [self getCurrentVC];
if ([superVC isKindOfClass:[UITabBarController class]]) {
UIViewController *tabSelectVC = ((UITabBarController*)superVC).selectedViewController;
if ([tabSelectVC isKindOfClass:[UINavigationController class]]) {
return ((UINavigationController*)tabSelectVC).viewControllers.lastObject;
}
return tabSelectVC;
}else
if ([superVC isKindOfClass:[UINavigationController class]]) {
return ((UINavigationController*)superVC).viewControllers.lastObject;
}
return superVC;
}
@end