作者: xiao, yanzi

感觉苹果要发 AR 眼镜了

根据 WWDC 那个海报 https://developer.apple.com/wwdc21/

还有昨天“苹果代言人”何同学发的 AR 眼镜视频 https://www.bilibili.com/video/BV1RA41157hM

可能都是苹果新品铺垫,大家觉得呢?虽然我觉得目前的 AR 真的挺鸡肋的,属于玩一玩挺有意思,但*不会高频次融入生活像手机那样使用

21 条回复    2021-04-10 14:42:48 +08:00
darksword21
    1

darksword21   4 小时 10 分钟前   ❤️ 2

我这就发微信问问库克
Kr98
    2

Kr98   4 小时 7 分钟前 via Android

你想太多了,人家只是想把 21 june 7 换种方式打出来罢了。
Building
    3

Building   4 小时 1 分钟前   ❤️ 5

有一个人在机场等六点的飞机,可是他忘记了带手表,于是他想找个人问问。
这时,他看见一个人提着两个巨大的手提箱吃力的走过来,手腕上戴着一块异常漂亮的一看就知道是高科技产品的手表。
“请问,几点了?”他问道。
“哪个国家的时间?”那人反问。
“哦?”他的好奇心来了,“你都知道哪些国家的时间呢?”
“所有的国家,”那人回答道。
“哇!那可真是一块好手表呀!”
“还不止这些呢,这块表还有 GPS 卫星系统,可以随时收发电子邮件、传真,这个彩色的屏幕可以收看NTSC制式的电视节目!”那人给他演示,果真如此!
“哦!太棒了,我真想拥有一块这样的手表,您……您可以把它卖给我吗?”
“说实话,我已经烦透了这块表了,这样吧,900 美元,如何?”
他马上掏出支票簿,写了900美元给那人,“成交!”
“好的,现在,它是你的了。”那人如释重负,把手表交给他,“这个是你的手表,”,然后指着地上的两个大箱子说,“这两个是电池!”
x86
    4

x86   3 小时 59 分钟前   ❤️ 1

你们小时候考试是不是阅读理解都是满分的?
santheniko
    5

santheniko   3 小时 53 分钟前

@Kr98 也许苹果也有这层含义,但也有楼主的那层含义
eden0412
    6

eden0412   3 小时 45 分钟前

根据 WWDC 海报猜新品猜错也不是一次两次了
wanguorui123
    7

wanguorui123   3 小时 42 分钟前

做好了是下一代人机交互设备,做差了连 Apple Watch 都不如
oszlso
    8

oszlso   3 小时 39 分钟前

苹果确实要做 AR 眼镜,严格来讲*代产品不叫眼镜,是一款头戴式设备,而且不是面向消费者,可以期待今年苹果会分享相关进展
oszlso
    9

oszlso   3 小时 36 分钟前

因为这款产品太贵,普通人不会买…
qsmd42
    10

qsmd42   3 小时 26 分钟前

你都知道目前 AR 鸡肋 苹果又不傻 肯定等一两年技术成熟了才发

murmur
    11

murmur   3 小时 10 分钟前

那么这个 AR 眼镜他送不送充电器呢
nguoidiqua
    12

nguoidiqua   3 小时 1 分钟前

微软的 AR 设备已经签下两百亿美元的大单了。

这类设备给一般消费者日常用,显然是鸡肋且代价不菲的,但在一些特殊工作领域作用非常大。

苹果也有很多面向企业和专业人士需求的业务,毕竟早期的苹果电脑都是这种定位,现在要做个 AR 设备也不奇怪。但根据我的估计,应该没那么快发布设备,可能只是类似去年先公布电脑要转向 ARM 那样。

netshell
    13

netshell   2 小时 57 分钟前

不看好消费端的 ar
可能在有限的领域和专业上有价值
可能给 b 端或开发者
Pandroid
    14

Pandroid   2 小时 53 分钟前

Apple 做 AR 眼镜,消息都已经传了三四年了。。。。
byicer
    15

byicer   2 小时 20 分钟前

一人发一个吗?
BingoXuan
    16

BingoXuan   2 小时 13 分钟前 via Android

lz 感觉而已。乐观估计 2023 。
otakustay
    17

otakustay   2 小时 5 分钟前

据说 iOS 15 的图标也改了,带深度了
ElliotQi
    18

ElliotQi   1 小时 46 分钟前

昨天晚上看了何同学视频同有这种想法,脐带一下
z761031
    19

z761031   1 小时 16 分钟前

不是出街带的眼镜,而是室内头戴式游戏沉浸设备,占领游戏市场用的。
jackwow
    20

jackwow   50 分钟前

@Kr98 换种方式有很多,那为什么是用这种方式呢?
想多了不是问题,想不出来才是问题。
Kr98
    21

Kr98   45 分钟前

@jackwow 苹果为什么不叫西瓜呢要叫苹果呢?

iOS开发-调试网络限速(真机和模拟器)

在iOS开发中,针对不同网络状况做一下测试处理是很有必要的。但是我发现还是有一些iOS开发者不太注意到不同网络环境下的调试问题,或者说不清楚如何调试这种情况。

下面我将针对真机和模拟器分别做简单的说明。告诉大家如何模拟不同的网络状况。

1.真机情况下

其实Apple在iOS系统中预置了网络调试工具,但是只有添加过测试设备,并使用XCode连接下设备才能激活.

%title插图%num

注意中间的那行NETWORK LINK CONDITIONER

%title插图%num

上图中的Status是表示网络限制是否开启,点击进去就可看到详细设置

%title插图%num

可以看到系统默认配置的网络条件还是很多的,其中:

100%Loss是全丢包,

3G这个就不用说了吧

DSL是电话线上网,

