|
|
|
|
//
|
|
|
|
|
// commWebViewController.m
|
|
|
|
|
// FireBoltt
|
|
|
|
|
//
|
|
|
|
|
// Created by ecell on 2023/3/16.
|
|
|
|
|
// Copyright © 2023 Sheldon. All rights reserved.
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
#import "commWebViewController.h"
|
|
|
|
|
|
|
|
|
|
#define RGB(r, g, b) [UIColor colorWithRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:1.0]
|
|
|
|
|
#define FontADA_(x) [UIFont fontWithName:@"HelveticaNeue" size: x]
|
|
|
|
|
|
|
|
|
|
@interface commWebViewController ()<WKNavigationDelegate>
|
|
|
|
|
|
|
|
|
|
@property (nonatomic, strong) WKWebView *myWebView;
|
|
|
|
|
|
|
|
|
|
/// 右侧的选项 容器View
|
|
|
|
|
@property (nonatomic, strong) UIView *webOptionView;
|
|
|
|
|
/// 进度条
|
|
|
|
|
@property (nonatomic, strong) UIProgressView* progressView;
|
|
|
|
|
/// 当前链接
|
|
|
|
|
@property (nonatomic, strong) NSString* currentURLString;
|
|
|
|
|
|
|
|
|
|
/// 第一次加载完成
|
|
|
|
|
@property (nonatomic, assign) BOOL isFristLoadFinish;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@property (nonatomic ,weak) UITextView *textView;
|
|
|
|
|
|
|
|
|
|
@end
|
|
|
|
|
|
|
|
|
|
@implementation commWebViewController
|
|
|
|
|
|
|
|
|
|
- (void)viewDidLoad {
|
|
|
|
|
[super viewDidLoad];
|
|
|
|
|
// Do any additional setup after loading the view.
|
|
|
|
|
|
|
|
|
|
// //添加监测网页加载进度的观察者
|
|
|
|
|
// [self.myWebView addObserver:self
|
|
|
|
|
// forKeyPath:@"estimatedProgress"
|
|
|
|
|
// options:0
|
|
|
|
|
// context:nil];
|
|
|
|
|
//
|
|
|
|
|
// //添加监测网页标题title的观察者
|
|
|
|
|
// [self.myWebView addObserver:self
|
|
|
|
|
// forKeyPath:@"title"
|
|
|
|
|
// options:NSKeyValueObservingOptionNew
|
|
|
|
|
// context:nil];
|
|
|
|
|
|
|
|
|
|
UITextView *textView = [[UITextView alloc] init];
|
|
|
|
|
textView.backgroundColor = UIColor.clearColor;
|
|
|
|
|
textView.frame = self.view.frame;
|
|
|
|
|
textView.textColor = UIColor.blackColor;
|
|
|
|
|
textView.font = FontADA_(18);
|
|
|
|
|
textView.textAlignment = NSTextAlignmentLeft;
|
|
|
|
|
textView.textContainerInset = UIEdgeInsetsMake(15, 15, 70, 15);
|
|
|
|
|
textView.inputAccessoryView = self.view;
|
|
|
|
|
[self.view addSubview:textView];
|
|
|
|
|
self.textView = textView;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
- (WKWebView *)myWebView{
|
|
|
|
|
if (!_myWebView) {
|
|
|
|
|
_myWebView = [[WKWebView alloc] init];
|
|
|
|
|
_myWebView.frame = self.view.frame;
|
|
|
|
|
[self.view addSubview:_myWebView];
|
|
|
|
|
}
|
|
|
|
|
return _myWebView;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
-(UIProgressView *)progressView{
|
|
|
|
|
if(!_progressView){
|
|
|
|
|
_progressView = [[UIProgressView alloc] init];
|
|
|
|
|
_progressView.progressTintColor = UIColor.greenColor;
|
|
|
|
|
_progressView.frame = CGRectMake(0, 0, self.view.frame.size.width, 3);
|
|
|
|
|
[self.view addSubview:_progressView];
|
|
|
|
|
}
|
|
|
|
|
return _progressView;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//退出页面
|
|
|
|
|
-(void)viewDidDisappear:(BOOL)animated
|
|
|
|
|
{
|
|
|
|
|
[super viewDidDisappear:animated];
|
|
|
|
|
|
|
|
|
|
//移除观察者
|
|
|
|
|
@try {
|
|
|
|
|
[_myWebView removeObserver:self forKeyPath:NSStringFromSelector(@selector(estimatedProgress))];
|
|
|
|
|
} @catch (NSException *exception) {
|
|
|
|
|
NSLog(@"RemoveObserver estimatedProgress ERROR!");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// [_webView removeObserver:self forKeyPath:NSStringFromSelector(@selector(title))];
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//kvo 监听进度 必须实现此方法
|
|
|
|
|
-(void)observeValueForKeyPath:(NSString *)keyPath
|
|
|
|
|
ofObject:(id)object
|
|
|
|
|
change:(NSDictionary<NSKeyValueChangeKey,id> *)change
|
|
|
|
|
context:(void *)context{
|
|
|
|
|
if ([keyPath isEqualToString:NSStringFromSelector(@selector(estimatedProgress))]
|
|
|
|
|
&& object == _myWebView) {
|
|
|
|
|
NSLog(@"网页加载进度 = %f",_myWebView.estimatedProgress);
|
|
|
|
|
self.progressView.progress = _myWebView.estimatedProgress;
|
|
|
|
|
if (_myWebView.estimatedProgress >= 1.0f) {
|
|
|
|
|
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
|
|
|
|
|
self.progressView.progress = 0;
|
|
|
|
|
self.progressView.hidden = YES;
|
|
|
|
|
});
|
|
|
|
|
}else{
|
|
|
|
|
self.progressView.hidden = NO;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if([keyPath isEqualToString:@"title"]
|
|
|
|
|
&& object == _myWebView){
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
else{
|
|
|
|
|
[super observeValueForKeyPath:keyPath
|
|
|
|
|
ofObject:object
|
|
|
|
|
change:change
|
|
|
|
|
context:context];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
- (void)openScheme:(NSString *)scheme {
|
|
|
|
|
UIApplication *application = [UIApplication sharedApplication];
|
|
|
|
|
NSURL *URL = [NSURL URLWithString:scheme];
|
|
|
|
|
|
|
|
|
|
//iOS 10 以后
|
|
|
|
|
if ([application respondsToSelector:@selector(openURL:options:completionHandler:)]) {
|
|
|
|
|
//1 如果这个要打开的URL有效,并且在应用中配置它布尔值为true(YES)时才可以打开,否则打不开
|
|
|
|
|
// NSDictionary *options = @{UIApplicationOpenURLOptionUniversalLinksOnly : @YES};
|
|
|
|
|
//2 此时与openURL功能相似
|
|
|
|
|
NSDictionary *options =@{};
|
|
|
|
|
[application openURL:URL options:options
|
|
|
|
|
completionHandler:^(BOOL success) {
|
|
|
|
|
NSLog(@"Open %@: %d",scheme,success);
|
|
|
|
|
}];
|
|
|
|
|
} else {
|
|
|
|
|
if ([application canOpenURL:URL]) {
|
|
|
|
|
BOOL success = [application openURL:URL];
|
|
|
|
|
NSLog(@"Open %@: %d",scheme,success);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- (void)webOperationAction:(UIBarButtonItem*)sender{
|
|
|
|
|
if(self.isFristLoadFinish == NO){
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
//如果还没加载完成,不能打开
|
|
|
|
|
if(!_webOptionView){
|
|
|
|
|
CGFloat aWidth = 180;
|
|
|
|
|
_webOptionView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
|
|
|
|
|
_webOptionView.backgroundColor = [UIColor colorWithRed:2/255.0 green:1/255.0 blue:6/255.0 alpha:0.4];
|
|
|
|
|
_webOptionView.userInteractionEnabled = YES;
|
|
|
|
|
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hiddenWebOptionAction:)];
|
|
|
|
|
[_webOptionView addGestureRecognizer:tap];
|
|
|
|
|
UIWindow *win = [UIApplication sharedApplication].keyWindow;
|
|
|
|
|
[win addSubview:_webOptionView];
|
|
|
|
|
UIView *contentView = [[UIView alloc] initWithFrame:CGRectMake(self.view.frame.size.width-aWidth-25, 0 - 20, aWidth, 90)];
|
|
|
|
|
contentView.layer.cornerRadius = 5;
|
|
|
|
|
contentView.layer.masksToBounds = YES;
|
|
|
|
|
|
|
|
|
|
contentView.backgroundColor = [UIColor whiteColor];
|
|
|
|
|
[_webOptionView addSubview:contentView];
|
|
|
|
|
UIButton *copBtn = [UIButton buttonWithType:UIButtonTypeCustom];
|
|
|
|
|
[copBtn setImage:[UIImage imageNamed:@"icon_copylink"] forState:0];
|
|
|
|
|
[copBtn setTitle:@"复制连接" forState:0];
|
|
|
|
|
copBtn.frame = CGRectMake(0, 0, aWidth, 45);
|
|
|
|
|
copBtn.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
|
|
|
|
|
[copBtn setTitleColor: RGB(52, 52, 52) forState:0];
|
|
|
|
|
copBtn.titleLabel.font = FontADA_(14);
|
|
|
|
|
copBtn.imageEdgeInsets = UIEdgeInsetsMake(0, 15, 0, 0);
|
|
|
|
|
copBtn.titleEdgeInsets =UIEdgeInsetsMake(0, 15+15, 0, 0);
|
|
|
|
|
[contentView addSubview:copBtn];
|
|
|
|
|
[copBtn addTarget:self action:@selector(copyLinkAction:) forControlEvents:UIControlEventTouchUpInside];
|
|
|
|
|
|
|
|
|
|
UIButton *openWebBtn = [UIButton buttonWithType:UIButtonTypeCustom];
|
|
|
|
|
[openWebBtn setImage:[UIImage imageNamed:@"icon_browser_open"] forState:0];
|
|
|
|
|
[openWebBtn setTitleColor:RGB(52, 52, 52) forState:0];
|
|
|
|
|
[openWebBtn setTitle:@"在浏览器中打开" forState:0];
|
|
|
|
|
openWebBtn.titleLabel.font = FontADA_(14);
|
|
|
|
|
openWebBtn.imageEdgeInsets = UIEdgeInsetsMake(0, 15, 0, 0);
|
|
|
|
|
openWebBtn.titleEdgeInsets =UIEdgeInsetsMake(0, 15+15, 0, 0);
|
|
|
|
|
openWebBtn.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
|
|
|
|
|
openWebBtn.frame = CGRectMake(0, 45, aWidth, 45);
|
|
|
|
|
[contentView addSubview:openWebBtn];
|
|
|
|
|
[openWebBtn addTarget:self action:@selector(openLinkWithSystemWeb:) forControlEvents:UIControlEventTouchUpInside];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
_webOptionView.hidden = !_webOptionView.hidden;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
- (void)hiddenWebOptionAction:(id)sender{
|
|
|
|
|
if(_webOptionView){
|
|
|
|
|
_webOptionView.hidden = YES;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// 复制连接
|
|
|
|
|
- (void)copyLinkAction:(UIButton*)sender{
|
|
|
|
|
UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
|
|
|
|
|
if(self.currentURLString.length > 0){
|
|
|
|
|
pasteboard.string = self.currentURLString;
|
|
|
|
|
NSLog(@"复制连接到剪贴板了...:%@",self.currentURLString);
|
|
|
|
|
//[UICommon MessageSuccessText:@"链接已经成功复制到剪贴板"];
|
|
|
|
|
[self hiddenWebOptionAction:nil];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
/// 打开浏览器
|
|
|
|
|
- (void)openLinkWithSystemWeb:(UIButton*)sender{
|
|
|
|
|
|
|
|
|
|
if(_currentURLString.length > 0){
|
|
|
|
|
|
|
|
|
|
// IOS11 以下的
|
|
|
|
|
if([[[UIDevice currentDevice] systemVersion] doubleValue] < 10.0){
|
|
|
|
|
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:_currentURLString]];
|
|
|
|
|
}else{
|
|
|
|
|
// iOS 11 以上
|
|
|
|
|
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:_currentURLString] options:@{} completionHandler:^(BOOL success) {
|
|
|
|
|
NSLog(@"success: %d",success);
|
|
|
|
|
}];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
[self hiddenWebOptionAction:nil];
|
|
|
|
|
}
|
|
|
|
|
// 页面开始加载时调用
|
|
|
|
|
- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation {
|
|
|
|
|
}
|
|
|
|
|
// 页面加载失败时调用
|
|
|
|
|
- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(null_unspecified WKNavigation *)navigation withError:(NSError *)error {
|
|
|
|
|
[self.progressView setProgress:0.0f animated:NO];
|
|
|
|
|
}
|
|
|
|
|
// 当内容开始返回时调用
|
|
|
|
|
- (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation {
|
|
|
|
|
}
|
|
|
|
|
// 页面加载完成之后调用
|
|
|
|
|
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
|
|
|
|
|
// [self getCookie];
|
|
|
|
|
self.currentURLString = webView.URL.absoluteURL.absoluteString;
|
|
|
|
|
self.isFristLoadFinish = YES;
|
|
|
|
|
NSLog(@"页面加载完成时的连接:%@",self.currentURLString);
|
|
|
|
|
}
|
|
|
|
|
//提交发生错误时调用
|
|
|
|
|
- (void)webView:(WKWebView *)webView didFailNavigation:(WKNavigation *)navigation withError:(NSError *)error {
|
|
|
|
|
[self.progressView setProgress:0.0f animated:NO];
|
|
|
|
|
}
|
|
|
|
|
// 接收到服务器跳转请求即服务重定向时之后调用
|
|
|
|
|
- (void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(WKNavigation *)navigation {
|
|
|
|
|
}
|
|
|
|
|
// 根据WebView对于即将跳转的HTTP请求头信息和相关信息来决定是否跳转
|
|
|
|
|
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
|
|
|
|
|
|
|
|
|
|
NSString * urlStr = navigationAction.request.URL.absoluteString;
|
|
|
|
|
|
|
|
|
|
NSLog(@"发送跳转请求:%@",urlStr);
|
|
|
|
|
NSString * toJumpURL = @"";
|
|
|
|
|
if ([urlStr containsString:@"apps.apple.com"] || [urlStr containsString:@"itunes.apple.com"]) {
|
|
|
|
|
toJumpURL = [urlStr stringByReplacingOccurrencesOfString:@"https:" withString:@"itms-apps:"];
|
|
|
|
|
|
|
|
|
|
}else if (![urlStr hasPrefix:@"https://"] && ![urlStr hasPrefix:@"http://"]){
|
|
|
|
|
// 不含 https:// 和 http:// 的都跳转
|
|
|
|
|
|
|
|
|
|
toJumpURL = urlStr;
|
|
|
|
|
}
|
|
|
|
|
if(toJumpURL.length > 0){
|
|
|
|
|
if([toJumpURL containsString:@"://"]){
|
|
|
|
|
NSLog(@"只有包含 : < :// > 的才控制跳转浏览器: %@", urlStr);
|
|
|
|
|
// IOS11 以下的
|
|
|
|
|
if([[[UIDevice currentDevice] systemVersion] doubleValue] < 11.0){
|
|
|
|
|
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:toJumpURL]];
|
|
|
|
|
}else{
|
|
|
|
|
// iOS 11 以上
|
|
|
|
|
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:toJumpURL] options:@{} completionHandler:^(BOOL success) {
|
|
|
|
|
NSLog(@"success: %d",success);
|
|
|
|
|
}];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
decisionHandler(WKNavigationActionPolicyAllow);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 根据客户端受到的服务器响应头以及response相关信息来决定是否可以跳转
|
|
|
|
|
- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler{
|
|
|
|
|
NSString * urlStr = navigationResponse.response.URL.absoluteString;
|
|
|
|
|
NSLog(@"当前跳转地址:%@",urlStr);
|
|
|
|
|
//允许跳转
|
|
|
|
|
decisionHandler(WKNavigationResponsePolicyAllow);
|
|
|
|
|
//不允许跳转
|
|
|
|
|
//decisionHandler(WKNavigationResponsePolicyCancel);
|
|
|
|
|
}
|
|
|
|
|
//需要响应身份验证时调用 同样在block中需要传入用户身份凭证
|
|
|
|
|
//- (void)webView:(WKWebView *)webView didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * _Nullable credential))completionHandler{
|
|
|
|
|
// //用户身份信息
|
|
|
|
|
// NSURLCredential * newCred = [[NSURLCredential alloc] initWithUser:@"user123" password:@"123" persistence:NSURLCredentialPersistenceNone];
|
|
|
|
|
// //为 challenge 的发送方提供 credential
|
|
|
|
|
// [challenge.sender useCredential:newCred forAuthenticationChallenge:challenge];
|
|
|
|
|
// completionHandler(NSURLSessionAuthChallengeUseCredential,newCred);
|
|
|
|
|
//}
|
|
|
|
|
//进程被终止时调用
|
|
|
|
|
- (void)webViewWebContentProcessDidTerminate:(WKWebView *)webView{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- (void)viewWillAppear:(BOOL)animated
|
|
|
|
|
{
|
|
|
|
|
[super viewWillAppear:animated];
|
|
|
|
|
|
|
|
|
|
// [self.myWebView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:self.url]]];
|
|
|
|
|
// self.myWebView.navigationDelegate = self;
|
|
|
|
|
|
|
|
|
|
self.textView.attributedText = [self textFontSize:[self subbcontent]];
|
|
|
|
|
|
|
|
|
|
UIButton * button = [UIButton buttonWithType:UIButtonTypeCustom];
|
|
|
|
|
button.frame = CGRectMake(0, 0, 80, 49);
|
|
|
|
|
[button setTitle:self.navTitle forState:UIControlStateNormal];
|
|
|
|
|
button.titleLabel.font = [UIFont fontWithName:@"HelveticaNeue-Bold" size: 20];
|
|
|
|
|
[button setTitleColor:[UIColor colorWithRed:45.0/255.0 green:45.0/255.0 blue:45.0/255.0 alpha:1] forState:0];
|
|
|
|
|
[button setImage:[UIImage imageNamed:@"fb_nav_back"] forState:0];
|
|
|
|
|
[button addTarget:self action:@selector(buttonClick) forControlEvents:UIControlEventTouchUpInside];
|
|
|
|
|
UIBarButtonItem * backButtonItem = [[UIBarButtonItem alloc] initWithCustomView:button];
|
|
|
|
|
self.navigationItem.leftBarButtonItem = backButtonItem;
|
|
|
|
|
self.navigationController.navigationBarHidden = NO;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
- (void)buttonClick
|
|
|
|
|
{
|
|
|
|
|
[self.navigationController popViewControllerAnimated:YES];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- (NSString *)subbcontent
|
|
|
|
|
{
|
|
|
|
|
NSString *content;
|
|
|
|
|
if ([self.url isEqualToString:@"http://wx.ecellsz.com/mp/iosPrivacy.html"])
|
|
|
|
|
{
|
|
|
|
|
content = @" Privacy policy\n FireBoltt Respect and protect the personal privacy rights of all service users。In order to provide you with more accurate and personalized services, FireBoltt will use and disclose your personal information in accordance with the provisions of this Privacy Policy. But the FireBoltt will treat this information with a high degree of diligence and prudence.Unless otherwise provided in this Privacy Policy, FireBoltt will not disclose or provide such information to third parties without your prior permission. When you agree to the FireBoltt Service Use Agreement, you shall be deemed to have agreed to the whole content of this Privacy Policy. This Privacy Statement applies to all related services of FireBoltt. With the scope of FireBoltt services, the contents can be updated by FireBoltt without further notice.The updated privacy statement will effectively replace the original privacy statement once published.\n\n1.Scope of application\na) Personal registration information that you provide as per FireBoltt requirements when you register your FireBoltt account;\nb) FireBoltt Personal data of users obtained from business partners through legal channels;\nc) FireBoltt To obtain the location information, on the one hand, the scanning device needs to obtain the location information, on the other hand, it obtains the current location weather to push the weather information to the device, and the server will not save the user's location information;\nd) FireBoltt Read, modify or delete the contents of the memory card to save the user added and modified personal avatar information;\ne) FireBoltt Use the camera permission for users to take photos and modify their personal profile picture information;\nf) FireBoltt Receive SMS / read SMS / MMS to send the SMS obtained from the mobile phone to the device;;\ng) FireBoltt Answer calls / make calls, used for the device end to control the mobile phone call hang up and answer;\nh)FireBoltt Read / modify / delete call records / read call status / read contacts, used for SMS notification and call notification to the device end for mobile phone number comparison contacts;\ni)FireBoltt Self-start, used to maintain the Bluetooth connection of the device to timely send the notification received by the phone to the device end.\n\n2. Information use\na) FireBoltt Will not provide, sell, lease, share or trade your personal information to any unrelated third party unless with prior permission, or the third party and FireBoltt (including FireBoltt affiliates), individually or jointly, provide access to you.\nb) FireBoltt Do not allow any third party to collect, edit, sell or disseminate your personal information by any means. If any FireBoltt platform user engin the above activities, FireBoltt has the right to terminate the service agreement with the user immediately.\n\n3. Information disclosure\n\nThe FireBoltt will disclose your personal information in whole or in part under your personal will or law if:\n\na)Disclose to a third party with your prior consent;\nb)Disclosing to a third party or administrative or judicial organs in accordance with the relevant provisions of the law or the requirements of administrative or judicial organs;\nc) If you violate relevant India laws, regulations or FireBoltt service agreements or relevant rules, you need to disclose them to a third party;\nd) If you are an qualified intellectual property complainant and have filed a complaint, it should be disclosed to the complainant at the request of the complainant, so that both parties can deal with possible rights disputes;\ne) Other FireBoltt disclosures as deemed appropriate in accordance with laws, regulations or website policies。\n\n4. Information storage and exchange\nFireBoltt The information and data collected about you will be stored on the servers of FireBoltt and (or) its affiliated companies, which may be transmitted to your country, region or where FireBoltt collects the information and data and be accessed, stored and displayed abroad。\n\n5
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
content = @" Special tips\n Boltt Games Pvt.Ltd (hereinafter referred to as ""FireBoltt"") hereby reminds you (users) to read this User Agreement (the ""Agreement"") carefully before registering as a user to ensure that you fully understand the terms of this Agreement.Your registration, login, use will be deemed an acceptance of this Agreement and agree to be bound by the terms of this Agreement.\n\nHis Agreement specifies the rights and obligations between users and the ""FireBoltt"" Software Service.""User"" means an individual who registers, logs in, and uses the Service.This Agreement may be updated at any time. The updated terms of the Agreement shall replace the original terms of the Agreement without further notice, and users may check the latest version of the terms of the Agreement on this website.After the modification of the terms of the agreement, if the user does not accept the modified terms, please immediately stop using the services provided by FireBoltt, and the user continues to use the services provided by Isai will be deemed to accept the modified agreement.\n\n1.Authorizing the collection of personal information\n1.1、Personal information refers to the information recorded in electronic or other means to identify the identity of a specific natural person or reflect the activity of a specific natural person in combination of a particular natural person.\n1.2、Personal information involved in ""FireBoltt"" includes: basic information (including personal name, birthday, last name, height, weight); address book; personal common equipment information;Personal location information (including itinerary information, accurate positioning information, longitude and latitude, etc.); personal health information (activity management, sleep analysis, physical training, heart rate, steps, walking, exercise distance, etc.).\n1.3、When using the service, FireBoltt may collect personal information that can identify the user so that FireBolttcan contact users if necessary or provide users with a better use experience.The information collected by FireBoltt includes but is not limited to the gender, age, date of birth and personal description; the use of the information shall be subject to the protection of the personal privacy information of Article 3.\n\n2.Service content\n2.1、The specific content of this service shall be provided by FireBoltt according to the actual situation, including but not limited to authorized users to make instant messaging, add friends, join groups and post messages through their accounts.FireBoltt can change the service provided, and the service content provided by it may change at any time; users will receive the notification of the service change.\n2.2、All the services provided by FireBoltt are free. If the charging service function is added in the later period, it will be notified later.\n\n3. Protection of the user's personal privacy information\n3.1、When registering an account or using the Service, users may need to fill in or submit some necessary information, such as the identity information specified in laws, regulations, rules and normative documents (hereinafter referred to as ""Laws and Regulations"").If the information submitted by the user is incomplete or does not comply with the provisions of laws and regulations, the user may not be able to use the Service or be restricted in the process of using the Service.\n3.2、Personal privacy information refers to the information involving the user's personal identity or personal privacy, such as the user's real name, ID card number, mobile phone number, mobile phone device identification number, IP address, and the user's chat record.Non-personal privacy information refers to the basic record information clearly and objectively reflected in the server side outside the scope of personal privacy information,And the above privacy information that the user agrees to disclose.\n3.3、Respecting the privacy of users 'personal privacy information is a consistent system of FireBoltt, which will take technical measur
|
|
|
|
|
}
|
|
|
|
|
return content;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
- (NSAttributedString *)textFontSize:(NSString *)text
|
|
|
|
|
{
|
|
|
|
|
NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithString:text];
|
|
|
|
|
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
|
|
|
|
|
paragraphStyle.lineSpacing = 5;
|
|
|
|
|
paragraphStyle.alignment = NSTextAlignmentLeft;
|
|
|
|
|
[string addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, string.length)];
|
|
|
|
|
|
|
|
|
|
return string;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
#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
|