webpageVC.m 47 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271
  1. //
  2. // webpageVC.m
  3. // sjvodios
  4. //
  5. // Created by on 12-3-8.
  6. // Copyright (c) 2012年 __MyCompanyName__. All rights reserved.
  7. // 测试
  8. #import "webpageVC.h"
  9. #import "AppDelegate.h"
  10. #import "JXServer.h"
  11. #import "ImageSelectorViewController.h"
  12. #import "JXRelayVC.h"
  13. #import <JavaScriptCore/JavaScriptCore.h>
  14. #import "JXWebAuthView.h"
  15. #import "JXLinksShareVC.h"
  16. #import "addMsgVC.h"
  17. #import "JXReportUserVC.h"
  18. #import "UIWebView+JXSearchWebView.h"
  19. #import "JXWebviewProgress.h"
  20. #import "JXShareManager.h"
  21. #import "JXShareModel.h"
  22. #import "JXVerifyPayVC.h"
  23. #import "JXPayPasswordVC.h"
  24. #import "JXSkPayVC.h"
  25. @interface webpageVC ()<ImageSelectorViewDelegate,JXWebAuthViewDelegate,UITextFieldDelegate,UIScrollViewDelegate,AVAudioRecorderDelegate,AVAudioPlayerDelegate,JXSkPayVCDelegate>
  26. @property (nonatomic, strong) webpageVC *pSelf;
  27. @property (nonatomic, strong) NSString *titleStr;
  28. @property (nonatomic, strong) NSMutableArray *images;
  29. @property (nonatomic, strong) UIButton *sendBtn;
  30. @property (nonatomic,copy) NSString *appId;
  31. @property (nonatomic,copy) NSString *callbackUrl;
  32. @property (nonatomic, strong) JXLinksShareVC *linksShareVC;
  33. @property (nonatomic, strong) ImageSelectorViewController *SelectorVC;
  34. @property (nonatomic, strong) addMsgVC* addMsgVC;
  35. @property (nonatomic, strong) JXReportUserVC * reportVC;
  36. @property (nonatomic, strong) JXRelayVC *relayVC;
  37. @property (nonatomic, strong) UISlider *slider;
  38. @property (nonatomic, strong) UIView *baseView;
  39. @property (nonatomic, strong) UIView *keyboardView;
  40. @property (nonatomic, strong) UIButton *suspensionBtn;
  41. @property (nonatomic, assign) CGRect subWindowFrame;
  42. @property (nonatomic, strong) UITextField *textField;
  43. @property (nonatomic, strong) UILabel *numLabel;
  44. @property (nonatomic, strong) NSString *textStr;
  45. @property (nonatomic, assign) int textType;
  46. @property (nonatomic, assign) BOOL isFloatWindow;
  47. @property (nonatomic, assign) int clickTime;
  48. @property (nonatomic, assign) int keywordsNum;
  49. @property (nonatomic, strong) UIImage *firstImage;
  50. @property (nonatomic, copy) NSString *subTitle;
  51. @property (nonatomic, strong) NSDictionary *shareDic;
  52. @property (nonatomic, strong) NSURL *audioPath;
  53. @property (nonatomic, copy) NSString *amrPath;
  54. @property (nonatomic, strong) AVAudioRecorder *audioRecorder;
  55. @property (nonatomic, strong) AVAudioPlayer *player;
  56. @property (nonatomic, strong) NSDictionary *skPayDic;
  57. @property (nonatomic, strong) JXVerifyPayVC * verVC;
  58. @property (nonatomic, strong) NSDictionary *orderDic;
  59. // 进度条
  60. @property (nonatomic, strong) JXWebviewProgress *progressLine;
  61. @end
  62. @implementation webpageVC
  63. @synthesize webView,url;
  64. - (id)init
  65. {
  66. self = [super init];
  67. if (self) {
  68. }
  69. return self;
  70. }
  71. - (void)viewDidLoad {
  72. [super viewDidLoad];
  73. if (_pSelf) {
  74. return;
  75. }
  76. NSURL *audioUrl = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@share.wav",docFilePath]];
  77. self.audioPath = audioUrl;
  78. _pSelf = self;
  79. self.heightHeader = JX_SCREEN_TOP;
  80. self.heightFooter = 0;
  81. // self.view.frame = g_window.bounds;
  82. self.isGotoBack = YES;
  83. [self createHeadAndFoot];
  84. self.tableBody.backgroundColor = HEXCOLOR(0xF2F2F2);
  85. self.textType = 0;
  86. self.isFloatWindow = NO;
  87. if (self.isSend) {
  88. // self.sendBtn = [UIFactory createButtonWithTitle:Localized(@"JXSendToFriend") titleFont:[UIFont systemFontOfSize:15] titleColor:[UIColor whiteColor] normal:nil highlight:nil];
  89. // [self.sendBtn addTarget:self action:@selector(onSend) forControlEvents:UIControlEventTouchUpInside];
  90. // wCGSize btnSize = [Localized(@"JXSendToFriend") boundingRectWithSize:CGSizeMake(MAXFLOAT, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:15.0]} context:nil].size;
  91. // self.sendBtn.frame = CGRectMake(JX_SCREEN_WIDTH - btnSize.width - 10, JX_SCREEN_TOP - 34, btnSize.width + 10, 30);
  92. // self.sendBtn.enabled = NO;
  93. // self.sendBtn.alpha = 0.5;
  94. // [self.tableHeader addSubview:self.sendBtn];
  95. UIButton* btn = [UIFactory createButtonWithImage:@"chat_more_black"
  96. highlight:nil
  97. target:self
  98. selector:@selector(onMore)];
  99. btn.custom_acceptEventInterval = 1.0f;
  100. btn.frame = CGRectMake(JX_SCREEN_WIDTH - 18-15, JX_SCREEN_TOP - 18-15, 18, 18);
  101. [self.tableHeader addSubview:btn];
  102. }
  103. // 防止url 有中文和其他特殊字符, 先转译一次
  104. self.url = [self.url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  105. self.images = [NSMutableArray array];
  106. webView = [[UIWebView alloc] initWithFrame:self.tableBody.bounds];
  107. webView.backgroundColor = [UIColor whiteColor];
  108. webView.delegate = self;
  109. webView.scalesPageToFit = YES;
  110. webView.scrollView.delegate = self;
  111. [self.tableBody addSubview:webView];
  112. aiv = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
  113. aiv.center = self.view.center;
  114. aiv.hidesWhenStopped = YES;
  115. [self.view addSubview:aiv];
  116. if (self.titleString.length > 0) {
  117. self.title = self.titleString;
  118. }
  119. self.progressLine = [[JXWebviewProgress alloc] initWithFrame:CGRectMake(0, JX_SCREEN_TOP, 0, 3)];
  120. self.progressLine.lineColor = HEXCOLOR(0x18B710);
  121. [self.view addSubview:self.progressLine];
  122. // 开始走进度条
  123. [self.progressLine startLoadingAnimation];
  124. // url = @"http://192.168.0.141:8080/websiteAuthorh/test.html";
  125. if ([url rangeOfString:@"http"].location != NSNotFound && g_server.isLogin) {
  126. // 验证链接url是否被锁定
  127. // NSString *encodeUrl = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  128. NSString *encodeUrl = (NSString *)
  129. CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
  130. (CFStringRef)url,
  131. NULL,
  132. (CFStringRef)@"!*'();:@&=+$,/?%#[]",
  133. kCFStringEncodingUTF8));
  134. [g_server userCheckReportUrl:encodeUrl toView:self];
  135. }else {
  136. [self webViewLoad];
  137. }
  138. [g_notify addObserver:self selector:@selector(actionQuitVC:) name:kActionRelayQuitVC object:nil];
  139. //监听UIWindow隐藏(网页视频全屏播放后会导致状态栏消失,这里做处理)
  140. [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(endFullScreen) name:UIWindowDidBecomeHiddenNotification object:nil];
  141. // 监听键盘高度
  142. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChangeFrame:) name:UIKeyboardWillShowNotification object:nil];
  143. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidHide:) name:UIKeyboardWillHideNotification object:nil];
  144. }
  145. - (void)webViewLoad {
  146. if (url) {
  147. NSURLRequest* p= nil;
  148. NSString *curl = [url copy];
  149. curl = curl.lowercaseString;
  150. if (![curl hasPrefix:@"http"]) {
  151. p = [[NSURLRequest alloc] initWithURL:[NSURL fileURLWithPath:url]];
  152. }else{
  153. p = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:url]];
  154. if (!p.URL) {
  155. p = [[NSURLRequest alloc] initWithURL:[NSURL fileURLWithPath:url]];
  156. self.title = Localized(@"JX_ShikuProtocolTitle");
  157. }
  158. }
  159. NSString *lastName =[[url lastPathComponent] lowercaseString];
  160. //先判断是 TXT 文件
  161. if ([lastName containsString:@".txt"]) {
  162. NSData *data = [NSData dataWithContentsOfURL:p.URL];
  163. // 加载二进制文件
  164. [self.webView loadData:data MIMEType:@"text/html" textEncodingName:@"GBK" baseURL:nil];
  165. }else {
  166. [webView loadRequest:p];
  167. }
  168. NSLog(@"webUrl=%@",url);
  169. }
  170. }
  171. - (void)scrollViewDidScroll:(UIScrollView *)scrollView {
  172. if (self.webView.scrollView == scrollView) {
  173. if ([self.textField isFirstResponder]) {
  174. [self.textField resignFirstResponder];
  175. }
  176. }
  177. }
  178. -(void)endFullScreen{
  179. [UIApplication sharedApplication].statusBarHidden = NO;
  180. }
  181. - (void)actionQuitVC:(NSNotification *)notif {
  182. [self actionQuit];
  183. }
  184. - (void)actionQuit {
  185. if (self.isFloatWindow) {
  186. [self hideFloatWindow];
  187. return;
  188. }
  189. [super actionQuit];
  190. _pSelf = nil;
  191. }
  192. - (void)onMore {
  193. [self.view endEditing:YES];
  194. self.linksShareVC = [[JXLinksShareVC alloc] init];
  195. // self.linksShareVC.titleStr = [[NSURL URLWithString:self.url] host];
  196. self.linksShareVC.titleStr = self.url;
  197. self.linksShareVC.isFloatWindow = self.isFloatWindow;
  198. self.linksShareVC.delegate = self;
  199. self.linksShareVC.onSend = @selector(onSend);
  200. self.linksShareVC.onShare = @selector(onShare);
  201. self.linksShareVC.onWXSend = @selector(onWXSend);
  202. self.linksShareVC.onWXShare = @selector(onWXShare);
  203. self.linksShareVC.onCollection = @selector(onCollection);
  204. self.linksShareVC.onSafari = @selector(onSafari);
  205. self.linksShareVC.onReport = @selector(onReport);
  206. self.linksShareVC.onPasteboard = @selector(onPasteboard);
  207. self.linksShareVC.onUpdate = @selector(onUpdate);
  208. self.linksShareVC.onSearch = @selector(onSearch);
  209. self.linksShareVC.onTextType = @selector(onTextType);
  210. self.linksShareVC.onFloatWindow = @selector(onFloatWindow);
  211. [self.view addSubview:self.linksShareVC.view];
  212. }
  213. - (void) onSend {
  214. [self.linksShareVC hideShareView];
  215. if (self.shareDic) {
  216. JXMessageObject *msg = [[JXMessageObject alloc] init];
  217. msg.type = [NSNumber numberWithInt:kWCMessageTypeShare];
  218. msg.content = Localized(@"JX_[Link]");
  219. NSDictionary *dict = @{
  220. @"url" : [self.shareDic objectForKey:@"url"],
  221. // @"downloadUrl" : [self.shareDic objectForKey:@"downloadUrl"],
  222. @"title" : [self.shareDic objectForKey:@"title"],
  223. @"subTitle" : [self.shareDic objectForKey:@"subTitle"],
  224. @"imageUrl" : [self.shareDic objectForKey:@"imageUrl"],
  225. @"appName" : [self.shareDic objectForKey:@"appName"],
  226. @"appIcon" : [self.shareDic objectForKey:@"appIcon"],
  227. // @"urlSchemes" : [self.shareDic objectForKey:@"urlSchemes"]
  228. };
  229. SBJsonWriter * OderJsonwriter = [SBJsonWriter new];
  230. NSString * jsonString = [OderJsonwriter stringWithObject:dict];
  231. msg.objectId = jsonString;
  232. self.relayVC = [[JXRelayVC alloc] init];
  233. self.relayVC.shareSchemes = [self.shareDic objectForKey:@"subTitle"];
  234. NSMutableArray *array = [NSMutableArray arrayWithObject:msg];
  235. self.relayVC.relayMsgArray = array;
  236. [self.view addSubview:self.relayVC.view];
  237. }else {
  238. // _SelectorVC = [[ImageSelectorViewController alloc] init];
  239. // _SelectorVC.imageFileNameArray = self.images;
  240. // _SelectorVC.title = Localized(@"JX_SelectImage");
  241. // _SelectorVC.imgDelegete = self;
  242. // // [g_navigation pushViewController:vc animated:YES];
  243. // [self.view addSubview:_SelectorVC.view];
  244. JXMessageObject *msg = [[JXMessageObject alloc] init];
  245. msg.type = [NSNumber numberWithInt:kWCMessageTypeLink];
  246. NSMutableDictionary *dict = @{
  247. @"title" : self.titleStr,
  248. @"url" : self.shareUrl.length > 0 ? self.shareUrl : self.url,
  249. @"subTitle" : self.subTitle,
  250. }.mutableCopy;
  251. if (self.images.count > 0) {
  252. [dict addEntriesFromDictionary:@{@"img" : [self.images firstObject]}];
  253. }
  254. NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:nil];
  255. NSString *jsonStr = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
  256. msg.content = jsonStr;
  257. _relayVC = [[JXRelayVC alloc] init];
  258. NSMutableArray *array = [NSMutableArray arrayWithObject:msg];
  259. // vc.msg = msg;
  260. _relayVC.relayMsgArray = array;
  261. _relayVC.isUrl = YES;
  262. [self.view addSubview:_relayVC.view];
  263. }
  264. }
  265. - (void)onShare {
  266. [self.linksShareVC hideShareView];
  267. if (self.shareDic) {
  268. _addMsgVC = [[addMsgVC alloc] init];
  269. //在发布信息后调用,并使其刷新
  270. _addMsgVC.block = ^{
  271. };
  272. _addMsgVC.shareUr = [self.shareDic objectForKey:@"url"];
  273. _addMsgVC.shareTitle = [self.shareDic objectForKey:@"title"];
  274. _addMsgVC.shareIcon = [self.shareDic objectForKey:@"imageUrl"];
  275. _addMsgVC.dataType = weibo_dataType_share;
  276. _addMsgVC.delegate = self;
  277. [self.view addSubview:_addMsgVC.view];
  278. }else{
  279. _addMsgVC = [[addMsgVC alloc] init];
  280. _addMsgVC.dataType = 2;
  281. _addMsgVC.urlShare = self.url;
  282. // [g_navigation pushViewController:vc animated:YES];
  283. [self.view addSubview:_addMsgVC.view];
  284. }
  285. }
  286. - (void) onWXSend {
  287. [self didShareBtnClick:0];
  288. }
  289. - (void)onWXShare {
  290. [self didShareBtnClick:1];
  291. }
  292. - (void)didShareBtnClick:(NSInteger)shareTo{
  293. // NSString *userId = [NSString stringWithFormat:@"%lld",[[_dataDict objectForKey:@"userId"] longLongValue]-1];
  294. // NSString *userId = [NSString stringWithFormat:@"%lld",[[_dataDict objectForKey:@"userId"] longLongValue]];
  295. JXShareModel *shareModel = [[JXShareModel alloc] init];
  296. shareModel.shareTo = shareTo;
  297. //分享标题
  298. shareModel.shareTitle = self.titleStr;
  299. //分享内容
  300. shareModel.shareContent = self.subTitle;
  301. // //分享链接
  302. // shareModel.shareUrl = [NSString stringWithFormat:@"%@%@?userId=%lld&language=%@",g_config.shareUrl,act_ShareBoss,[[_dataDict objectForKey:@"userId"] longLongValue],[JXMyTools getCurrentSysLanguage]];
  303. //分享链接
  304. shareModel.shareUrl = self.url;
  305. //分享头像
  306. // shareModel.shareImageUrl = self.images.firstObject;
  307. shareModel.shareImage = self.firstImage;
  308. [[JXShareManager defaultManager] shareWith:shareModel delegate:self];
  309. }
  310. - (void)onCollection {
  311. [self.linksShareVC hideShareView];
  312. NSMutableDictionary *dataDict = [[NSMutableDictionary alloc] init];
  313. [dataDict setValue:self.url forKey:@"msg"];
  314. [dataDict setValue:@5 forKey:@"type"];
  315. [dataDict setValue:@-1 forKey:@"collectType"];
  316. [dataDict setValue:self.url forKey:@"collectContent"];
  317. NSMutableArray * emoji = [NSMutableArray array];
  318. [emoji addObject:dataDict];
  319. [g_server addFavoriteWithEmoji:emoji toView:self];
  320. }
  321. - (void)onSafari {
  322. [self.linksShareVC hideShareView];
  323. NSURL *url;
  324. if ([self.url hasPrefix:@"http://"] || [self.url hasPrefix:@"https://"]) {
  325. url = [NSURL URLWithString:self.url];
  326. }else {
  327. url = [NSURL URLWithString:[@"http://" stringByAppendingString:self.url]];
  328. }
  329. [[UIApplication sharedApplication] openURL:url];
  330. }
  331. - (void)onReport {
  332. [self.linksShareVC hideShareView];
  333. _reportVC = [[JXReportUserVC alloc] init];
  334. _reportVC.delegate = self;
  335. _reportVC.isUrl = YES;
  336. // [g_navigation pushViewController:reportVC animated:YES];
  337. [self.view addSubview:_reportVC.view];
  338. }
  339. - (void)onPasteboard {
  340. [self.linksShareVC hideShareView];
  341. [g_server showMsg:Localized(@"JX_CopySuccess")];
  342. UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
  343. pasteboard.string = self.url;
  344. }
  345. - (void)onUpdate {
  346. [self.linksShareVC hideShareView];
  347. self.textType = 0;
  348. [self.webView reload];
  349. }
  350. - (void)onSearch {
  351. [self.linksShareVC hideShareView];
  352. self.keyboardView = [[UIView alloc] initWithFrame:CGRectMake(0, JX_SCREEN_HEIGHT-JX_SCREEN_BOTTOM, JX_SCREEN_WIDTH, JX_SCREEN_BOTTOM)];
  353. self.keyboardView.backgroundColor = HEXCOLOR(0xE2E2E2);
  354. [self.view addSubview:self.keyboardView];
  355. UIButton *shutBtn = [[UIButton alloc] initWithFrame:CGRectMake(10, 14.5, 40, 20)];
  356. [shutBtn setTitle:Localized(@"JX_Close") forState:UIControlStateNormal];
  357. [shutBtn setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];
  358. [shutBtn addTarget:self action:@selector(clickShutBtn) forControlEvents:UIControlEventTouchUpInside];
  359. [self.keyboardView addSubview:shutBtn];
  360. self.textField = [[UITextField alloc] initWithFrame:CGRectMake(CGRectGetMaxX(shutBtn.frame)+10, 5, JX_SCREEN_WIDTH-50-100, 39)];
  361. self.textField.backgroundColor = [UIColor whiteColor];
  362. self.textField.layer.masksToBounds = YES;
  363. self.textField.layer.cornerRadius = 3.f;
  364. self.textField.returnKeyType = UIReturnKeySearch;
  365. self.textField.delegate = self;
  366. [self.keyboardView addSubview:self.textField];
  367. self.numLabel = [[UILabel alloc] initWithFrame:CGRectMake(JX_SCREEN_WIDTH-50-100-45, 12, 40, 15)];
  368. self.numLabel.textColor = [UIColor lightGrayColor];
  369. self.numLabel.font = SYSFONT(13);
  370. [self.textField addSubview:self.numLabel];
  371. UIButton *upBtn = [[UIButton alloc] initWithFrame:CGRectMake(CGRectGetMaxX(self.textField.frame)+10, 9.5, 30, 30)];
  372. [upBtn setImage:[UIImage imageNamed:@"im_webpage_up"] forState:UIControlStateNormal];
  373. [upBtn setTag:100];
  374. [upBtn addTarget:self action:@selector(didBtnTurnThePage:) forControlEvents:UIControlEventTouchUpInside];
  375. [self.keyboardView addSubview:upBtn];
  376. UIButton *downBtn = [[UIButton alloc] initWithFrame:CGRectMake(CGRectGetMaxX(upBtn.frame)+10, 9.5, 30, 30)];
  377. [downBtn setImage:[UIImage imageNamed:@"im_webpage_down"] forState:UIControlStateNormal];
  378. [downBtn setTag:101];
  379. [downBtn addTarget:self action:@selector(didBtnTurnThePage:) forControlEvents:UIControlEventTouchUpInside];
  380. [self.keyboardView addSubview:downBtn];
  381. [self.textField becomeFirstResponder];
  382. }
  383. - (void)onTextType {
  384. [self.linksShareVC hideShareView];
  385. self.baseView = [[UIView alloc] initWithFrame:self.view.bounds];
  386. self.baseView.backgroundColor = [UIColor clearColor];
  387. [self.view addSubview:self.baseView];
  388. UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideTextTypeBaseView)];
  389. [self.baseView addGestureRecognizer:tap];
  390. UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, self.view.frame.size.height - JX_SCREEN_BOTTOM - 80, JX_SCREEN_WIDTH, JX_SCREEN_BOTTOM + 80)];
  391. view.backgroundColor = [UIColor whiteColor];
  392. [self.baseView addSubview:view];
  393. //滑块设置
  394. _slider = [[UISlider alloc] initWithFrame:CGRectMake(20, 50, JX_SCREEN_WIDTH - 40, 20)];
  395. _slider.minimumValue = 1;
  396. _slider.maximumValue = 6;
  397. _slider.minimumTrackTintColor = [UIColor clearColor];
  398. _slider.maximumTrackTintColor = [UIColor clearColor];
  399. [_slider setValue:self.textType > 0 ? self.textType : 2];
  400. //背景图
  401. UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(20, 55, _slider.frame.size.width - 5, 10)];
  402. UIImage *img = [UIImage imageNamed:@"sliderbg"];
  403. imageView.image = img;
  404. //添加点击手势和滑块滑动事件响应
  405. [_slider addTarget:self action:@selector(valueChanged:) forControlEvents:UIControlEventValueChanged];
  406. UITapGestureRecognizer *tapS = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction:)];
  407. [_slider addGestureRecognizer:tapS];
  408. [view addSubview:imageView];
  409. [view addSubview:_slider];
  410. UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(imageView.frame.origin.x, 25, 20, 20)];
  411. label.font = [UIFont systemFontOfSize:14.0];
  412. label.textColor = [UIColor blackColor];
  413. label.text = @"A";
  414. [view addSubview:label];
  415. label = [[UILabel alloc] initWithFrame:CGRectMake(CGRectGetMaxX(imageView.frame) - 15, 25, 20, 20)];
  416. label.font = [UIFont systemFontOfSize:19.0];
  417. label.textColor = [UIColor blackColor];
  418. label.text = @"A";
  419. [view addSubview:label];
  420. label = [[UILabel alloc] initWithFrame:CGRectMake(imageView.frame.origin.x + (imageView.frame.size.width / 6), 25, 40, 20)];
  421. label.font = [UIFont systemFontOfSize:15.0];
  422. label.textColor = HEXCOLOR(0xB1B2B1);
  423. label.text = Localized(@"JX_Standard");
  424. [view addSubview:label];
  425. }
  426. - (void)onFloatWindow {
  427. [self.linksShareVC hideShareView];
  428. if (self.isFloatWindow) {
  429. self.isFloatWindow = NO;
  430. return;
  431. }
  432. self.isFloatWindow = YES;
  433. g_subWindow.frame = CGRectMake(JX_SCREEN_WIDTH - 80 - 10, 50, 60, 60);
  434. g_subWindow.backgroundColor = HEXCOLOR(0x424242);
  435. g_subWindow.layer.masksToBounds = YES;
  436. g_subWindow.layer.cornerRadius = 30;
  437. UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panAction:)];
  438. [g_subWindow addGestureRecognizer:pan];
  439. _suspensionBtn = [[UIButton alloc] initWithFrame:g_subWindow.bounds];
  440. _suspensionBtn.backgroundColor = [UIColor clearColor];
  441. [_suspensionBtn addTarget:self action:@selector(showFloatWindow) forControlEvents:UIControlEventTouchUpInside];
  442. [g_subWindow addSubview:_suspensionBtn];
  443. UIImageView *imgV = [[UIImageView alloc] initWithFrame:CGRectMake(20, 20, 20, 20)];
  444. imgV.image = [UIImage imageNamed:@"browser"];
  445. [g_subWindow addSubview:imgV];
  446. [self hideFloatWindow];
  447. }
  448. - (void)hideFloatWindow {
  449. [UIView animateWithDuration:0.5 animations:^{
  450. self.view.frame = CGRectMake(JX_SCREEN_WIDTH, 0, self.view.frame.size.width, 0);
  451. } completion:^(BOOL finished) {
  452. g_subWindow.hidden = NO;
  453. self.view.hidden = YES;
  454. }];
  455. }
  456. - (void)showFloatWindow {
  457. [g_navigation.navigationView bringSubviewToFront:self.view];
  458. g_subWindow.hidden = YES;
  459. self.view.hidden = NO;
  460. self.view.frame = CGRectMake(JX_SCREEN_WIDTH, 0, self.view.frame.size.width, 0);
  461. [UIView animateWithDuration:0.5 animations:^{
  462. self.view.frame = CGRectMake(0, 0, JX_SCREEN_WIDTH, JX_SCREEN_HEIGHT);
  463. } completion:^(BOOL finished) {
  464. }];
  465. }
  466. - (void)panAction:(UIPanGestureRecognizer *)pan {
  467. if (pan.state == UIGestureRecognizerStateBegan) {
  468. self.subWindowFrame = g_subWindow.frame;
  469. }
  470. CGPoint offset = [pan translationInView:g_App.window];
  471. CGPoint offset1 = [pan translationInView:g_subWindow];
  472. NSLog(@"pan - offset = %@, offset1 = %@", NSStringFromCGPoint(offset), NSStringFromCGPoint(offset1));
  473. CGRect frame = self.subWindowFrame;
  474. frame.origin.x += offset.x;
  475. frame.origin.y += offset.y;
  476. g_subWindow.frame = frame;
  477. if (pan.state == UIGestureRecognizerStateEnded || pan.state == UIGestureRecognizerStateCancelled) {
  478. if (frame.origin.x <= JX_SCREEN_WIDTH / 2) {
  479. frame.origin.x = 10;
  480. }else {
  481. frame.origin.x = JX_SCREEN_WIDTH - frame.size.width - 10;
  482. }
  483. if (frame.origin.y < 0) {
  484. frame.origin.y = 10;
  485. }
  486. if ((frame.origin.y + frame.size.height) > JX_SCREEN_HEIGHT) {
  487. frame.origin.y = JX_SCREEN_HEIGHT - frame.size.height - 10;
  488. }
  489. [UIView animateWithDuration:0.5 animations:^{
  490. g_subWindow.frame = frame;
  491. }];
  492. }
  493. }
  494. - (void)clickShutBtn {
  495. self.keyboardView.hidden = YES;
  496. [self.keyboardView removeFromSuperview];
  497. }
  498. - (void)didBtnTurnThePage:(UIButton *)button {
  499. if (self.textField.text.length <= 0) return;
  500. if (button.tag == 100) {
  501. //上翻
  502. self.clickTime --;
  503. if (self.clickTime < 1) {
  504. self.clickTime = self.keywordsNum;
  505. }
  506. }else {
  507. //下翻
  508. self.clickTime ++;
  509. if (self.clickTime > self.keywordsNum) {
  510. self.clickTime = 1;
  511. }
  512. }
  513. self.keywordsNum = (int)[self.webView highlightAllOccurencesOfString:self.textStr index:self.clickTime];
  514. self.numLabel.text = [NSString stringWithFormat:@"%d/%d",self.clickTime,self.keywordsNum];
  515. }
  516. - (BOOL)textFieldShouldReturn:(UITextField *)textField {
  517. if (textField.returnKeyType==UIReturnKeySearch) {
  518. self.textStr = self.textField.text;
  519. self.keywordsNum = (int)[self.webView highlightAllOccurencesOfString:textField.text index:1];
  520. self.clickTime = self.keywordsNum != 0 ? 1 : 0;
  521. self.numLabel.text = [NSString stringWithFormat:@"%d/%d",self.clickTime,self.keywordsNum];
  522. }
  523. return YES;
  524. }
  525. #pragma mark --键盘弹出
  526. - (void)keyboardWillChangeFrame:(NSNotification *)notification{
  527. //取出键盘动画的时间(根据userInfo的key----UIKeyboardAnimationDurationUserInfoKey)
  528. CGFloat duration = [notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] floatValue];
  529. //取得键盘最后的frame(根据userInfo的key----UIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 227}, {320, 253}}";)
  530. CGRect keyboardFrame = [notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
  531. //计算控制器的view需要平移的距离
  532. CGFloat transformY = keyboardFrame.origin.y - self.view.frame.size.height;
  533. //执行动画
  534. [UIView animateWithDuration:duration animations:^{
  535. self.keyboardView.frame = CGRectMake(self.keyboardView.frame.origin.x, JX_SCREEN_HEIGHT-JX_SCREEN_BOTTOM+transformY, self.keyboardView.frame.size.width, self.keyboardView.frame.size.height);
  536. }];
  537. }
  538. #pragma mark --键盘收回
  539. - (void)keyboardDidHide:(NSNotification *)notification{
  540. CGFloat duration = [notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] floatValue];
  541. [UIView animateWithDuration:duration animations:^{
  542. self.keyboardView.frame = CGRectMake(self.keyboardView.frame.origin.x, JX_SCREEN_HEIGHT-JX_SCREEN_BOTTOM, self.keyboardView.frame.size.width, self.keyboardView.frame.size.height);
  543. }];
  544. }
  545. - (void)valueChanged:(UISlider *)sender
  546. {
  547. //只取整数值,固定间距
  548. NSString *tempStr = [self numberFormat:sender.value];
  549. [sender setValue:tempStr.floatValue];
  550. NSLog(@"--------%@",tempStr);
  551. //设置网页字体大小
  552. int font = (tempStr.floatValue -1) *10 + 90;
  553. NSString* fontSize = [NSString stringWithFormat:@"%d%%",font];
  554. NSString* str = [NSString stringWithFormat:@"document.getElementsByTagName('body')[0].style.webkitTextSizeAdjust= '%@'",fontSize];
  555. [self.webView stringByEvaluatingJavaScriptFromString:str];
  556. self.textType = [tempStr intValue];
  557. }
  558. - (void)tapAction:(UITapGestureRecognizer *)sender
  559. {
  560. //取得点击点
  561. CGPoint p = [sender locationInView:_slider];
  562. //计算处于背景图的几分之几,并将之转换为滑块的值(1~6)
  563. float tempFloat = (p.x - 20) / (_slider.frame.size.width) * 6 + 1;
  564. NSString *tempStr = [self numberFormat:tempFloat];
  565. [_slider setValue:tempStr.floatValue];
  566. // NSLog(@"-------- %f,%f,%@", p.x, tempFloat, tempStr);
  567. //设置网页字体大小
  568. int font = (tempStr.floatValue -1) *10 + 90;
  569. NSString* fontSize = [NSString stringWithFormat:@"%d%%",font];
  570. NSString* str = [NSString stringWithFormat:@"document.getElementsByTagName('body')[0].style.webkitTextSizeAdjust= '%@'",fontSize];
  571. [self.webView stringByEvaluatingJavaScriptFromString:str];
  572. self.textType = [tempStr intValue];
  573. }
  574. - (void)hideTextTypeBaseView {
  575. if (self.baseView) {
  576. [self.baseView removeFromSuperview];
  577. }
  578. }
  579. - (void)report:(JXUserObject *)reportUser reasonId:(NSNumber *)reasonId {
  580. [g_server reportUser:nil roomId:nil webUrl:self.url reasonId:reasonId toView:self];
  581. }
  582. -(void)imageSelectorDidiSelectImage:(NSString *)imagePath {
  583. // JXMessageObject *msg = [[JXMessageObject alloc] init];
  584. // msg.type = [NSNumber numberWithInt:kWCMessageTypeLink];
  585. // NSMutableDictionary *dict = @{
  586. // @"title" : self.titleStr,
  587. // @"url" : self.shareUrl,
  588. // @"subTitle" : self.subTitle,
  589. // }.mutableCopy;
  590. // if (imagePath.length > 0) {
  591. // [dict addEntriesFromDictionary:@{@"img" : imagePath}];
  592. // }
  593. // NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:nil];
  594. // NSString *jsonStr = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
  595. // msg.content = jsonStr;
  596. //
  597. // _relayVC = [[JXRelayVC alloc] init];
  598. // NSMutableArray *array = [NSMutableArray arrayWithObject:msg];
  599. // // vc.msg = msg;
  600. // _relayVC.relayMsgArray = array;
  601. // _relayVC.isUrl = YES;
  602. // [self.view addSubview:_relayVC.view];
  603. // [g_navigation pushViewController:vc animated:YES];
  604. }
  605. -(void)dealloc{
  606. [[NSNotificationCenter defaultCenter]removeObserver:self];
  607. // NSLog(@"webpageVC.dealloc");
  608. self.url = nil;
  609. // [super dealloc];
  610. }
  611. - (void)didReceiveMemoryWarning
  612. {
  613. // Releases the view if it doesn't have a superview.
  614. [super didReceiveMemoryWarning];
  615. // Release any cached data, images, etc that aren't in use.
  616. }
  617. #pragma mark - View lifecycle
  618. - (void)viewDidUnload
  619. {
  620. [super viewDidUnload];
  621. // Release any retained subviews of the main view.
  622. // e.g. self.myOutlet = nil;
  623. }
  624. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
  625. {
  626. // Return YES for supported orientations
  627. return (interfaceOrientation == UIInterfaceOrientationPortrait);
  628. }
  629. -(void)onBack{
  630. [webView stopLoading];
  631. if(webView.canGoBack)
  632. [webView goBack];
  633. else
  634. [_wait start:Localized(@"webpageVC_NoPage") delay:2];
  635. }
  636. - (void)webAuthViewConfirmBtnAction {
  637. [g_server openCodeAuthorCheckAppId:self.appId state:g_server.access_token callbackUrl:self.callbackUrl toView:self];
  638. }
  639. -(UIView*)viewForZoomingInScrollView:(UIScrollView*)scrollView
  640. {
  641. return webView;
  642. }
  643. - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
  644. NSString* s = request.URL.absoluteString;
  645. NSRange range = [s rangeOfString:@"websiteAuthorh/index.html"];
  646. if (range.location != NSNotFound && range.length > 0) {
  647. NSString *webAppName = [[self subString:s withString:@"webAppName"] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  648. NSString *appId = [self subString:s withString:@"appId"];
  649. NSString *callbackUrl = [self subString:s withString:@"callbackUrl"];
  650. NSString *webAppsmallImg = [self subString:s withString:@"webAppsmallImg"];
  651. self.appId = appId;
  652. self.callbackUrl = callbackUrl;
  653. JXWebAuthView *view = [[JXWebAuthView alloc] init];
  654. view.tipTitle.text = [NSString stringWithFormat:@"%@%@:",webAppName,Localized(@"JX_ApplyFollowingPermissions")];
  655. view.delegate = self;
  656. [view.headImage sd_setImageWithURL:[NSURL URLWithString:webAppsmallImg] placeholderImage:[UIImage imageNamed:@"avatar_normal"]];
  657. [g_window addSubview:view];
  658. return NO;
  659. }
  660. NSRange rangeName = [s rangeOfString:@"?productName="];
  661. NSRange rangePrice = [s rangeOfString:@"&productPrice="];
  662. if(rangeName.location != NSNotFound && rangePrice.location != NSNotFound){
  663. rangeName.location = rangeName.location+rangeName.length;
  664. rangeName.length = rangePrice.location-rangeName.location;
  665. rangePrice.location = rangePrice.location+rangePrice.length;
  666. rangePrice.length = [s length]-rangePrice.location;
  667. _product = [s substringWithRange:rangeName];
  668. _price = [[s substringWithRange:rangePrice] floatValue];
  669. NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
  670. _product =[_product stringByReplacingPercentEscapesUsingEncoding:enc];
  671. // [g_server doBuy:_product price:_price buyCallback:self];
  672. return NO;
  673. }
  674. //webView.hidden = YES;
  675. return YES;
  676. }
  677. - (NSString *)subString:(NSString *)url withString:(NSString *)str {
  678. NSString *urlStr = [url copy];
  679. NSRange range = [urlStr rangeOfString:@"//"];
  680. urlStr = [urlStr substringFromIndex:range.location + range.length];
  681. range = [urlStr rangeOfString:[NSString stringWithFormat:@"%@=",str]];
  682. if (range.location == NSNotFound) {
  683. return nil;
  684. }
  685. urlStr = [urlStr substringFromIndex:range.location + range.length];
  686. range = [urlStr rangeOfString:@"&"];
  687. if (range.location != NSNotFound) {
  688. urlStr = [urlStr substringToIndex:range.location];
  689. }
  690. return urlStr;
  691. }
  692. -(int) didBuyOK:(AlixPayResult*)result{
  693. // [g_server updateMoneyForBuy:_product price:_price num:1 type:_type toView:self];
  694. // [_product release];
  695. return 0;
  696. }
  697. - (void)webViewDidStartLoad:(UIWebView *)webView{
  698. // aiv.hidden = NO;
  699. // [aiv startAnimating];
  700. // [self.progressLine startLoadingAnimation];
  701. }
  702. - (void)webViewDidFinishLoad:(UIWebView *)webView{
  703. // [aiv stopAnimating];
  704. NSString *string = [self.webView stringByEvaluatingJavaScriptFromString:@"document.title"];
  705. NSLog(@"title===%@",string);
  706. if (self.titleString.length > 0) {
  707. self.title = self.titleString;
  708. self.titleStr = self.titleString;
  709. }else {
  710. self.titleStr = string;
  711. self.title = string;
  712. }
  713. self.url = [self.webView.request.URL absoluteString];
  714. self.subTitle = self.url;
  715. // NSString *articleImageUrl = [self.webView stringByEvaluatingJavaScriptFromString:@"document.images[0].src"];
  716. // NSLog(@"imageurl===%@",articleImageUrl);
  717. // NSString *lJs = [self.webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.innerHTML"];
  718. // NSLog(@"lJs===%@",lJs);
  719. //这里是js,主要目的实现对url的获取
  720. // static NSString * const jsGetImages =
  721. // @"var str = new Array();"
  722. // "$('img').each(function(){str.push($(this).attr('src'));});" "str.join('+') ";
  723. static NSString * const jsGetImages =
  724. @"function getImages(){\
  725. var objs = document.getElementsByTagName(\"img\");\
  726. var imgScr = '';\
  727. for(var i=0;i<objs.length;i++){\
  728. imgScr = imgScr + objs[i].src + '+';\
  729. };\
  730. return imgScr;\
  731. };";
  732. [self.webView stringByEvaluatingJavaScriptFromString:jsGetImages];//注入js方法
  733. NSString *urlResurlt = [self.webView stringByEvaluatingJavaScriptFromString:@"getImages()"];
  734. NSMutableArray *mUrlArray = [NSMutableArray arrayWithArray:[urlResurlt componentsSeparatedByString:@"+"]];
  735. [self.images removeAllObjects];
  736. for (NSInteger i = 0; i < mUrlArray.count; i ++) {
  737. NSString *urlStr = mUrlArray [i];
  738. if (urlStr.length > 0) {
  739. [self.images addObject:urlStr];
  740. }
  741. }
  742. NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:self.images.firstObject]];
  743. if (data) {
  744. self.firstImage = [UIImage imageWithData:data];
  745. }
  746. self.sendBtn.enabled = YES;
  747. self.sendBtn.alpha = 1;
  748. [self.progressLine endLoadingAnimation];
  749. JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
  750. context[@"updateShareData"] = ^() {
  751. // [g_App showAlert:@"成功"];
  752. NSArray *arguments = [JSContext currentArguments];
  753. for (JSValue *jsValue in arguments) {
  754. NSLog(@"=======%@",jsValue);
  755. NSData *jsonData = [[jsValue toString] dataUsingEncoding:NSUTF8StringEncoding];
  756. NSError *err;
  757. NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&err];
  758. self.shareDic = [dic copy];
  759. NSLog(@"dict1 ===== %@",dic);
  760. }
  761. };
  762. // 网页调用开始录音
  763. context[@"startRecord"] = ^() {
  764. [self startRecord];
  765. };
  766. // 网页调用结束录音
  767. context[@"stopRecord"] = ^() {
  768. NSString *path = [self stopRecord];
  769. self.amrPath = path;
  770. return path;
  771. };
  772. // 开始播放
  773. context[@"playVoice"] = ^() {
  774. NSArray *arguments = [JSContext currentArguments];
  775. for (JSValue *jsValue in arguments) {
  776. self.amrPath = [jsValue toString];
  777. }
  778. [self playVoice];
  779. };
  780. // 暂停播放
  781. context[@"pauseVoice"] = ^() {
  782. [self pauseVoice];
  783. };
  784. // 停止播放
  785. context[@"stopVoice"] = ^() {
  786. [self stopVoice];
  787. };
  788. // 网页支付
  789. context[@"chooseSKPayInApp"] = ^() {
  790. NSArray *arguments = [JSContext currentArguments];
  791. for (JSValue *jsValue in arguments) {
  792. NSLog(@"=======%@",jsValue);
  793. NSData *jsonData = [[jsValue toString] dataUsingEncoding:NSUTF8StringEncoding];
  794. NSError *err;
  795. NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&err];
  796. self.orderDic = [dic copy];
  797. [g_server payGetOrderInfoWithAppId:[dic objectForKey:@"appId"] prepayId:[dic objectForKey:@"prepayId"] toView:self];
  798. NSLog(@"dict1 ===== %@",dic);
  799. }
  800. };
  801. // 分享参数
  802. context[@"getShareParams"] = ^() {
  803. return self.shareParam;
  804. };
  805. }
  806. - (void)startRecord {
  807. NSDictionary *settings=[NSDictionary dictionaryWithObjectsAndKeys:
  808. [NSNumber numberWithFloat:8000],AVSampleRateKey,
  809. [NSNumber numberWithInt:kAudioFormatLinearPCM],AVFormatIDKey,
  810. [NSNumber numberWithInt:1],AVNumberOfChannelsKey,
  811. [NSNumber numberWithInt:16],AVLinearPCMBitDepthKey,
  812. [NSNumber numberWithBool:NO],AVLinearPCMIsBigEndianKey,
  813. [NSNumber numberWithBool:NO],AVLinearPCMIsFloatKey,
  814. nil];
  815. NSError *error;
  816. [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayAndRecord error: &error];
  817. [[AVAudioSession sharedInstance] setActive:YES error:&error];
  818. NSURL *url = [NSURL fileURLWithPath:[FileInfo getUUIDFileName:@"wav"]];
  819. self.audioPath = url;
  820. _audioRecorder = [[AVAudioRecorder alloc] initWithURL:self.audioPath settings:settings error:&error];
  821. _audioRecorder.delegate = self;
  822. BOOL flag = NO;
  823. flag = [_audioRecorder prepareToRecord];
  824. [_audioRecorder setMeteringEnabled:YES];
  825. flag = [_audioRecorder peakPowerForChannel:1];
  826. flag = [_audioRecorder record];
  827. }
  828. - (NSString *)stopRecord {
  829. [_audioRecorder pause];
  830. [_audioRecorder stop];
  831. NSString *amrPath = [VoiceConverter wavToAmr:self.audioPath.path];
  832. [[ChatCacheFileUtil sharedInstance] deleteWithContentPath:self.audioPath.path];
  833. return amrPath;
  834. }
  835. - (void)playVoice {
  836. if (!self.amrPath) {
  837. self.amrPath = [VoiceConverter wavToAmr:self.audioPath.path];
  838. }
  839. [self setHardware];
  840. if ([self.amrPath rangeOfString:@"http"].location == NSNotFound) {
  841. NSString *file = [VoiceConverter amrToWav:self.amrPath];
  842. _player = [[AVAudioPlayer alloc] initWithData:[NSData dataWithContentsOfFile:file] error:nil];
  843. }else {
  844. NSString *path = [NSString stringWithFormat:@"%@%@",docFilePath,[self.amrPath lastPathComponent]];
  845. [[NSData dataWithContentsOfURL:[NSURL URLWithString:self.amrPath]] writeToFile:path atomically:YES];
  846. NSString *file = [VoiceConverter amrToWav:path];
  847. if (!file) {
  848. file = path;
  849. }
  850. _player = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:file] error:nil];
  851. }
  852. _player.delegate = self;
  853. //将播放文件加载到缓冲区
  854. [_player prepareToPlay];
  855. _player.volume = 1;
  856. [_player play];
  857. }
  858. - (void)pauseVoice {
  859. if (_player.isPlaying) {
  860. [_player pause];
  861. }else {
  862. [_player play];
  863. }
  864. }
  865. - (void)stopVoice {
  866. [_player stop];
  867. _player = nil;
  868. }
  869. // 播放完成
  870. - (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player1 successfully:(BOOL)flag{
  871. JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
  872. NSString *textJS = @"sk.playFinish()";
  873. [context evaluateScript:textJS];
  874. }
  875. -(void)setHardware{
  876. // [[UIDevice currentDevice] setProximityMonitoringEnabled:YES];
  877. //初始化播放器的时候如下设置,添加监听
  878. UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;
  879. AudioSessionSetProperty(kAudioSessionProperty_AudioCategory,
  880. sizeof(sessionCategory),
  881. &sessionCategory);
  882. UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
  883. AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,
  884. sizeof (audioRouteOverride),
  885. &audioRouteOverride);
  886. //默认情况下扬声器播放
  887. AVAudioSession *audioSession = [AVAudioSession sharedInstance];
  888. [audioSession setCategory:AVAudioSessionCategoryPlayback error:nil];
  889. [audioSession setActive:YES error:nil];
  890. // audioSession = nil;
  891. }
  892. - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error{
  893. // [aiv stopAnimating];
  894. // [aiv removeFromSuperview];
  895. [self.progressLine endLoadingAnimation];
  896. }
  897. -(float)getMoney:(char*)s{
  898. char t[255]={};
  899. int j=0;
  900. for(int i=0;i<strlen(s);i++)
  901. if(s[i] == '?'){
  902. j=i;
  903. break;
  904. }
  905. if(j<=0)
  906. return 0;
  907. for(int i=j+1;i<strlen(s);i++)
  908. t[i-j-1] = s[i];
  909. return atof(t);
  910. }
  911. - (void)didVerifyPay:(NSString *)sender {
  912. long time = (long)[[NSDate date] timeIntervalSince1970];
  913. time = (time *1000 + g_server.timeDifference)/1000;
  914. NSString *appId = [self.orderDic objectForKey:@"appId"];
  915. NSString *prepayId = [self.orderDic objectForKey:@"prepayId"];
  916. NSString *sign = [self.orderDic objectForKey:@"sign"];
  917. NSString *secret = [self getSecretWithPassword:sender time:time];
  918. // 参数顺序不能变,先放key再放value
  919. NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"appId",appId,@"prepayId",prepayId,@"sign",sign,@"money",self.skPayDic[@"money"], nil];
  920. [g_payServer payServerWithAction:act_PayPasswordPaymentV1 param:arr payPassword:sender time:time toView:self];
  921. // [g_server payPasswordPaymentWithAppId:appId prepayId:prepayId sign:sign time:[NSString stringWithFormat:@"%ld",time] secret:secret toView:self];
  922. }
  923. - (NSString *)getSecretWithPassword:(NSString *)password time:(long)time {
  924. NSMutableString *str1 = [NSMutableString string];
  925. [str1 appendString:g_myself.userId];
  926. [str1 appendString:g_server.access_token];
  927. NSMutableString *str2 = [NSMutableString string];
  928. [str2 appendString:APIKEY];
  929. [str2 appendString:[NSString stringWithFormat:@"%ld",time]];
  930. [str2 appendString:[g_server getMD5String:password]];
  931. str2 = [[g_server getMD5String:str2] mutableCopy];
  932. [str1 appendString:str2];
  933. str1 = [[g_server getMD5String:str1] mutableCopy];
  934. return [str1 copy];
  935. }
  936. - (void)dismissVerifyPayVC {
  937. [self.verVC.view removeFromSuperview];
  938. }
  939. - (void)skPayVC:(JXSkPayVC *)skPayVC payBtnAction:(NSDictionary *)payDic {
  940. if ([g_server.myself.isPayPassword boolValue]) {
  941. self.verVC = [JXVerifyPayVC alloc];
  942. self.verVC.type = JXVerifyTypeSkPay;
  943. self.verVC.RMB = [payDic objectForKey:@"money"];
  944. self.verVC.titleStr = [payDic objectForKey:@"desc"];
  945. self.verVC.delegate = self;
  946. self.verVC.didDismissVC = @selector(dismissVerifyPayVC);
  947. self.verVC.didVerifyPay = @selector(didVerifyPay:);
  948. self.verVC = [self.verVC init];
  949. [self.view addSubview:self.verVC.view];
  950. } else {
  951. JXPayPasswordVC *payPswVC = [JXPayPasswordVC alloc];
  952. payPswVC.type = JXPayTypeSetupPassword;
  953. payPswVC.enterType = JXVerifyTypeSkPay;
  954. payPswVC = [payPswVC init];
  955. [g_navigation pushViewController:payPswVC animated:YES];
  956. }
  957. }
  958. -(void) didServerResultSucces:(JXConnection*)aDownload dict:(NSDictionary*)dict array:(NSArray*)array1{
  959. [_wait stop];
  960. if ([aDownload.action isEqualToString:act_openCodeAuthorCheck]) {
  961. NSString *callbackUrl = [dict objectForKey:@"callbackUrl"];
  962. callbackUrl = [callbackUrl stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  963. NSString *url;
  964. if ([callbackUrl rangeOfString:@"?"].location != NSNotFound) {
  965. url = [NSString stringWithFormat:@"%@&code=%@",callbackUrl,[dict objectForKey:@"code"]];
  966. }else {
  967. url = [NSString stringWithFormat:@"%@?code=%@",callbackUrl,[dict objectForKey:@"code"]];
  968. }
  969. url = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  970. NSURLRequest *p = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:url]];
  971. [webView loadRequest:p];
  972. }
  973. if([aDownload.action isEqualToString:act_userEmojiAdd]){
  974. [g_server showMsg:Localized(@"JX_CollectionSuccess")];
  975. }
  976. if([aDownload.action isEqualToString:act_Report]){
  977. [g_App showAlert:Localized(@"JXUserInfoVC_ReportSuccess")];
  978. }
  979. if ([aDownload.action isEqualToString:act_userCheckReportUrl]) {
  980. [self webViewLoad];
  981. }
  982. if ([aDownload.action isEqualToString:act_PayGetOrderInfo]) {
  983. self.skPayDic = [dict copy];
  984. JXSkPayVC *vc = [[JXSkPayVC alloc] init];
  985. vc.payDic = [dict copy];
  986. vc.delegate = self;
  987. [self presentViewController:vc animated:YES completion:nil];
  988. }
  989. if ([aDownload.action isEqualToString:act_PayPasswordPayment] || [aDownload.action isEqualToString:act_PayPasswordPaymentV1]) {
  990. [self dismissVerifyPayVC];
  991. JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
  992. NSString *textJS = @"sk.paySuccess()";
  993. [context evaluateScript:textJS];
  994. }
  995. }
  996. -(int) didServerResultFailed:(JXConnection*)aDownload dict:(NSDictionary*)dict{
  997. [_wait stop];
  998. if ([aDownload.action isEqualToString:act_userCheckReportUrl]) {
  999. NSString *path = [[NSBundle mainBundle] pathForResource:@"prohibit" ofType:@"html"];
  1000. NSURL* url = [NSURL fileURLWithPath:path];//创建URL
  1001. NSURLRequest* request = [NSURLRequest requestWithURL:url];//创建NSURLRequest
  1002. [webView loadRequest:request];//加载
  1003. self.title = Localized(@"JX_ShikuProtocolTitle");
  1004. return hide_error;
  1005. }
  1006. return show_error;
  1007. }
  1008. -(int) didServerConnectError:(JXConnection*)aDownload error:(NSError *)error{//error为空时,代表超时
  1009. [_wait stop];
  1010. return show_error;
  1011. }
  1012. -(void) didServerConnectStart:(JXConnection*)aDownload{
  1013. // [_wait start];
  1014. }
  1015. /**
  1016. * 四舍五入
  1017. *
  1018. * @param num 待转换数字
  1019. *
  1020. * @return 转换后的数字
  1021. */
  1022. - (NSString *)numberFormat:(float)num
  1023. {
  1024. NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
  1025. [formatter setPositiveFormat:@"0"];
  1026. return [formatter stringFromNumber:[NSNumber numberWithFloat:num]];
  1027. }
  1028. @end