Edge是2G网络,

High Latency DNS是高延迟,

Very Bad Network是网络状况不稳定。

并且底部还有一个添加额外配置的选项可以自定义网络状况。

2.模拟器

由于模拟器是在电脑上的,mac上也有和iOS设备中一样的调试工具,并且在Apple官网工具中有哦。

该工具的Apple官方地址:https://developer.apple.com/downloads/index.action?q=Network%20Link%20Conditioner#
输入搜索:Hardware IO Tools for Xcode 下载自己需要的版本就好了

%title插图%num

打开DMG文件,里面包含了许多调试工具,其他的工具有兴趣的可以自己去看一下。这里我们只打开Network Link Conditioner.prefPane这个文件

%title插图%num

在系统偏好中出现了工具:

%title插图%num

打开工具,看一下。

%title插图%num

几乎和手机一样。可以看到系统默认配置的网络条件还是很多的,其中:

100%Loss是全丢包,

3G这个就不用说了吧

DSL是电话线上网,

Edge是2G网络,

High Latency DNS是高延迟,

Very Bad Network是网络状况不稳定。

Git 【Mac 系统下搭建本地 Git 服务器】

一、准备原料

① jdk

下载地址:jdk

② gitblit

下载地址:gitblit.com

二、配置

jdk 直接安装即可。

gitblit 需要进行一些小配置:

① 解压下载好的 gitblit 文件,我这里的版本为 1.8.0。

%title插图%num

② 配置本地 Git 服务器仓库存储数据的根目录。

打开文件 ~/gitblit-1.8.0/data/defaults.properties

修改本地 Git 服务器仓库根目录:

git.repositoriesFolder = GitRepository
我这里用的文件夹名称为 GitRepository。

修改 HTTP 协议端口号:

server.httpPort = 1234
这里可以随便自定义一个不重复的端口号。保存。

③ 启动 gitblit 服务。

./gitblit.sh

你会看到如下命令行输出:

