// // JYNewSearchViewController.m // JianYuIOS // // Created by apple on 2020/6/5. // Copyright © 2020 lixianglan. All rights reserved. // #import "JYNewSubViewController.h" #import #import "JYTabBarController.h" #import @interface JYNewSubViewController () { BOOL refreshTabBool; CGPoint startTouch; BOOL _isMoving; } @property (nonatomic, strong) UIProgressView *progressView; @property (nonatomic, strong) WKWebView *webView; @property(nonatomic, assign)BOOL updateNotify; @property(nonatomic, strong)NoNetView *noNetView; @end NSString *const new_kInitVector_2 = @"1389461544135476"; size_t const new_kKeySize_2 = kCCKeySizeAES128; NSString *const new_AesKey_2 = @"mGlAgnIBB8bx2nch"; @implementation JYNewSubViewController -(void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self.navigationController setNavigationBarHidden:YES animated:animated]; if([GlobalData shareInstance].isReLogin) { [GlobalData shareInstance].isReLogin = NO; [self webViewFirstRequest]; }else { if([GlobalData shareInstance].subIsRed) { [GlobalData shareInstance].subIsRed = NO; [self webViewFirstRequest]; } } } //进度条 - (UIProgressView *)progressView { if (_progressView == nil) { _progressView = [[UIProgressView alloc] initWithFrame:CGRectMake(0,STATUS_BAR_HEIGHT - 2,WIDTH,2)]; _progressView.tintColor = [UIColor blueColor]; _progressView.trackTintColor = [UIColor whiteColor]; } return _progressView; } //懒加载 - (WKWebView *)webView { if(_webView == nil) { WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init]; config.preferences = [[WKPreferences alloc] init]; config.preferences.minimumFontSize = 0; config.preferences.javaScriptEnabled = YES; config.preferences.javaScriptCanOpenWindowsAutomatically = YES; //添加消息处理,注意:self指代的是需要遵守WKScriptMessageHandler协议,结束时需要移除 config.userContentController = [[WKUserContentController alloc] init]; //声明协议 NSArray *jsArr = @[@"loginByWeixin", @"share", @"saveUserToken", @"removeUserToken", @"openSystemNotification", @"openExternalLink", @"alert", @"hiddenBottom", @"checkLab", @"loginSuccess", @"backUrl", @"clearPushMessage", @"hideRedSpotOnMenu", @"showRedSpotOnMenu", @"wxPay", @"aliPay", @"skipCamera", @"skipAlbum", @"appTest", ]; for (NSString*jsName in jsArr) { [config.userContentController addScriptMessageHandler:self name:jsName]; } //高端的自定义配置创建WKWebView if (iPhoneX) { _webView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 0, WIDTH, HEIGHT-TAB_BAR_HEIGHT) configuration:config]; if (@available(iOS 11.0, *)) { _webView.scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; } }else { _webView = [[WKWebView alloc] initWithFrame:CGRectMake(0, -STATUS_BAR_HEIGHT, WIDTH, HEIGHT-TAB_BAR_HEIGHT+STATUS_BAR_HEIGHT) configuration:config]; } _webView.scrollView.bounces = NO; _webView.UIDelegate = self; _webView.navigationDelegate = self; // _webView.allowsBackForwardNavigationGestures = true; [_webView addObserver:self forKeyPath:@"estimatedProgress" options:NSKeyValueObservingOptionNew context:nil]; } return _webView; } -(void)webViewFirstRequest { NSString *url = [NSString stringWithFormat:@"%@%@", kHost, @"jyapp/swordfish/historypush"]; url = [url stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]; NSLog(@"222 :第一次加载:%@",url); kMainQueue(^{ [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:url]]]; }) } #pragma mark - event response // 计算wkWebView进度条 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if (object == self.webView && [keyPath isEqualToString:@"estimatedProgress"]) { CGFloat newprogress = [[change objectForKey:NSKeyValueChangeNewKey] doubleValue]; self.progressView.alpha = 1.0f; [self.progressView setProgress:newprogress animated:YES]; if (newprogress >= 1.0f) { [UIView animateWithDuration:0.3f delay:0.3f options:UIViewAnimationOptionCurveEaseOut animations:^{ self.progressView.alpha = 0.0f; } completion:^(BOOL finished) { [self.progressView setProgress:0 animated:NO]; }]; } } else { [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; } } -(void)initNotification { //加载通知 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(requestWebView:) name:kRequestWebViewWithUrl object:nil]; //点击订阅通知 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(clickSubNotiMethods:) name:ClickSubNotiMethods object:nil]; //点击支付通知 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(clickPayMethods:) name:ClickPayMethods object:nil]; //支付状态通知 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(alipayWXpayStatus:) name:AlipayWXpayStatus object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateNotifyState) name:kUpdateNotifyState object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(afterReceiveNewMsg) name:kAfterReceiveNewMsg object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reloadWebView) name:kReloadWebVIew object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loginOut:) name:kLoginOut object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(netReachChanged:) name:AFNetworkingReachabilityDidChangeNotification object:nil]; //展示底部红的通知 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(newsRedPoint:) name:JYNewsRedPoint object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshDY:) name:@"refreshDY" object:nil]; //接收全新通知 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshNonCurVC:) name:RefreshNonCurVC object:nil]; } #pragma mark – Gesture Recognizer – -(void)paningGestureReceive:(UIPanGestureRecognizer *)recoginzer { NSString *current_url = [self stringByEvaluatingJavaScriptFromString:@"document.location.href"]; NSLog(@"当前页面:%@",current_url); CGRect rect = self.view.bounds; CGFloat width = CGRectGetWidth(rect); if (![self.webView canGoBack]) { NSLog(@"不可返回"); return; } if([current_url containsString:@"jyapp/free/login"]) { return; } // NSString *current_url = self.webView.request.URL.absoluteString; if([current_url isEqualToString:[NSString stringWithFormat:@"%@jyapp/free/me",kHost]]||[current_url isEqualToString:[NSString stringWithFormat:@"%@jyapp/jylab/index",kHost]]||[current_url isEqualToString:[NSString stringWithFormat:@"%@jyapp/swordfish/historypush",kHost]]||[current_url isEqualToString:[NSString stringWithFormat:@"%@jyapp/jylab/mainSearch",kHost]]){ return; } CGPoint touchPoint = [recoginzer locationInView:[UIApplication sharedApplication].keyWindow]; if (recoginzer.state==UIGestureRecognizerStateBegan) { _isMoving = YES; startTouch = touchPoint; } else if (recoginzer.state==UIGestureRecognizerStateEnded){ if (touchPoint.x - startTouch.x > width*0.125) { [UIView animateWithDuration:0.3 animations:^{ [self moveViewWithX:width]; // [GlobalData shareInstance].isSideslip = YES; [self.webView goBack]; // [self isExitCallToJS:@"afterClickBack()" withMethodName:@"afterClickBack"]; } completion:^(BOOL finished) { _isMoving = NO; [self moveViewWithX:0]; }]; } else { [UIView animateWithDuration:0.3 animations:^{ [self moveViewWithX:0]; } completion:^(BOOL finished) { _isMoving = NO; }]; } return; } else if (recoginzer.state==UIGestureRecognizerStateCancelled){ [UIView animateWithDuration:0.3 animations:^{ [self moveViewWithX:0]; } completion:^(BOOL finished) { _isMoving = NO; }]; return; } if (_isMoving) { [self moveViewWithX:touchPoint.x - startTouch.x]; } } -(void)moveViewWithX:(float)x { CGRect rect = self.view.bounds; CGFloat width = CGRectGetWidth(rect); x = x>width?width:x; x = x<0?0:x; CGRect frame = self.webView.frame; frame.origin.x = x; self.webView.frame = frame; } - (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{ // message.body -- Allowed types are NSNumber, NSString, NSDate, NSArray,NSDictionary, and NSNull. // NSLog(@"原生收到了js发送过来的消息message.name = %@ message.body = %@",message.name,message.body); if ([message.name isEqualToString:@"loginByWeixin"]) { [self jsLoginByWeixin:message.body]; }else if ([message.name isEqualToString:@"share"]) { [self jsShare:message.body]; }else if ([message.name isEqualToString:@"saveUserToken"]) { [self jsSaveUserToken:message.body]; }else if ([message.name isEqualToString:@"removeUserToken"]) { [self jsRemoveUserToken:message.body]; }else if ([message.name isEqualToString:@"openSystemNotification"]) { [self jsOpenSystemNotification:message.body]; }else if ([message.name isEqualToString:@"openExternalLink"]) { [self JsOpenExternalLink:message.body]; }else if ([message.name isEqualToString:@"alert"]) { [self jsAlert:message.body]; }else if ([message.name isEqualToString:@"hiddenBottom"]) { [self jsHiddenBottom:message.body]; }else if ([message.name isEqualToString:@"checkLab"]) { [self jsCheckLab:message.body]; }else if ([message.name isEqualToString:@"loginSuccess"]) { [self jsLoginSuccess:message.body]; }else if ([message.name isEqualToString:@"backUrl"]) { [self jsBackUrl:message.body]; }else if ([message.name isEqualToString:@"clearPushMessage"]) { [self jsClearPushMessage:message.body]; }else if ([message.name isEqualToString:@"hideRedSpotOnMenu"]) { [self jsHideRedSpotOnMenu:message.body]; }else if ([message.name isEqualToString:@"showRedSpotOnMenu"]) { [self jsShowRedSpotOnMenu:message.body]; }else if ([message.name isEqualToString:@"wxPay"]) { [self jsWxPay:message.body]; }else if ([message.name isEqualToString:@"aliPay"]) { [self jsAliPay:message.body]; }else if ([message.name isEqualToString:@"skipCamera"]) { [self jsSkipCamera:message.body]; }else if ([message.name isEqualToString:@"skipAlbum"]) { [self jsSkipAlbum:message.body]; }else { } } #pragma mark - WKUIDelegate - (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(nullable NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * _Nullable result))completionHandler { NSError *err = nil; NSData *dataFromString = [prompt dataUsingEncoding:NSUTF8StringEncoding]; NSDictionary *paramdict = [NSJSONSerialization JSONObjectWithData:dataFromString options:NSJSONReadingMutableContainers error:&err]; if (!err){ NSString *type = [paramdict objectForKey:@"jsName"]; if (type && [type isEqualToString:@"getUserToken"]) { NSDictionary *dict = @{@"type":@"string", @"value":[self jsGetUserToken:paramdict]}; completionHandler([self convertToJsonData:dict]); }else if (type && [type isEqualToString:@"getVersion"]) { NSDictionary *dict = @{@"type":@"string", @"value":[self jsGetVersion:paramdict]}; completionHandler([self convertToJsonData:dict]); }else if (type && [type isEqualToString:@"checkNoticePermission"]) { NSDictionary *dict = @{@"type":@"int", @"value":[NSString stringWithFormat:@"%d",[self jsCheckNoticePermission:paramdict]]}; completionHandler([self convertToJsonData:dict]); }else if (type && [type isEqualToString:@"getPushRid"]) { NSDictionary *dict = @{@"type":@"string",@"value":[self jsGetPushRid:paramdict]}; completionHandler([self convertToJsonData:dict]); }else if (type && [type isEqualToString:@"isInstallWeixin"]) { NSDictionary *dict = @{@"type":@"int", @"value":[NSString stringWithFormat:@"%d",[self jsIsInstallWeixin:paramdict]]}; completionHandler([self convertToJsonData:dict]); }else if (type && [type isEqualToString:@"getCipherText"]) { NSDictionary *dict = @{@"type":@"string", @"value":[self jsGetCipherText:paramdict]}; completionHandler([self convertToJsonData:dict]); } else if (type && [type isEqualToString:@"getOtherPushRid"]) { NSDictionary *dict = @{@"type":@"string",@"value":[self jsGetOtherPushRid:paramdict]}; completionHandler([self convertToJsonData:dict]); }else if (type && [type isEqualToString:@"getPhoneBrand"]) { NSDictionary *dict = @{@"type":@"string", @"value":[self jsGetPhoneBrand:paramdict]}; completionHandler([self convertToJsonData:dict]); }else { completionHandler(@""); } } } //通过js alert 显示一个警告面板,调用原生会走此方法。 - (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler { NSLog(@"显示一个JavaScript警告面板, message = %@",message); UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"温馨提示" message:message preferredStyle:UIAlertControllerStyleAlert]; [alertController addAction:[UIAlertAction actionWithTitle:@"确认" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { completionHandler(); }]]; [self presentViewController:alertController animated:YES completion:nil]; } //通过 js confirm 显示一个确认面板,调用原生会走此方法。 - (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL result))completionHandler { NSLog(@"运行JavaScript确认面板, message = %@", message); UIAlertController *action = [UIAlertController alertControllerWithTitle:@"温馨提示" message:message preferredStyle:UIAlertControllerStyleAlert]; [action addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) { completionHandler(NO); }] ]; [action addAction:[UIAlertAction actionWithTitle:@"确认" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { completionHandler(YES); }]]; [self presentViewController:action animated:YES completion:nil]; } #pragma mark - OC调JS交互 -(void)isExitCallToJS:(NSString *)jsStr withMethodName:(NSString *)name{ NSString *jsName = [NSString stringWithFormat:@"function exist(){return !window['%@']};exist()",name]; [_webView evaluateJavaScript:jsName completionHandler:^(id _Nullable result, NSError * _Nullable error) { NSLog(@"是否存在 result:%@,error:%@",result,error); if ([result intValue]==0) { [self executeCallJS:jsStr]; }else { NSLog(@"不存在-不存在-不存在-%@",jsStr); } }]; } -(void)executeCallJS:(NSString *)jsStr { NSLog(@"OC调JS交互%@:",jsStr); [_webView evaluateJavaScript:jsStr completionHandler:^(id _Nullable result, NSError * _Nullable error) { if (error!=nil) { NSLog(@"result:%@,error:%@",result,error); [[LXViewControllerManager shareViewControllerManager]showAlertViewWithMessage: jsStr]; [[GlobalData shareInstance] addOnePlistData:@{ @"detail":[[self stringByEvaluatingJavaScriptFromString:@"document.location.href"] stringByAppendingString:[NSString stringWithFormat:@"\nJS异常方法:%@\n%@",jsStr,[error description]]], @"reqTime":[NSNumber numberWithInt:0], }]; } }]; } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. NSLog(@"订阅初始化"); self.view.backgroundColor = [UIColor whiteColor]; [self.view addSubview:self.webView]; [self.view addSubview:self.progressView]; [self webViewFirstRequest]; [[AFNetworkReachabilityManager sharedManager] startMonitoring]; [self initNotification]; UIPanGestureRecognizer *recognizer = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(paningGestureReceive:)]; [recognizer delaysTouchesBegan]; [self.view addGestureRecognizer:recognizer]; } #pragma mark - WKNavigationDelegate /* 页面加载完成 */ - (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{ NSString *curUrl = [self stringByEvaluatingJavaScriptFromString:@"document.location.href"]; NSLog(@"-----页面加载完成%@",curUrl); if(refreshTabBool){ NSLog(@"刷新-刷新-刷新-刷新-") refreshTabBool = NO; }else { //正常的网页加载 [self judgeIsHidden];//是否隐藏 } // if ([GlobalData shareInstance].isSideslip) { // [GlobalData shareInstance].isSideslip = YES; // [self isExitCallToJS:@"afterClickBack()" withMethodName:@"afterClickBack"]; // } [self removeNoNetViews]; [[LXViewControllerManager shareViewControllerManager] hideHud]; // [self performSelector:@selector(afterPageClick) withObject:nil afterDelay:2]; } //-(void)afterPageClick { // [self isExitCallToJS:@"afterPageInit()" withMethodName:@"afterPageInit"]; //} // 页面开始加载时调用 - (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation{ } // 当内容开始返回时调用 - (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation{ } // 页面加载失败时调用 - (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation withError:(nonnull NSError *)error{ [[GlobalData shareInstance] addOnePlistData:@{ @"detail":[[self stringByEvaluatingJavaScriptFromString:@"document.location.href"] stringByAppendingString:[NSString stringWithFormat:@"\n%@",[error description]]], @"reqTime":[NSNumber numberWithInt:0], }]; } #pragma mark *****JS与OC交互 #pragma mark - WKScriptMessageHandler JS调OC交互 -(void)jsLoginByWeixin:(NSDictionary *)dict { if ([LXUserDefaults isInstallWeiXin] != 1) { // 没有安装微信 不走友盟 [[LXViewControllerManager shareViewControllerManager] showHudOnlyText:@"微信登录失败,没有安装微信" delay:1.5]; return; } [[UMSocialManager defaultManager] getUserInfoWithPlatform:UMSocialPlatformType_WechatSession currentViewController:self completion:^(id result, NSError *error) { UMSocialUserInfoResponse *resp = result; [self dealWXDic:(NSDictionary *)resp.originalResponse]; [[LXViewControllerManager shareViewControllerManager] hideHud]; }]; } // 处理微信登录获取到的数据 -(void)dealWXDic:(NSDictionary *)dictionary{ [[LXViewControllerManager shareViewControllerManager] showHudText:nil]; //如果获取到用户信息,即用户点击了“登录”,则进行用户信息获取 if (dictionary.count > 0) { NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithDictionary:dictionary]; if (dic) { [dic removeObjectForKey:@"privilege"]; [dic removeObjectForKey:@"language"]; double currDouble = [[NSDate date] timeIntervalSince1970]; [dic setObject:[NSNumber numberWithLong:(long)currDouble] forKey:@"createtime"]; // 拼接标志位 NSString *sign = [NSString stringWithFormat:@"city=%@&country=%@&createtime=%@&headimgurl=%@&nickname=%@&openid=%@&province=%@&sex=%@&unionid=%@", dic[@"city"], dic[@"country"], dic[@"createtime"], dic[@"headimgurl"], dic[@"nickname"], dic[@"openid"], dic[@"province"],dic[@"sex"],dic[@"unionid"]]; sign = [LXMD5 md532BitLower:sign]; [dic setObject:sign forKey:@"sign"]; NSString *endStr = [[LXViewControllerManager shareViewControllerManager] getJsonStr:dic]; NSData *data = [endStr dataUsingEncoding:NSUTF8StringEncoding]; endStr = [data base64EncodedStringWithOptions:0]; [self isExitCallToJS:[NSString stringWithFormat:@"loginByWeixinCallBack('%@')", endStr] withMethodName:@"loginByWeixinCallBack"]; } } } -(void)jsShare:(NSDictionary *)dict { NSString *type = [NSString stringWithFormat:@"%@",dict[@"type"]]; NSString *title = [NSString stringWithFormat:@"%@",dict[@"title"]]; NSString *content = [NSString stringWithFormat:@"%@",dict[@"content"]]; NSString *link = [NSString stringWithFormat:@"%@",dict[@"link"]]; UMSocialPlatformType shareType; if ([type intValue] == 1) { // 微信好友 shareType = UMSocialPlatformType_WechatSession; }else if ([type intValue] == 2){ /// qq好友 shareType = UMSocialPlatformType_QQ; }else if ([type intValue] == 3){ // 朋友圈 shareType = UMSocialPlatformType_WechatTimeLine; }else{ shareType = UMSocialPlatformType_WechatSession; } if ([type intValue] == 1 || [type intValue] == 3) { if ([LXUserDefaults isInstallWeiXin] != 1) { [[LXViewControllerManager shareViewControllerManager] showHudOnlyText:@"没有安装微信" delay:1.5]; return; } } if ([type intValue] == 2) { if (![[UMSocialManager defaultManager] isInstall:UMSocialPlatformType_QQ]) { [[LXViewControllerManager shareViewControllerManager] showHudOnlyText:@"没有安装QQ" delay:1.5]; return; } } //创建分享消息对象 UMSocialMessageObject *messageObject = [UMSocialMessageObject messageObject]; //创建网页内容对象 UMShareWebpageObject *shareObject = [UMShareWebpageObject shareObjectWithTitle:title descr:content thumImage:[UIImage imageNamed:@"logo"]]; //设置网页地址 shareObject.webpageUrl = link; messageObject.shareObject = shareObject; //调用分享接口 [[UMSocialManager defaultManager] shareToPlatform:shareType messageObject:messageObject currentViewController:self completion:^(id data, NSError *error) { if (error) { if (error.userInfo[@"message"] && [error.userInfo[@"message"] containsString:@"Operation is cancel"]) { [[LXViewControllerManager shareViewControllerManager] showHudOnlyText:@"取消分享" delay:1]; }else{ [[LXViewControllerManager shareViewControllerManager] showHudOnlyText:error.userInfo[@"message"] delay:1]; } [self isExitCallToJS:[NSString stringWithFormat:@"shareCallBack('%@','%@')",type,@"0"] withMethodName:@"shareCallBack"]; }else{ if ([data isKindOfClass:[UMSocialShareResponse class]]) { [self isExitCallToJS:[NSString stringWithFormat:@"shareCallBack('%@','%@')",type,@"1"] withMethodName:@"shareCallBack"]; }else{ UMSocialLogInfo(@"response data is %@",data); } } }]; } -(void)jsSaveUserToken:(NSDictionary *)dict{ [[LXViewControllerManager shareViewControllerManager] hideHud]; [LXUserDefaults saveToken:[NSString stringWithFormat:@"%@",dict[@"token"]]]; } -(NSString *)jsGetUserToken:(NSDictionary *)dict{ return [LXUserDefaults token]; } -(void)jsRemoveUserToken:(NSDictionary *)dict{ [LXUserDefaults clearAll]; } -(int)jsCheckNoticePermission:(NSDictionary *)dict{ return [LXUserDefaults notifyState]; } // 跳转到系统设置 -(void)jsOpenSystemNotification:(NSDictionary *)dict{ self.updateNotify = YES; kMainQueue(^{ [[UIApplication sharedApplication]openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]]; }); } // 获取推送id -(NSString *)jsGetPushRid:(NSDictionary *)dict{ return [LXUserDefaults registrationID]; } // 打开新页面 加载新web -(void)JsOpenExternalLink:(NSDictionary *)dict{ NSString *url = [NSString stringWithFormat:@"%@",dict[@"url"]]; NSString *title = [NSString stringWithFormat:@"%@",dict[@"title"]]; if (url) { if ([AFNetworkReachabilityManager sharedManager].networkReachabilityStatus == AFNetworkReachabilityStatusNotReachable || [AFNetworkReachabilityManager sharedManager].networkReachabilityStatus == AFNetworkReachabilityStatusUnknown) { } JYNewWebController *ctr = [[JYNewWebController alloc] init]; ctr.url = url; if (!title || [title isEqualToString:@""] || [title isEqualToString:@"undefined"]) { ctr.titleShow = nil; }else{ ctr.titleShow = title; } kMainQueue(^{ [self presentViewController:ctr animated:NO completion:nil]; }); } } // 获取当前版本号 -(NSString *)jsGetVersion:(NSDictionary *)dict{ return [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"]; } -(void)jsAlert:(NSDictionary *)dict{ [[LXViewControllerManager shareViewControllerManager] showAlertViewWithMessage:[NSString stringWithFormat:@"%@",dict[@"content"]]]; } -(int)jsIsInstallWeixin:(NSDictionary *)dict{ return [LXUserDefaults isInstallWeiXin]; } -(NSString *)jsGetCipherText:(NSDictionary *)dict{ NSDictionary *objDict = [NSDictionary dictionaryWithDictionary:dict[@"arguments"]]; NSString *phone = [NSString stringWithFormat:@"%@",objDict[@"phone"]]; NSDate *date=[NSDate date]; NSDateFormatter *format1=[[NSDateFormatter alloc] init]; [format1 setDateFormat:@"yyyyMMddhhmmss"]; NSString *dateStr; dateStr=[format1 stringFromDate:date]; NSLog(@"%@",dateStr); NSString *content = [[NSString stringWithFormat:@"%@_%@",phone,dateStr] stringByAppendingString:[NSString stringWithFormat:@"_%@",[LXMD5 md532BitLower:[NSString stringWithFormat:@"%@&%@",phone,dateStr]]]]; NSData *contentData = [content dataUsingEncoding:NSUTF8StringEncoding]; NSUInteger dataLength = contentData.length; // 为结束符'\\0' +1 char keyPtr[new_kKeySize_2 + 1]; memset(keyPtr, 0, sizeof(keyPtr)); [new_AesKey_2 getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; // 密文长度 <= 明文长度 + BlockSize size_t encryptSize = dataLength + kCCBlockSizeAES128; void *encryptedBytes = malloc(encryptSize); size_t actualOutSize = 0; NSData *initVector = [new_kInitVector_2 dataUsingEncoding:NSUTF8StringEncoding]; CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES, kCCOptionPKCS7Padding, // 系统默认使用 CBC,然后指明使用 PKCS7Padding keyPtr, new_kKeySize_2, initVector.bytes, contentData.bytes, dataLength, encryptedBytes, encryptSize, &actualOutSize); if (cryptStatus == kCCSuccess) { // 对加密后的数据进行 base64 编码 return [[NSData dataWithBytesNoCopy:encryptedBytes length:actualOutSize] base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed]; } free(encryptedBytes); return nil; } -(void)jsHiddenBottom:(NSDictionary *)dict{ if(self.tabBarController.selectedIndex == 1) { if([[NSString stringWithFormat:@"%@",dict[@"hidden"]] integerValue]==0) { [self hideTabBar]; [self hiddenMethodTabBar]; }else { [self showTabBar]; [self showMethodTabBar]; } } } -(void)jsCheckLab:(NSDictionary *)dict { [[NSNotificationCenter defaultCenter] postNotificationName:RefreshNonCurVC object:nil userInfo:nil]; } //js方法登录成功 -(void)jsLoginSuccess:(NSDictionary *)dict { NSLog(@"sub登录成功提示"); NSString *status = [NSString stringWithFormat:@"%@",dict[@"status"]]; [GlobalData shareInstance].isReLogin = YES; if([status isEqualToString:@"S"]) { kMainQueue(^{ [[NSNotificationCenter defaultCenter] postNotificationName:RefreshAllVC object:nil userInfo:nil]; AppDelegate *delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; JYTabBarController *tab = (JYTabBarController *)delegate.window.rootViewController; tab.selectedIndex = 0; }); }else { } } -(void)jsBackUrl:(NSDictionary *)dict { NSString *status = [NSString stringWithFormat:@"%@",dict[@"status"]]; NSLog(@"sub返回"); if([status isEqualToString:@"H"]) { //测试返回首页 kMainQueue(^{ [[NSNotificationCenter defaultCenter] postNotificationName:RefreshAllVC object:nil userInfo:nil]; AppDelegate *delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; JYTabBarController *tab = (JYTabBarController *)delegate.window.rootViewController; tab.selectedIndex = 0; }); } } -(void)jsClearPushMessage:(NSDictionary *)dict { kMainQueue(^{ [[UIApplication sharedApplication] setApplicationIconBadgeNumber:1]; [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0]; }); } -(void)jsHideRedSpotOnMenu:(NSDictionary *)dict { NSString *menu = [NSString stringWithFormat:@"%@",dict[@"menu"]]; if([menu isEqualToString:@"subscribe"]) { kMainQueue(^{ [self.tabBarController.tabBar hideBadgeOnItemIndex:1]; }); } if([menu isEqualToString:@"my"]) { kMainQueue(^{ [self.tabBarController.tabBar hideBadgeOnItemIndex:3]; }); } } -(void)jsShowRedSpotOnMenu:(NSDictionary *)dict { NSString *menu = [NSString stringWithFormat:@"%@",dict[@"menu"]]; if([menu isEqualToString:@"subscribe"]) { kMainQueue(^{ [self.tabBarController.tabBar showBadgeOnItemIndex:1]; }); } if([menu isEqualToString:@"my"]) { kMainQueue(^{ [self.tabBarController.tabBar showBadgeOnItemIndex:3]; }); } } -(void)jsWxPay:(NSDictionary *)dict { NSString *jsonString = [NSString stringWithFormat:@"%@",dict[@"order"]]; if ([LXUserDefaults isInstallWeiXin] != 1) { // 没有安装wx [[LXViewControllerManager shareViewControllerManager] showHudOnlyText:@"请先安装微信再进行支付!" delay:1.5]; return; } NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding]; NSError *err; NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&err]; if(err) { NSLog(@"json解析失败:%@",err); return; } //吊起微信 PayReq *request = [[PayReq alloc] init] ; request.openID = dic[@"Appid"]; request.partnerId = dic[@"Partnerid"]; request.prepayId= dic[@"Prepayid"]; request.package = @"Sign=WXPay"; request.nonceStr= dic[@"Noncestr"]; request.timeStamp= [dic[@"Timestamp"] intValue]; request.sign= dic[@"Sign"]; kMainQueue(^{ [WXApi sendReq:request]; }); } -(void)jsAliPay:(NSDictionary *)dict { NSString *order = [NSString stringWithFormat:@"%@",dict[@"order"]]; kMainQueue(^{ [[AlipaySDK defaultService] payOrder:order fromScheme:@"jianyuiosapp" callback:nil]; }); } -(NSString *)jsGetOtherPushRid:(NSDictionary *)dict { return [LXUserDefaults deviceToken]; } -(NSString *)jsGetPhoneBrand:(NSDictionary *)dict { UIDevice *device = [UIDevice currentDevice]; return device.platformString; } //拍照上传图片 -(void)jsSkipCamera:(NSDictionary *)dict { UIImagePickerController *picker = [[UIImagePickerController alloc] init]; picker.delegate = self; picker.allowsEditing = YES; picker.sourceType = UIImagePickerControllerSourceTypeCamera; dispatch_async(dispatch_get_main_queue(), ^{ [self presentViewController:picker animated:YES completion:nil]; }); } //相册选择照片 -(void)jsSkipAlbum:(NSDictionary *)dict { UIImagePickerController *picker = [[UIImagePickerController alloc] init]; picker.delegate = self; picker.allowsEditing = YES; picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; dispatch_async(dispatch_get_main_queue(), ^{ [self presentViewController:picker animated:YES completion:nil]; }); } // web是否可退回上页面 -(int)jsIsCanBack:(NSString *)str{ return self.webView.canGoBack ? 1:0; } #pragma mark *****其他方法 -(void)judgeIsHidden { NSString *current_url = [self stringByEvaluatingJavaScriptFromString:@"document.location.href"]; NSLog(@"判断需要隐藏否:%@",current_url); if([current_url isEqualToString:[NSString stringWithFormat:@"%@jyapp/swordfish/historypush",kHost]]||[current_url isEqualToString:[NSString stringWithFormat:@"%@jyapp/free/login?back=index",kHost]]){ NSLog(@"需要展示"); [self showTabBar]; [self showMethodTabBar]; }else { NSLog(@"需要隐藏"); [self hideTabBar]; [self hiddenMethodTabBar]; } } -(void)requestWebTime:(NSDictionary *)infoDict { NSString * urlStr = [NSString stringWithFormat:@"%@",infoDict[@"info"][@"url"]]; if([infoDict[@"type"] isEqualToString:@"message"]) { NSString *url = [NSString stringWithFormat:@"%@",urlStr]; NSArray * array = [url componentsSeparatedByString:@"=="]; url = [array.firstObject stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]; [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:url]]]; }else if ([infoDict[@"type"] isEqualToString:@"titleMessage"]) { NSArray * array = [urlStr componentsSeparatedByString:@"=="]; urlStr = [array.firstObject stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]; NSString * titleStr = @"消息通知"; titleStr = [NSString stringWithFormat:@"%@",infoDict[@"info"][@"title"]]; if (urlStr&&self.tabBarController.selectedIndex == 1) { [self JsOpenExternalLink:@{@"url":urlStr,@"title":titleStr}]; } }else { NSString *url = [NSString stringWithFormat:@"%@%@", kHost, urlStr]; url = [url stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]; [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:url]]]; } } - (void)hideTabBar { kMainQueue(^{ if (self.tabBarController.tabBar.hidden == YES) { return; } UIView *contentView; if ( [[self.tabBarController.view.subviews objectAtIndex:0] isKindOfClass:[UITabBar class]] ) contentView = [self.tabBarController.view.subviews objectAtIndex:1]; else contentView = [self.tabBarController.view.subviews objectAtIndex:0]; contentView.frame = CGRectMake(contentView.bounds.origin.x, contentView.bounds.origin.y, contentView.bounds.size.width, contentView.bounds.size.height + self.tabBarController.tabBar.frame.size.height); self.tabBarController.tabBar.hidden = YES; }); } - (void)showTabBar{ kMainQueue(^{ if (self.tabBarController.tabBar.hidden == NO) { return; } UIView *contentView; if ([[self.tabBarController.view.subviews objectAtIndex:0] isKindOfClass:[UITabBar class]]) contentView = [self.tabBarController.view.subviews objectAtIndex:1]; else contentView = [self.tabBarController.view.subviews objectAtIndex:0]; contentView.frame = CGRectMake(contentView.bounds.origin.x, contentView.bounds.origin.y, contentView.bounds.size.width, contentView.bounds.size.height - self.tabBarController.tabBar.frame.size.height); self.tabBarController.tabBar.hidden = NO; }); } - (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script { __block NSString *resultString = nil; __block BOOL finished = NO; [self.webView evaluateJavaScript:script completionHandler:^(id result, NSError *error) { if (error == nil) { if (result != nil) { resultString = [NSString stringWithFormat:@"%@", result]; } } else { NSLog(@"evaluateJavaScript error : %@", error.localizedDescription); } finished = YES; }]; while (!finished) { [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]; } return resultString; } -(void)hiddenMethodTabBar { kMainQueue(^{ if (iPhoneX) { if (@available(iOS 11.0, *)) { self.webView.frame = CGRectMake(0, 0, WIDTH, HEIGHT); NSLog(@"%@",self.webView) } }else { self.webView.frame = CGRectMake(0, -STATUS_BAR_HEIGHT, WIDTH, HEIGHT+STATUS_BAR_HEIGHT); } }); } -(void)showMethodTabBar { kMainQueue(^{ if (iPhoneX) { if (@available(iOS 11.0, *)) { self.webView.frame = CGRectMake(0, 0, WIDTH, HEIGHT-TAB_BAR_HEIGHT); } }else { self.webView.frame = CGRectMake(0, -STATUS_BAR_HEIGHT, WIDTH, HEIGHT-TAB_BAR_HEIGHT+STATUS_BAR_HEIGHT); } }); } //取消获取照片 - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker { dispatch_async(dispatch_get_main_queue(), ^{ [picker dismissViewControllerAnimated:YES completion:^{ [self uploadUrl:@""]; }]; }); } //上传图片 -(void)uploadPic:(NSData *)data { NSDictionary * body = @{@"type":@"courseFile"}; AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; //ContentType设置 manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/html",@"image/jpeg",@"image/png",@"application/octet-stream",@"text/json",@"text/plain",nil]; manager.responseSerializer= [AFHTTPResponseSerializer serializer]; manager.requestSerializer = [AFHTTPRequestSerializer serializer]; manager.requestSerializer.timeoutInterval = 15.0f; [manager POST:[NSString stringWithFormat:@"%@filemanage/upload",kHost] parameters:body constructingBodyWithBlock:^(id _Nonnull formData) { //上传的参数(上传图片,以文件流的格式) [formData appendPartWithFileData:data name:@"courseFile" fileName:@"courseFile.jpeg" mimeType:@"image/jpeg"]; } progress:^(NSProgress * _Nonnull uploadProgress) { CGFloat progress = 100.0 * uploadProgress.completedUnitCount / uploadProgress.totalUnitCount; NSLog(@"%.2lf%%", progress); } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { //请求成功的block回调 NSDictionary * dic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:nil]; NSLog(@"上传成功%@",dic); if ([dic[@"msg"] isEqualToString:@"ssss"]) { [self uploadUrl:dic[@"url"]]; }else{ [self uploadUrl:@""]; } } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSLog(@"上传失败%@",error); [self uploadUrl:@""]; [[GlobalData shareInstance] addOnePlistData:@{ @"detail":@"上传图片接口", @"reqTime":[NSNumber numberWithInt:0], }]; }]; } -(void)uploadUrl:(NSString *)url { NSString *textJS = [NSString new]; NSString *methodJS = [NSString new]; if ([url isEqualToString:@""]) { textJS = @"hiddenLoading()"; methodJS =@"hiddenLoading"; }else{ textJS = [NSString stringWithFormat:@"uploadImg('%@')",url]; methodJS = @"uploadImg"; } if ([url isEqualToString:@""]||[textJS isEqualToString:@""]) { NSLog(@"空的情况"); textJS = @"hiddenLoading()"; methodJS = @"hiddenLoading"; } NSDictionary *dict = @{@"jsStr":textJS,@"name":methodJS}; [self performSelector:@selector(uploadJS:) withObject:dict afterDelay:1]; } //获取到图片 - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { dispatch_async(dispatch_get_main_queue(), ^{ [picker dismissViewControllerAnimated:YES completion:^{ UIImage * img=[info objectForKey:UIImagePickerControllerEditedImage]; NSData *data = UIImageJPEGRepresentation(img, 0.5); if (data!=nil) { [self uploadPic:data]; }else{ NSLog(@"data == nil"); [self uploadUrl:@""]; } }]; }); } -(void)uploadJS:(NSDictionary *)dict { [self isExitCallToJS:dict[@"jsStr"] withMethodName:dict[@"name"]]; } -(NSString *)convertToJsonData:(NSDictionary *)dict { NSError *error; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:&error]; NSString *jsonString; if (!jsonData) { NSLog(@"%@",error); }else{ jsonString = [[NSString alloc]initWithData:jsonData encoding:NSUTF8StringEncoding]; } NSMutableString *mutStr = [NSMutableString stringWithString:jsonString]; NSRange range = {0,jsonString.length}; //去掉字符串中的空格 [mutStr replaceOccurrencesOfString:@" " withString:@"" options:NSLiteralSearch range:range]; NSRange range2 = {0,mutStr.length}; //去掉字符串中的换行符 [mutStr replaceOccurrencesOfString:@"\n" withString:@"" options:NSLiteralSearch range:range2]; return mutStr; } -(void)addNoNetViews{ kMainQueue(^{ [self removeNoNetViews]; self.noNetView = [NoNetView shareView]; [self.view addSubview:self.noNetView]; }); } -(void)removeNoNetViews{ if (self.noNetView ) { [self.noNetView removeFromSuperview]; self.noNetView = nil; } } #pragma mark **** 通知相关方法 // 点击通知 跳转到通知内url -(void)requestWebView:(NSNotification *)notification{ NSDictionary * infoDict = [notification object]; if (!infoDict) { return; } NSString * urlStr = [NSString stringWithFormat:@"%@",infoDict[@"info"][@"url"]]; if (urlStr) { //当前控制器 if(self.tabBarController.selectedIndex != 1) { return; } [[LXViewControllerManager shareViewControllerManager] showHudText:nil]; [self performSelector:@selector(requestWebTime:) withObject:infoDict afterDelay:1]; } } -(void)clickSubNotiMethods:(NSNotification *)notification{ NSDictionary * infoDict = [notification object][@"info"]; if (!infoDict) { return; } NSLog(@"%@",infoDict); NSString * urlStr = [NSString stringWithFormat:@"%@",infoDict[@"url"]]; if (urlStr) { if(self.tabBarController.selectedIndex == 1) { //刷新新订阅消息 NSString *infoUrl = [NSString stringWithFormat:@"%@%@", kHost, urlStr]; infoUrl = [infoUrl stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]; [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:infoUrl]]]; } } } //点击支付通知 -(void)clickPayMethods:(NSNotification *)notification{ NSDictionary * infoDict = [notification object][@"info"]; if (!infoDict) { return; } NSString * urlStr = [NSString stringWithFormat:@"%@",infoDict[@"url"]]; NSArray * array = [urlStr componentsSeparatedByString:@"=="]; urlStr = [array.firstObject stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]; NSString * titleStr = @"消息通知"; titleStr = [NSString stringWithFormat:@"%@",infoDict[@"title"]]; if (urlStr) { if(self.tabBarController.selectedIndex == 1) { [self JsOpenExternalLink:@{@"url":urlStr,@"title":titleStr}]; } } } -(void)alipayWXpayStatus:(NSNotification *)notification{ NSString * status = [notification object]; [self performSelector:@selector(payStatus:) withObject:status afterDelay:2]; } -(void)payStatus:(NSString *)status { //目前延时两秒 NSLog(@"支付状态:%@",status); if(self.tabBarController.selectedIndex == 1) { [self isExitCallToJS:[NSString stringWithFormat:@"payCallBack('%@')", status] withMethodName:@"payCallBack"]; } } // 调用js方法 刷新推送权限状态 -(void)updateNotifyState{ if (self.updateNotify) { self.updateNotify = NO; [self isExitCallToJS:[NSString stringWithFormat:@"updateNoticeSwitch()"] withMethodName:@"updateNoticeSwitch"]; } } // 收到通知消息 -(void)afterReceiveNewMsg{ NSLog(@"afterReceiveNewMsg"); [self isExitCallToJS:@"afterReceiveNewMsg()" withMethodName:@"afterReceiveNewMsg"]; } // 再次加载页面 -(void)reloadWebView{ if(self.tabBarController.selectedIndex == 1) { [[LXViewControllerManager shareViewControllerManager] showHudText:nil]; if (!self.webView.canGoBack) { [self webViewFirstRequest]; }else{ [self.webView reload]; } } } // 收到退出登录消息 -(void)loginOut:(NSNotification *)notification{ if([notification.userInfo[@"item_index"] integerValue]!=1) { return; } [self webViewRequestByMsg]; } //收到消息退出并重新加载web -(void)webViewRequestByMsg{ NSString *url = [NSString stringWithFormat:@"%@%@", kHost, @"jyapp/free/login?back=index&isios=t&flag=kicked"]; url = [url stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]; [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:url]]]; } // 监控网络状态变化 -(void)netReachChanged:(NSNotification *)notificaition{ NSDictionary *userInfo = notificaition.userInfo; if ([userInfo[@"AFNetworkingReachabilityNotificationStatusItem"] intValue] == 0 || [userInfo[@"AFNetworkingReachabilityNotificationStatusItem"] intValue] == -1) { [self addNoNetViews]; }else{ [self removeNoNetViews]; } } -(void)newsRedPoint:(NSNotification *)notificaition { NSDictionary *dict = notificaition.userInfo; if(self.tabBarController.selectedIndex == 1) { NSString *textJS = [NSString stringWithFormat:@"afterReceivePushMessage('%@','%@')",dict[@"typeMsg"],dict[@"url"]]; [self isExitCallToJS:textJS withMethodName:@"afterReceivePushMessage"]; } } //刷新页面相关 -(void)refreshNonCurVC:(NSNotification *)notificaition{ if(self.tabBarController.selectedIndex != 1) { refreshTabBool = YES; [self webViewFirstRequest]; } } //通知刷新页面 -(void)refreshDY:(NSNotification *)notificaition{ NSDictionary *infoDict = notificaition.userInfo; NSLog(@"%@",infoDict); if (!infoDict) { [self webViewFirstRequest]; }else { NSString *infoUrl = [NSString stringWithFormat:@"%@%@", kHost, infoDict[@"url"]]; infoUrl = [infoUrl stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]; [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:infoUrl]]]; } } -(void)clearWeb{ NSURLCache * cache = [NSURLCache sharedURLCache]; [cache removeAllCachedResponses]; [cache setDiskCapacity:0]; [cache setMemoryCapacity:0]; } /* #pragma mark - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { // Get the new view controller using [segue destinationViewController]. // Pass the selected object to the new view controller. } */ @end