1 wangzhongyao:gitblit-1.8.0 wangzhongyao$ ./gitblit.sh
2 2017-11-02 16:09:50 [INFO ]
3   _____  _  _    _      _  _  _
4  |  __ \(_)| |  | |    | |(_)| |
5  | |  \/ _ | |_ | |__  | | _ | |_
6  | | __ | || __|| ‘_ \ | || || __|  http://gitblit.com
7  | |_\ \| || |_ | |_) || || || |_   @gitblit
8   \____/|_| \__||_.__/ |_||_| \__|  1.8.0
9
10 2017-11-02 16:09:50 [INFO ] Running on Mac OS X (10.13)
11 2017-11-02 16:09:50 [INFO ] Logging initialized @389ms
12 2017-11-02 16:09:55 [INFO ] Using JCE Standard Encryption Policy files, encryption key lengths will be limited
13 2017-11-02 16:09:55 [INFO ] Setting up HTTPS transport on port 8443
14 2017-11-02 16:09:55 [INFO ]    certificate alias = localhost
15 2017-11-02 16:09:55 [INFO ]    keyStorePath   = /Users/wangzhongyao/Desktop/gitblit-1.8.0/data/serverKeyStore.jks
16 2017-11-02 16:09:55 [INFO ]    trustStorePath = /Users/wangzhongyao/Desktop/gitblit-1.8.0/data/serverTrustStore.jks
17 2017-11-02 16:09:55 [INFO ]    crlPath        = /Users/wangzhongyao/Desktop/gitblit-1.8.0/data/certs/caRevocationList.crl
18 2017-11-02 16:09:55 [INFO ] Setting up HTTP transport on port 20202
19 2017-11-02 16:09:55 [INFO ] Shutdown Monitor listening on port 8081
20 2017-11-02 16:09:55 [INFO ] jetty-9.2.13.v20150730
21 2017-11-02 16:09:56 [INFO ] NO JSP Support for /, did not find org.eclipse.jetty.jsp.JettyJspServlet
22 2017-11-02 16:09:57 [INFO ]
23 2017-11-02 16:09:57 [INFO ] —-[com.gitblit.manager.IRuntimeManager]—-
24 2017-11-02 16:09:57 [INFO ] Basefolder  : /Users/wangzhongyao/Desktop/gitblit-1.8.0/data
25 2017-11-02 16:09:57 [INFO ] Settings    : /Users/wangzhongyao/Desktop/gitblit-1.8.0/data/gitblit.properties
26 2017-11-02 16:09:57 [INFO ] JVM timezone: Asia/Shanghai (CST +0800)
27 2017-11-02 16:09:57 [INFO ] App timezone: Asia/Shanghai (CST +0800)
28 2017-11-02 16:09:57 [INFO ] JVM locale  : zh_CN
29 2017-11-02 16:09:57 [INFO ] App locale  : <client>
30 2017-11-02 16:09:57 [INFO ]
31 2017-11-02 16:09:57 [INFO ] —-[com.gitblit.manager.INotificationManager]—-
32 2017-11-02 16:09:57 [WARN ] Mail service disabled.
33 2017-11-02 16:09:57 [INFO ]
34 2017-11-02 16:09:57 [INFO ] —-[com.gitblit.manager.IUserManager]—-
35 2017-11-02 16:09:57 [INFO ] ConfigUserService(/Users/wangzhongyao/Desktop/gitblit-1.8.0/data/users.conf)
36 2017-11-02 16:09:57 [INFO ]
37 2017-11-02 16:09:57 [INFO ] —-[com.gitblit.manager.IAuthenticationManager]—-
38 2017-11-02 16:09:57 [INFO ] External authentication disabled.
39 2017-11-02 16:09:57 [INFO ]
40 2017-11-02 16:09:57 [INFO ] —-[com.gitblit.transport.ssh.IPublicKeyManager]—-
41 2017-11-02 16:09:57 [INFO ] FileKeyManager (/Users/wangzhongyao/Desktop/gitblit-1.8.0/data/ssh)
42 2017-11-02 16:09:57 [INFO ]
43 2017-11-02 16:09:57 [INFO ] —-[com.gitblit.manager.IRepositoryManager]—-
44 2017-11-02 16:09:57 [INFO ] Repositories folder : /Users/wangzhongyao/Desktop/gitblit-1.8.0/GitRepository
45 2017-11-02 16:09:57 [INFO ] Identifying repositories…
46 2017-11-02 16:09:57 [INFO ] 1 repositories identified with calculated folder sizes in 166 msecs
47 2017-11-02 16:09:57 [INFO ] Lucene will process indexed branches every 2 minutes.
48 2017-11-02 16:09:57 [INFO ] Garbage Collector (GC) is disabled.
49 2017-11-02 16:09:57 [INFO ] Mirror service is disabled.
50 2017-11-02 16:09:57 [INFO ] Alias ‘UTF8’, UTF-9 & UTF-18 encodings as UTF-8 in JGit
51 2017-11-02 16:09:57 [INFO ] Preparing 14 day commit cache. please wait…
52 2017-11-02 16:09:57 [INFO ]   cached 1 commits for Git/CoderZYWang.git:refs/heads/master
53 2017-11-02 16:09:57 [INFO ] built 14 day commit cache of 1 commits across 1 repositories in 16 msecs
54 2017-11-02 16:09:57 [INFO ]
55 2017-11-02 16:09:57 [INFO ] —-[com.gitblit.manager.IProjectManager]—-
56 2017-11-02 16:09:57 [INFO ]
57 2017-11-02 16:09:57 [INFO ] —-[com.gitblit.manager.IFederationManager]—-
58 2017-11-02 16:09:57 [INFO ]
59 2017-11-02 16:09:57 [INFO ] —-[com.gitblit.tickets.ITicketService]—-
60 2017-11-02 16:09:57 [INFO ] NullTicketService started
61 2017-11-02 16:09:57 [INFO ]
62 2017-11-02 16:09:57 [INFO ] —-[com.gitblit.manager.IGitblit]—-
63 2017-11-02 16:09:57 [INFO ]
64 2017-11-02 16:09:57 [INFO ] —-[com.gitblit.manager.IServicesManager]—-
65 2017-11-02 16:09:57 [INFO ] Federation passphrase is blank! This server can not be PULLED from.
66 2017-11-02 16:09:57 [INFO ] Fanout PubSub service is disabled.
67 2017-11-02 16:09:57 [INFO ] Git Daemon is listening on 0.0.0.0:9418
68 2017-11-02 16:09:57 [INFO ] SSH Daemon (NIO2) is listening on 0.0.0.0:29418
69 2017-11-02 16:09:57 [INFO ]
70 2017-11-02 16:09:57 [INFO ] —-[com.gitblit.manager.IFilestoreManager]—-
71 2017-11-02 16:09:57 [INFO ] No filestore metadata file found
72 2017-11-02 16:09:57 [INFO ]
73 2017-11-02 16:09:57 [INFO ] —-[com.gitblit.manager.IPluginManager]—-
74 2017-11-02 16:09:57 [INFO ] PF4J version 1.8.0 in ‘deployment’ mode
75 2017-11-02 16:09:57 [INFO ] Enabled plugins: []
76 2017-11-02 16:09:57 [INFO ] Disabled plugins: []
77 2017-11-02 16:09:57 [INFO ] No plugins
78 2017-11-02 16:09:57 [INFO ]
79 2017-11-02 16:09:57 [INFO ] All managers started.
80 2017-11-02 16:09:57 [INFO ]
81 2017-11-02 16:09:58 [INFO ] [GitBlitWebApp] init: Wicket core library initializer
82 2017-11-02 16:09:58 [INFO ] [GitBlitWebApp] init: Wicket extensions initializer
83 2017-11-02 16:09:58 [INFO ] [GitBlitWebApp] Started Wicket version 1.4.22 in deployment mode
84 2017-11-02 16:09:58 [INFO ] Started o.e.j.w.WebAppContext@4e3a6f94{/,file:/Users/wangzhongyao/Desktop/gitblit-1.8.0/data/temp/webapp/,AVAILABLE}{file:/Users/wangzhongyao/Desktop/gitblit-1.8.0/gitblit.jar}
85 2017-11-02 16:09:58 [INFO ] Started ServerConnector@725746c{SSL-HTTP/1.1}{0.0.0.0:8443}
86 2017-11-02 16:09:58 [INFO ] Started ServerConnector@67f7fd0{HTTP/1.1}{0.0.0.0:20202}
87 2017-11-02 16:09:58 [INFO ] Started @8927ms

此时表示 Git 本地服务器仓库建立连接,你可以用服务器 IP + 端口号来访问:

%title插图%num

要注意的是,启动 gitblit.sh 服务的终端不要关闭,保持长连接,这样才可以持续访问 gitblit 本地服务器。

三、测试

我们可以直接在自己电脑上去拉取我们自己电脑作为 Git 服务器的 Git 仓库,如下:

%title插图%num

如此, 基于 Gitblit 的本地 Git 服务器搭建完毕。

要注意的是,虽然我们向自建本地 Git 服务器仓库提交代码。但是在我们本地服务器也是进行了加密处理过的。所以是看不到详细内容的。

具体提交的加密内容在 objects 文件夹下可以看到。而分支可以在 refs/heads 文件夹下查看。如下图:

%title插图%num

%title插图%num

iOS 【OC 封装网络请求业务类(AFHTTPSessionManager)】

由于AFNetworking底层请求由NSURLConnection更新为NSURLSession,管理者对象也由AFHTTPRequestOperationManager更新为AFURLSessionManager。

本文重点讲述如何封装AFN业务类,将第三方为程序带来的污染减小到*低。

读者可以结合老版本AFHTTPRequestOperationManager的封装去理解,具体请参考:

iOS 【network-封装业务类AFNetworking(AFHTTPRequestOperationManager 废弃)】

代码描述:
① 封装业务类

1 //
2 //  WZYAFNTool.h
3 //  0716-02AFN上传下载GETPOST-01
4 //
5 //  Created by 王中尧 on 16/7/16.
6 //  Copyright © 2016年 wzy. All rights reserved.
7 //
8
9 #import <Foundation/Foundation.h>
10 @class AFNetWorking;
11
12 @interface WZYAFNTool : NSObject
13
14 + (void)get:(NSString *)url parameters:(id)params success:(void (^)(id object))success failure:(void (^)(NSError *error))failure;
15
16 + (void)post:(NSString *)url parameters:(id)params success:(void (^)(id object))success failure:(void (^)(NSError *error))failure;
17
18 + (void)unload:(NSString *)uploadUrl parameters:(id)params filePath:(NSString *)filePath name:(NSString *)name progress:(void (^)(NSProgress *))progress success:(void (^)(id object))success failure:(void (^)(NSError *))failure;
19
20 + (void)download:(NSString *)url progress:(void (^)(NSProgress *progress))progress destination:(NSURL *(^)(NSURL *targetPath, NSURLResponse *response))destination failure:(void (^)(NSURLResponse * response, NSURL * filePath, NSError * error))failure;
21
22 @end

 

 

1 //
2 //  WZYAFNTool.m
3 //  0716-02AFN上传下载GETPOST-01
4 //
5 //  Created by 王中尧 on 16/7/16.
6 //  Copyright © 2016年 wzy. All rights reserved.
7 //
8
9 #import “WZYAFNTool.h”
10 #import “AFNetworking.h”
11
12 @implementation WZYAFNTool
13
14 + (void)get:(NSString *)url parameters:(id)params success:(void (^)(id object))success failure:(void (^)(NSError *error))failure {
15
16     AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
17
18     [manager GET:url parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
19
20         if (success) {
21             success(responseObject);
22         }
23
24     } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
25
26         if (failure) {
27             failure(error);
28         }
29
30     }];
31 }
32
33 + (void)post:(NSString *)url parameters:(id)params success:(void (^)(id object))success failure:(void (^)(NSError *error))failure {
34
35     AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
36
37     [manager GET:url parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
38
39         if (success) {
40             success(responseObject);
41         }
42
43     } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
44
45         if (failure) {
46             failure(error);
47         }
48
49     }];
50 }
51
52 + (void)unload:(NSString *)uploadUrl parameters:(id)params filePath:(NSString *)filePath name:(NSString *)name progress:(void (^)(NSProgress *progress))progress success:(void (^)(id object))success failure:(void (^)(NSError *error))failure {
53
54     AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
55
56     [manager POST:uploadUrl parameters:params constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
57
58         /*
59          *个参数:要上传的文件的URL
60          第二个参数:后台接口规定
61          第三个参数:错误信息
62          */
63         [formData appendPartWithFileURL:[NSURL fileURLWithPath:filePath] name:name error:nil];
64     } progress:^(NSProgress * _Nonnull uploadProgress) {
65
66         if (progress) {
67             progress(uploadProgress);
68         }
69
70     } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
71
72         if (success) {
73             success(responseObject);
74         }
75
76     } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
77
78         if (failure) {
79             failure(error);
80         }
81
82     }];
83 }
84
85 + (void)download:(NSString *)url progress:(void (^)(NSProgress *progress))progress destination:(NSURL *(^)(NSURL *targetPath, NSURLResponse *response))destination failure:(void (^)(NSURLResponse * response, NSURL * filePath, NSError * error))failure {
86     // 1 创建会话管理者
87     AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
88
89     // 2 创建请求路径 请求对象
90     NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];
91
92     // 3 创建请求下载操作对象
93     NSURLSessionDownloadTask *downTask = [manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {
94
95         if (progress) {
96             progress(downloadProgress);
97         }
98
99     } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
100
101         if (destination) {
102             return  destination(targetPath, response);
103         } else {
104             return nil;
105         }
106     } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
107         if (failure) {
108             failure(response, filePath, error);
109         }
110     }];
111
112     // 4 执行任务发送下载操作请求
113     [downTask resume];
114 }
115
116 @end

 

② 调用

1 //
2 //  ViewController.m
3 //  0716-02AFN上传下载GETPOST-01
4 //
5 //  Created by 王中尧 on 16/7/16.
6 //  Copyright © 2016年 wzy. All rights reserved.
7 //
8
9 #import “ViewController.h”
10 #import “AFNetworking.h”
11
12 #import “WZYAFNTool.h”
13
14 @interface ViewController ()
15
16 @end
17
18 @implementation ViewController
19
20 – (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
21     // 使用AFN原生方法
22 //    [self getAFN];
23 //    [self postAFN];
24 //    [self upload];
25 //    [self download];
26
27     // 使用WZYAFNTool业务类
28 //    [self wzyGET];
29 //    [self wzyPOST];
30 //    [self wzyUpload];
31 //    [self wzyDownload];
32 }
33
34 // AFN GET请求
35 – (void)getAFN {
36
37     // 1 封装会话管理者
38     AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
39
40     // 2 拼接请求参数
41     NSDictionary *dict = @{
42                            @”username” : @”xxx”,
43                            @”pwd” : @”xxx”,
44                            @”type” : @”JSON”
45                            };
46     // 3 发送请求
47     /*
48      *个参数:请求路径(!不包含参数) 类型是NSString
49      以前:http://120.25.226.186:32812/login?username=xxx&pwd=xxx&type=JSON
50      现在:http://120.25.226.186:32812/login
51      第二个参数:参数(用字典来保存参数)
52      第三个参数:progress 进度回调
53      第四个参数:success成功之后的回调
54      responseObject:注意此参数是响应体(内部已经完成了反序列化处理:JSON—>OC,此处类型为id,也就是OC对象)
55      task.response:响应头
56      第五个参数:failure 失败之后的回调
57     */
58     [manager GET:@”http://120.25.226.186:32812/login” parameters:dict progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
59
60         NSLog(@”success—%@—%@”, responseObject, [responseObject class]);
61     } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
62         NSLog(@”failure—%@”, error);
63     }];
64
65 }
66 // WZYAFNTool GET请求
67 – (void)wzyGET {
68     NSDictionary *dict = @{
69                            @”username” : @”xxx”,
70                            @”pwd” : @”xxx”,
71                            @”type” : @”JSON”
72                            };
73
74     [WZYAFNTool get:@”http://120.25.226.186:32812/login” parameters:dict success:^(id object) {
75         NSLog(@”success—%@”, object);
76     } failure:^(NSError *error) {
77         NSLog(@”error—%@”, error);
78     }];
79 }
80
81
82 // AFN POST请求
83 – (void)postAFN {
84     // 1 封装会话管理者
85     AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
86
87     // 2 拼接请求参数
88     NSDictionary *dict = @{
89                            @”username” : @”xxx”,
90                            @”pwd” : @”xxx”,
91                            @”type” : @”JSON”
92                            };
93     // 3 发送请求
94     /*
95      *个参数:请求路径(!不包含参数) 类型是NSString
96      以前:http://120.25.226.186:32812/login?username=xxx&pwd=123&type=JSON
97      现在:http://120.25.226.186:32812/login
98      第二个参数:参数(用字典来保存参数)
99      第三个参数:progress 进度回调
100      第四个参数:success成功之后的回调
101      responseObject:注意此参数是响应体(内部已经完成了反序列化处理:JSON—>OC,此处类型为id,也就是OC对象)
102      task.response:响应头
103      第五个参数:failure 失败之后的回调
104      */
105     [manager POST:@”http://120.25.226.186:32812/login” parameters:dict progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
106
107         NSLog(@”success—%@—%@”, responseObject, [responseObject class]);
108     } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
109         NSLog(@”failure—%@”, error);
110     }];
111 }
112 // WZYAFNTool POST请求
113 – (void)wzyPOST {
114     NSDictionary *dict = @{
115                            @”username” : @”xxx”,
116                            @”pwd” : @”xxx”,
117                            @”type” : @”JSON”
118                            };
119     [WZYAFNTool post:@”http://120.25.226.186:33122/login” parameters:dict success:^(id object) {
120         NSLog(@”success—%@”, object);
121     } failure:^(NSError *error) {
122         NSLog(@”error—%@”, error);
123     }];
124 }
125
126
127 // AFN 上传
128 – (void)upload {
129     // 1 创建请求者对象
130     AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
131
132     // 2 发送POST请求上传数据文件
133     NSDictionary *dict = @{@”wzy” : @”wangzhongyao”};
134
135     /*
136      *个参数: 请求路径
137      第二个参数: 非文件参数 (字典)
138      第三个参数: constructingBodyWithBlock 处理上传的文件
139      第四个参数: progress 进度回调
140      第五个参数: success 成功之后的回调
141      responseObject 响应体
142      第六个参数: failure 失败之后的回调
143      */
144
145     [manager POST:@”http://120.25.226.186:31112/upload” parameters:dict constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
146
147         /*
148          *个参数:要上传的文件的URL
149          第二个参数:后台接口规定
150          第三个参数:错误信息
151          */
152         [formData appendPartWithFileURL:[NSURL fileURLWithPath:@”/Users/wangzhongyao/Desktop/Snip20160716_17.png”] name:@”file” error:nil];
153     } progress:^(NSProgress * _Nonnull uploadProgress) {
154
155         // 上传进度
156         NSLog(@”unload — %f”, 1.0 *uploadProgress.completedUnitCount / uploadProgress.totalUnitCount);
157
158     } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
159
160         //JSON—>OC 反序列化
161         NSLog(@”响应体 — %@”,responseObject); // responseObject 响应体 在方法内部就反序列化成功
162     } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
163
164         // 输出错误信息
165         NSLog(@”%@”, error);
166     }];
167 }
168 // WZYAFNTool 上传
169 – (void)wzyUpload {
170     NSDictionary *dict = @{@”wzy” : @”wangzhongyao”};
171
172     [WZYAFNTool unload:@”http://120.25.226.186:32812/upload” parameters:dict filePath:@”/Users/wangzhongyao/Desktop/Snip20160716_17.png” name:@”file” progress:^(NSProgress *progress) {
173
174         // 上传进度
175         NSLog(@”unload — %f”, 1.0 *progress.completedUnitCount / progress.totalUnitCount);
176     } success:^(id object) {
177
178         //JSON—>OC 反序列化
179         NSLog(@”响应体 — %@”,object); // responseObject 响应体 在方法内部就反序列化成功
180     } failure:^(NSError *error) {
181
182         // 输出错误信息
183         NSLog(@”%@”, error);
184     }];
185
186 }
187
188
189 // AFN 下载
190 – (void)download {
191
192     /*
193      *个参数: 请求对象
194      第二个参数: progress进度回调
195      第三个参数: destination URL处理的回调
196                targetPath:文件下载到沙盒中的临时路径
197                response:响应头信息
198      返回值: 告诉AFN文件应该剪切到什么地方
199      第四个参数: completionHandler完成之后的回调
200                filePath:就是文件的*终保存位置
201      */
202
203     // 1 创建会话管理者
204     AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
205
206     // 2 创建请求路径 请求对象
207     NSURL *url = [NSURL URLWithString:@”http://www.bz55.com/uploads/allimg/150326/140-150326141213-50.jpg”];
208     NSURLRequest *request = [NSURLRequest requestWithURL:url];
209
210     // 3 创建请求下载操作对象
211     NSURLSessionDownloadTask *downTask = [manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {
212
213         // 计算进度
214         NSLog(@”downloading — %f”, 1.0 * downloadProgress.completedUnitCount / downloadProgress.totalUnitCount);
215
216     } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
217
218         // 获得文件下载保存的全路径
219         NSString *fullPath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:response.suggestedFilename];
220         NSLog(@”fullPath — %@, tmpPath — %@”, fullPath, targetPath); // 打印需要修改的全路径 & 临时路径
221
222         // 该方法会拼接上协议头 file:// 成为一个完整的URL,而URLWithString不会自动拼接协议头
223         return [NSURL fileURLWithPath:fullPath]; // 该block是有返回值的,返回文件剪切保存的路径
224
225     } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
226         NSLog(@”filePath — %@”, filePath);
227     }];
228
229     // 4 执行任务发送下载操作请求
230     [downTask resume];
231 }
232 // WZYAFNTool 下载
233 – (void)wzyDownload {
234     [WZYAFNTool download:@”http://www.bz55.com/uploads/allimg/150326/140-150326141213-50.jpg” progress:^(NSProgress *progress) {
235
236         // 计算进度
237         NSLog(@”downloading — %f”, 1.0 * progress.completedUnitCount / progress.totalUnitCount);
238
239     } destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
240
241         // 获得文件下载保存的全路径
242         NSString *fullPath = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:response.suggestedFilename];
243         NSLog(@”fullPath — %@, tmpPath — %@”, fullPath, targetPath); // 打印需要修改的全路径 & 临时路径
244
245         // 该方法会拼接上协议头 file:// 成为一个完整的URL,而URLWithString不会自动拼接协议头
246         return [NSURL fileURLWithPath:fullPath];
247
248     } failure:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
249
250         NSLog(@”filePath — %@”, filePath); // filePath — (null)
251
252     }];
253 }
254
255 @end

 

IOS 开发 AFNetworking 网络工具-网络请求的三次封装 OC版

NetworkTool.h
亲测可用,能正常获取数据(已后台返回的json数据作为测试的)

1 //
2 //  NetworkTool.h
3 //
4 //  Created by zhouyu on 16/10/25.
5 //  Copyright © 2016年 mac All rights reserved.
6 //
7
8 #import <Foundation/Foundation.h>
9 #import <AFNetworking/AFNetworking.h>
10
11
12 typedef enum{
13     requestTypeGET,
14     requestTypePOST
15 }requestType;
16
17 @interface NetworkTool : AFHTTPSessionManager
18
19 //单例
20 + (instancetype)shareNetworkTool;
21
22 //*次封装参数比较多,比较长
23 – (void)requestWithType:(requestType)type URLString:(nonnull NSString *)URLString parameters:(nullable id)parameters progress:(nullable void (^)(NSProgress *_Nonnull downloadProgress))downloadProgress success:(nullable void (^)(NSURLSessionDataTask *_Nullable task, id _Nullable responseObject))success
24                 failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *_Nonnull error))failure;
25
26 //第二次封装,简化参数,把没有用的progress参数去掉
27 – (void)requestWithType:(requestType)type URLString:(nonnull NSString *)URLString parameters:(nullable id)parameters success:(nullable void (^)(id _Nullable responseObject))success  failure:(nullable void (^)(NSError *_Nonnull error))failure;
28
29 //第三次封装,直接使用类方法,外部调用单例都不用创建
30 + (void)requestWithType:(requestType)type URLString:(nonnull NSString *)URLString parameters:(nullable id)parameters success:(nullable void (^)(id _Nullable responseObject))success  failure:(nullable void (^)(NSError *_Nonnull error))failure;
31 @end

NetworkTool.m

1 //
2 //  NetworkTool.m
3 //
4 //  Created by zhouyu on 16/10/25.
5 //  Copyright © 2016年 mac All rights reserved.
6 //
7
8 #import “NetworkTool.h”
9
10 static NetworkTool *instance;
11
12 @implementation NetworkTool
13
14 + (instancetype)shareNetworkTool {
15     static dispatch_once_t onceToken;
16     dispatch_once(&onceToken, ^{
17         instance = [[NetworkTool alloc]init];
18         //  让AFN默认也支持接收text/html文件类型
19         instance.responseSerializer.acceptableContentTypes
20         = [NSSet setWithObjects:@”application/json”, @”text/json”, @”text/javascript”, @”text/html”,@”text/plain”, nil];
21     });
22     return instance;
23 }
24
25 //MARK: 一次封装的网络工具类
26 – (void)requestWithType:(requestType)type URLString:(NSString *)URLString parameters:(nullable id)parameters progress:(nullable void (^)(NSProgress *downloadProgress))downloadProgress success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success
27                 failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure{
28     if (type == requestTypeGET) {
29         [instance GET:URLString parameters:parameters progress:downloadProgress success:success failure:failure];
30     } else if (type == requestTypePOST) {
31         [instance POST:URLString parameters:parameters progress:downloadProgress success:success failure:failure];
32     }
33 }
34
35 //MARK: 二次封装的网络工具类
36 – (void)requestWithType:(requestType)type URLString:(nonnull NSString *)URLString parameters:(nullable id)parameters success:(nullable void (^)(id _Nullable responseObject))success  failure:(nullable void (^)(NSError *_Nonnull error))failure{
37     //(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success
38     void (^orginalSuccess)(NSURLSessionDataTask * _Nullable, id  _Nullable) = ^(NSURLSessionDataTask * _Nullable task, id  _Nullable responseObject) {
39 //        success((NSDictionary *)responseObject);
40         success(responseObject);
41     };
42     //(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure
43     void (^orginalFailure)(NSURLSessionDataTask * _Nullable, NSError * _Nonnull) = ^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
44         failure(error);
45     };
46     [self requestWithType:type URLString:URLString parameters:parameters progress:nil success:orginalSuccess failure:orginalFailure];
47 }
48
49 //MARK: 三次封装的网络工具类
50 + (void)requestWithType:(requestType)type URLString:(nonnull NSString *)URLString parameters:(nullable id)parameters success:(nullable void (^)(id _Nullable responseObject))success  failure:(nullable void (^)(NSError *_Nonnull error))failure {
51     [[NetworkTool shareNetworkTool] requestWithType:type URLString:URLString parameters:parameters success:success failure:failure];
52 }

项目实测

1 //网络请求
2 – (void)addNetworkData {
3     NSString *URLString = [NSString stringWithFormat:@”%@”,BaseURLString];
4
5     NSString *token = [[NSUserDefaults standardUserDefaults] objectForKey:@”token”];
6
7     NSDictionary *parameters = @{
8                                  @”token”:token
9                                  };
10     //使用第三次封装的类方法–类名直接调用,简洁明了
11         [NetworkTool requestWithType:requestTypePOST URLString:URLString parameters:parameters success:^(id  _Nullable responseObject) {
12     ZYLog(@”%@”,responseObject);
13     } failure:^(NSError *_Nonnull error) {
14
15     }];
16 }

ZYLog(@”%@”,responseObject);的输出结果

%title插图%num

 

1 // MARK: 弹框
2 – (void)sendUIAlertControllerWithTitle:(NSString *)title message:(NSString *)message {
3     UIAlertController *alert = [UIAlertController alertControllerWithTitle:title message:message preferredStyle:UIAlertControllerStyleAlert];
4     [self presentViewController:alert animated:YES completion:^{
5         dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
6             [alert dismissViewControllerAnimated:YES completion:nil];
7         });
8     }];
9 }

调用*次封装的效果

1 [[NetworkTool shareNetworkTool] requestWithType:requestTypePOST URLString:URLString parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nullable task, id  _Nullable responseObject) {
2 //处理返回的json
3
4 } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
5 [self sendUIAlertControllerWithTitle:@”用户信息获取失败” message:@”网络延迟/系统繁忙”];
6 }];

调用第二次封装的效果

1     [[NetworkTool shareNetworkTool] requestWithType:requestTypePOST URLString:URLString parameters:parameters success:^(id  _Nullable responseObject) {
2
3         //返回的数据处理
4     } failure:^(NSError * _Nonnull error) {
5         [self sendUIAlertControllerWithTitle:@”用户信息获取失败” message:@”网络延迟/系统繁忙”];
6     }];

URL编码 百分号编码 定义特点

1. URL 编码是:使用 百分号% + 十六进制数字 在URL中表示特殊字符的编码方式。
2. 为什么要使用 URL编码 百分号编码 ?
每一个 URL 都是单独的字符串。作为一个连续的字符串,URL 是不能存在空格的。所以在使用 URL 的时候需要使用其他的字符代替 空格。
URL 中经常使用到的 ? 和 # 等符号在 URL 中具有特殊的定义,在正常使用时,不能直接使用这些符号。所以我们需要使用其他字符代替这些符号。
根据 RFC 3986 协议定义,URL 对于在 URL 中用到的特殊字符和关键字,都需要使用特定的 URL 编码进行转化。
3. URL 如何转化特殊字符与关键字
主要分成两步:
step 1 :将保留字符转化为对应的 ASCⅡ 字节值 (byte value);
step 2 :将对应的对应的 ASCⅡ 字节值(十进制)转换成对应的十六进制值。
step 3 :在对应十六进制值前面加上百分号 % 。
4. 示例:空格的 URL 编码转化:
空格 -> ASCⅡ 字节值 : 32 -> 十六进制值 : 20 -> 前加 % :%20

【读书笔记】iOS-网络-HTTP-URL百分号编码

代码:

– (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.

//URL百分号编码
//URL编码会编码&,问号和其他标点符号。
NSString *urlString=@”http://myhost.com?query=This is a question”;
NSString *encoded=[urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSLog(@”–urlString–%@”,urlString);
NSLog(@”–endcoded–%@”,encoded);

}

 

输出:

2015-08-18 21:41:58.501 百分号编码[730:74165] –urlString–http://myhost.com?query=This is a question
2015-08-18 21:41:58.501 百分号编码[730:74165] –endcoded–http://myhost.com?query=This%20is%20a%20question

巧用iOS宏定义

1 __attribute__((used,section…)) 把某个变量的放入特殊的section中
2
3 用法:
4 char *kChinaPYG __attribute((used, section(“__DATA, ChinaPYG”))) = “ChinaPYG.CoM”;
5 char *kDllHook __attribute((used, section(“__DATA, DllHook”))) = “DllHook.CoM”;
6 使用 used字段,即使没有任何引用,在Release下也不会被优化
7
8 进阶:宏定义来实现上述过程
9 #define XX_EXPORT_MODULE(module, impl) \
10 class NSObject; char * k##module __XX_MODULE_DATA(XXModule) = “{\””#module”\”:\””#impl”\”}”
11
12 #define __XX_MODULE_DATA(XXModule) __attribute((used, section(“__DATA, “#XXModule””)))
13
14 获取文件名
15 #define _XX_FILE_ (strrchr(__FILE__, ‘/’) ? strrchr(__FILE__, ‘/’) + 1 : __FILE__)
16
17 获取代码行
18 __LINE__
19
20 __func__,__FUNCTION__ ,__PRETTY_FUNCTION__
21 描述
22 GCC实现了如下的函数宏
23 __func__ C99的标准,但是GCC只输出函数名称。
24 __FUNCTION__ 同 __func__,
25 __PRETTY_FUNCTION__ 非标准宏。这个宏比 __FUNCTION__ 功能更强:
26 (1)若用 g++ 编译 C++ 程序, __FUNCTION__ 只能输出类的成员函数名,不会输出类名;而 __PRETTY_FUNCTION__ 则会以 <return-type> <class-name>::<member-function-name>(<parameters-list>)的格式输出成员函数的详悉信息(注: 只会输出 parameters-list 的形参类型,而不会输出形参名)。
27 (2) 若用 gcc 编译 C 程序,__PRETTY_FUNCTION__ 跟 __FUNCTION__ 的功能相同.
28 __VA_ARGS__
29 描述
30 C99 编译器标准允许定义可变参数宏(variadic macros),这样就使用拥有可以变化的参数表的宏。
31 #define FYFLog(format, …) NSLog(format, __VA_ARGS__)
32 缺省号代表一个可以变化的参数表。使用保留名 ‘__VA_ARGS__’ 把参数传递给宏。当宏的调用展开时,实际的参数就传递给 NSLog() 了。
33
34
35 ##
36 描述
37 (1)在标准 C 里,你不能省略可变参数,但是你却可以给它传递一个空的参数。GNU CPP 在这种情况下可以让你完全的忽略可变参数。在上面的例子中,编译器仍然会有问题( complain ),因为宏展开后,里面的字符串后面会有个多余的逗号。
38 为了解决这个问题, CPP 使用一个特殊的‘ ## ’操作。书写格式为:
39 #define XXLog(format, …) NSLog(format, ##__VA_ARGS__)
40 这里,如果可变参数被忽略或为空,‘ ## ’操作将使预处理器( preprocessor )去除掉它前面的那个逗号。如果你在宏调用时,确实提供了一些可变参数, GNU CPP 也会工作正常,它会把这些可变参数放到逗号的后面。
41
42 宏定义再进阶
43 #define __XX_CONCAT(A, B) A ## B
44 #define XX_DYNAMIC __attribute__((objc_dynamic))
45 #define XX_EXPORT_XXXX(SomeThing) \
46 XX_EXPORT_XXXX_REMAP(, SomeThing)
47
48 #define XX_EXPORT_XXXX_REMAP(name, SomeThing) \
49 _XX_EXPORT_XXXX_REMAP_INTERNAL(name, SomeThing, “__hello_key__”)
50
51 #define _XX_EXPORT_XXXX_REMAP_INTERNAL(name, SomeThing, key) \
52 + (NSArray *)__XX_CONCAT(key, __LINE__) XX_DYNAMIC { \
53     return @[NSStringFromSelector(SomeThing), name]; \
54 }

iOS判断字符串中是否含有非法字符

iOS判断字符串中是否含有非法字符 (非法字符是指 除数字 字母 文字以外的所有字符)    

1

2

3

4

5

6

7

8

9

10

//判断是否含有非法字符 yes 有  no没有

+ (BOOL)JudgeTheillegalCharacter:(NSString *)content{

    //提示 标签不能输入特殊字符

    NSString *str =@“^[A-Za-z0-9\\u4e00-\u9fa5]+$”;

    NSPredicate* emailTest = [NSPredicate predicateWithFormat:@“SELF MATCHES %@”, str];

    if (![emailTest evaluateWithObject:content]) {

        return YES;

    }

    return NO;

}

ios 音视频处理优化总结

做了那么多年C底层,现在做iOS上层,感觉还是有很多优势的。做底层的时候就做过音视频的东西,上层有很多类似,相通的东西。

公司做了个视频软件,实时监控。程序丢包严重,卡顿,还会黑屏。我接手之前就是这个样子。经过一天的摸索,结合之前看了一天的经验,把丢包问题,黑屏问题跟卡顿问题通通解决了。

由于代码不是我写的,我想了个很初级的办法,在所有音视频关键函数打上断点(对xcode来说很方便,体力活),在半个小时内,把视频播放的流程走了一遍。

把音视频路线纪录了下来,把重复进入的无关紧要的函数进行严查,严查程序里用到的所有定时器,特别是耗时的定时器,间隔时间又特别短,发现很多不合理的地方。这些定时器都跟UI没有直接关系,却都跑在主线程,非常占用主线程CPU资源。导致卡顿。分别做了线程runloop处理。

然后是发现一个奇葩的做法,就是用定时器刷新缓冲区,这个是数据接收的缓冲区。间隔时间还特别短。在网络传输高分辨率的图片时,必然造成来不及读取缓冲区,就发现图片已经丢失的情况,造成反复丢帧。我毫不犹豫就把定时器干掉了。至于缓冲区是否会越界,溢出的问题,后面再看。后面发现不会,每次接收都是覆盖缓冲区的。还需要时间检验跟调试工具进一步内存跟踪调试。

再一个发现在跳帧处理的时候,时间逻辑有问题,没有实时更新缓存时间。然后就是frame还在进行插入操作的时候就把frame提前释放的问题。

还有就是OPENGL 转换出RGB数据的时候,数据格式的处理,位数跟深度的处理有误,造成像素没那么高的问题。保存*帧图片的时候也有这个问题。

友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速