</pre><span style="color: rgb(51, 51, 51); font-family: Verdana; font-size: 14px; line-height: 26px;">通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉。</span><br style="color: rgb(51, 51, 51); font-family: Verdana; font-size: 14px; line-height: 26px;" /><span style="color: rgb(51, 51, 51); font-family: Verdana; font-size: 14px; line-height: 26px;">比如字符串“abacacde”过滤结果为“abcde”。</span><pre name="code" class="java"> 比如字符串“abacacde”过滤结果为“abcde”。
要求实现函数:void stringFilter(const char *pInputStr, long lInputLen, char *pOutputStr);
【输入】 pInputStr: 输入字符串
lInputLen: 输入字符串长度 【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长; 【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出
示例 输入:“deefd” 输出:“def”
输入:“afafafaf” 输出:“af”
输入:“pppppppp” 输出:“p”
main函数已经隐藏,这里保留给用户的测试入口,在这里测试你的实现函数,可以调用printf打印输出
当前你可以使用其他方法测试,只要保证最终程序能正确执行即可,该函数实现可以任意修改,但是不要改变函数原型。一定要保证编译运行不受影响。
具体代码如下:
/** *StringFiltration.java */ package interview.huawei; import java.util.HashSet; /** * @author xuhongbin * @data2014年9月18日下午7:34:39 */ public class StringFiltration { static void stringFilter(final char[] pInputStr, long lInputLen, char[] pOutputStr){ HashSet<Character> charSet = new HashSet<Character>(); int j = 0; for(int i = 0; i < lInputLen; i++){ if(charSet.
以下排版太乱,整理在此:点我
<!DOCTYPE html> <html> <head> <title></title> <script src="lib/jquery/jquery-1.10.2.min.js"></script> <script src="lib/angular/angular.min.js"></script> </head> <body ng-app> <div ng-controller="TestCtrl"> <a href data="1" ng-click="GoPage($event.target)">1</a> <a href data="2" ng-click="GoPage($event.target)">2</a> <a href data="3" ng-click="GoPage($event.target)">3</a> <a href data="4" ng-click="GoPage($event.target)">4</a> <a href data="5" ng-click="GoPage($event.target)">5</a> {{ page }} </div> <script> function TestCtrl($scope) { $scope.page = 1; $scope.getData = function () { console.log($scope.page); } $scope.GoPage = function (target) { $scope.page = target.getAttribute('data'); this.getData(); } } </script> </body> </html> 在Control中,angular.element()返回一个jquery对象,如angular.element(document).ready(function(){}); 返回指定元素的scope
一般情况下,对WIN7的远程连接只需要5步即可完成远程连接的设置:
1).查询并记录远程计算机的IP,开始——运行——输入cmd,回车,准确查看并记录ipadress
2).给计算机的账户设置一个密码
3).计算机的属性-远程-允许远程登录
4).电源选项(使计算机进入睡眠状态:更改为“从不”),很重要,进入睡眠的电脑是无法远程登录的。
5).关闭防火墙(非必须的)
如果这几步骤设置完毕之后仍然无法远程连接WIN7电脑,请按照以下步骤逐项检查设置
1、常规设置:
鼠标右键单击“计算机”图标,选择“属性”,在打开的“系统”窗口点击“远程设置”,在弹出的系统属性中的的“远程”选项窗口中选择“允许远程协助连接这台计算机”和“允许运行任意版本远程桌面的计算机连接(较不安全)”,如下图:
2、如果第1点设置完后其他电脑不能远程过来,可按以下步骤调整Win7防火墙设置:
开始——控制面板——Windows防火墙——高级设置——入站规则,然后在中间“入站规则”窗口中找到“文件和打印机共享(回显请求 - ICMPv4-In) “规则(可能会有两条),选中后在右框中点击“启用规则”即可,如下图:
3、完成第2步后,如果还是不能远程连接过来,最后还要检查一下WIN7的Remote Desktop Services服务是否已经打开,如果没打开是连不上的,设置步骤:
右击“计算机”——管理——服务和应用程序——服务,在中间“服务”窗口中找到“Remote Desktop Services”服务,启动它即可。可以选择右键——属性——勾选启用
4、检查以上三步设置都正常,如果还是连接不上,可能是windows防火墙设置出了问题,需启用入站规则中的“远程桌面(TCP-In)”规则:
开始——控制面板——Windows防火墙——高级设置——入站规则,然后在中间“入站规则”窗口中找到“远程桌面(TCP-In)“ (可能会有配置文件为“公用”、“域、专用”两条规则)规则,选中后在右框中点击“启用规则”即可。
5如果还是远程不了,就关闭防火墙。然后再试试!
开始——控制面板——Windows防火墙——打开和关闭防火墙
完成以上几步后,其他电脑应该就可以远程过来了。
链接:http://jingyan.baidu.com/article/39810a23edc48bb637fda672.html
http://www.youtube.com/watch?v=rbeTi7CQF94&list=PLiq_fDYFoqMocM7ADQCTfGAdI9CXA-kUs&index=93
http://www.youtube.com/watch?v=rrjSEkSwwOQ
今天在看矩形滤波的时候忽然脑子短路,把一些概念全弄混了,现总结一下,以便下次再混的时候可以参考确认下,自己的理解,有错的地方还请指正。
首先,在Opencv2中基本上都是用的Mat来表示图像了,C++的函数调用中基本上也都是Mat图,从根本上说,一张图像是一个由数值组成的矩阵,矩阵的每一个元素代表一个像素。对于灰度图像而言,像素有8位无符号数表示,其中0代表黑色,255代表白色。那么矩阵和图像间到底是一个什么样的关系呢。
第一:Mat图有行和列,即cv::Mat中有公有成员变量cols和rows,注意,这里的cols就是图像的宽度width,rows就是图像的高度height。这个width和height我们可以在其它Opencv的成员中得到,比如矩形Rect,而矩形Rect就是一个经常会用到的结构了,我自己接触到的就包括鼠标选择矩形区域、框住目标的矩形区域、滤波器矩形模版、目标的矩形特征、矩形内的运算等等。可以说Rect是一个非常常用的结构,也是Opencv里非常有用的一个结构,本质上矩形区域就是图像的一个子部分,或者说图像矩阵的一个子矩阵。
这里我引用《OpenCV学习笔记(四十一)——再看基础数据结构core》中关于Rect的介绍,Rect_类有些意思,成员变量x、y、width、height,分别为左上角点的坐标和矩形的宽和高。常用的成员函数有Size()返回值为一个Size,area()返回矩形的面积,contains(Point)用来判断点是否在矩形内,inside(Rect)函数判断矩形是否在该矩形内,tl()返回左上角点坐标,br()返回右下角点坐标。
第二:Mat图中的图像像素位置表示和矩阵中元素的表示。这里引用《访问Mat图像中每个像素的值》中几张图来表示Mat矩阵中存数据的关系。单通道灰度图数据存放格式:
多通道的图像中,每列并列存放通道数量的子列,如RGB三通道彩色图:
这时,大家得注意了,二维矩阵的行和列用来表示一个元素,并且一般是从0标号开始,所以实际上是有m+1列,也就是说宽度width是m+1的,行类似。还有就是Mat.at(int y, int x)来访问一个像素,这时候的y表示的行号,x表示的列号,相对应的就是x表示水平的宽,y表示的竖直的高,只不过x和y都是从0开始的标号。容易搞混的地方就在于一些矩阵的相减了,相减完后怎么表示像素位置,这个时候一般比较难把握,但是只要明白矩阵里x,y,width,height的关系,搞清楚就容易多了。
最近高一个大型网站,需要搭建一个分布式数据库环境,进过考察,决定使用阿里巴巴的amoeba ,主数据库没问题,在slave数据库select数据时候出现 ,ERROR 1044 (42000): Could not create a validated object, cause: ValidateObject failed , 这是哪门道的提示相信呀?不断的摸索对比,最后发现,是从数据库库的mysql 中的user授权密码出错了.
在index.html 中
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>jQuery ScrollPagination</title> <script type="text/javascript" src="../frame/jqueryscrollpagination/scripts/jquery.js"></script> <script type="text/javascript" src="../frame/jqueryscrollpagination/s.js"></script> <link href="../frame/jqueryscrollpagination/main.css" rel="stylesheet" media="screen" /> <meta name="author" content="Anderson Ferminiano" /> <meta name="keywords" content="jquery, plugin, anderson ferminiano, scroll, pagination, scroll pagination, html5" /> <script type="text/javascript"> $(function(){ $('#content').scrollPagination({ 'contentPage': 'index1.php', // 在这个页面中编写需要输出的内容 'contentData': {}, // these are the variables you can pass to the request, for example: children().
lazy区间修改 :
http://acm.hdu.edu.cn/showproblem.php?pid=4902 (hdu4902)
http://acm.hdu.edu.cn/showproblem.php?pid=4893 (hdu4902)
http://codeforces.com/contest/447/problem/E (Codeforces Round #FF (Div. 2) E))
http://codeforces.com/contest/121/problem/E (Codeforces Beta Round #91 (Div. 1 Only))
转载于:https://www.cnblogs.com/acvc/p/3885000.html
在做rpg类游戏的过程中,经常遇到要判断周围怪物相对自身的方位
1.判断目标在自己的前后方位可以使用下面的方法:
Vector3.Dot(transform.forward,target.position)
返回值为正时,目标在自己的前方,反之在自己的后方
2.判断目标在机子的左右方位可以使用下面的方法:
Vector3.Cross(transform.forward,target.position).y
返回值为正时,目标在自己的右方,反之在自己的左方
3.在这里顺便解说下关于空间向量的点积和叉积:
A.点积 点积的计算方式为:a·b=|a|·|b|cos<a,b>其中|a|和|b|表示向量的模,<a,b>表示两个向量的夹角。另外在点积中,<a,b>和<b,a> 夹角是不分顺序的。 所以通过点积,我们其实是可以计算两个向量的夹角的。 另外通过点积的计算我们可以简单粗略的判断当前物体是否朝向另外一个物体: 只需要计算当前物体的transform.forward向量与 otherObj.transform.position 的点积即可, 大于0则在前方,否则在后方。
B.叉积 叉积的定义:c =a x b其中a,b,c均为向量。即两个向量的叉积得到的还是向量!
性质1:c⊥a,c⊥b,即向量c垂直与向量a,b所在的平面。
性质2:模长|c|=|a||b|sin<a,b>
性质3:满足右手法则。从这点我们有axb ≠ bxa,而axb = – bxa。所以我们可以使用叉积的正负值来判断向量a,b的相对位置,即向量b是处于向量a的顺时针方向还是逆时针方向
/* * H264DeviceSource.hh * * Created on: 2014年7月19日 * Author: zjzhang */ #ifndef H264DEVICESOURCE_HH_ #define H264DEVICESOURCE_HH_ #include<DeviceSource.hh> class H264DeviceSource: public DeviceSource { public: static DeviceSource* createNew(UsageEnvironment& env,u_int8_t index=1,u_int width=352,u_int height=288,u_int fps=15,u_int kbps=100); protected: H264DeviceSource(UsageEnvironment& env,u_int8_t index,u_int width,u_int height,u_int fps,u_int kbps); virtual ~H264DeviceSource(); private: virtual void doGetNextFrame(); virtual unsigned maxFrameSize() const; int fHeight; int fWidth; void *fH264Encoder; u_int8_t * fBuffer; u_int fBufferSize; }; #endif /* H264DEVICESOURCE_HH_ */ /* * H264DeviceSource.cpp * * Created on: 2014年7月19日 * Author: zjzhang */ #include "
整体刷机过程:原装kindle系统--》网友定制的MIUI(基于安卓2.3)--》CM7(基于安卓2.3)
1、 下载豌豆荚,安装kindle的usb驱动(能连接上pad表示驱动安装完成),copy资料进sd卡,安装app;刷机精灵(Shuame,root权限成功)。
豌豆荚及刷机精灵自行从官网下载即可。
2、一定要将USB调试模式打开,一定要断开U盘模式;
3、 TWRP方法刷Recovery(命令行的模式开展)
3.1、已安装Kindle Fire驱动(豌豆荚能正常连接kindle即可);
3.2、如果是Windows XP用户已安装Microsoft.NET Framework v2.0;
3.3、下载firefirefire+TWRP刷机工具包(点击下载,感谢网友的提供),解压;
3.4、把firefirefire+TWRP刷机工具包解压后的两个文件(twrp-blaze-2.0.0RC0.img和u-boot.bin)放进KindleFire的SDCARD根目录下(可以通过豌豆荚实现copy资料进sd卡);
3.5、将Kindle Fire与电脑用USB线连接起来,选择断开SD储存模式;
3.6、打开命令行UI,可以用刷机精灵的快速入口,参见下图:
3.7、依次输入如下的指令
命令1:adb shell(该命令使得Kindle Fire进入ADB模式)
命令2:su
命令3:dd if=/sdcard/twrp-blaze-2.0.0RC0.imgof=/dev/block/mmcblk0p5(该命令是在刷recovery,即twrp-blaze-2.0.0RC0.img文件)
命令4:dd if=/sdcard/u-boot.binof=/dev/block/mmcblk0p2(该命令是在刷导引导firefirefire,即u-boot.bin文件)
命令5:ctrl+C(退出adb shell环境)
命令6:adb reboot(重启Kindle Fire)
4、 下载MIUI(下载地址)
下载完成后,将刷机包改名为update.zip复制到Kindle Fire的“/sdcard”目录中(可以通过豌豆荚copy资料进SD卡)。
5、 Recovery里的操作(建议按照如下顺序开展):
5.1、开机,显示一个黄色火焰形状三角时按电源键,进入TWRP界面(即Recovery界面);TWRP模式;
5.2、在主画面(可以点击右上角的小房子图标回到主画面)点击备份按钮,对原装的kindle进行备份;
5.3、在主画面,选择Wipe,再选择FactoryReset,恢复原厂设定;
5.4、在主画面,点Install按钮,然后选中刷机文件,如update.zip;
5.5、按“Flash”开始进行刷机,静待刷机成功提示;
5.6、在主画面,点击”Wipe”,在子画面里点击“Wipe Cache/Dalvik“清除系统缓存;
5.7、选择右边“Reboot System”按钮重启;
6、 刷完MIUI后效果可以参见网友的分享
MIUI在kindle上的运行效果
首先感谢网友的MIUI分享,由于kindle缺少物理按键(只有一个电源键),所以试用了一会MIUI,感觉有些不适应,于是决定刷一下CM7看看效果。
7、 刷CM7系统步奏
7.1、下载CM7的Rom包(下载地址,感谢网友的分享),修改名字为update.zip,copy进sd卡;
7.2、按照第五章节介绍的步奏在进行一次即可,注意5.2步(备份)可以不做,因为已经对原装的kindle做了备份;
7.3、CM7运行效果如下:
附件:感谢网友的分享,附赠几个用过的网址:
刷机MIUI
刷机常用知识
刷机CM7
Http访问有两种方式,GET和POST,就编程来说GET方式相对简单点,它不用向服务器提交数据,在这个例程中我使用POST方式,提交数据value1与value2,并从服务器得到他们的和(value1 + value2)。
为实现Http访问,微软提供了二套API:WinINet, WinHTTP。WinHTTP比WinINet更加安全和健壮,可以这么认为WinHTTP是WinINet的升级版本。这两套API包含了很多相似的函数与宏定义,呵呵,详细对比请查阅msdn中的文章“Porting WinINet Applications to WinHTTP”,在线MSDN连接:http://msdn2.microsoft.com/en-us/library/aa384068.aspx。在这个例程中,通过一个宏的设置来决定是使用WinHttp还是WinINet。代码如下:
#define USE_WINHTTP //Comment this line to user wininet.
下面来说说实现Http访问的流程(两套API都一样的流程):
1, 首先我们打开一个Session获得一个HINTERNET session句柄;
2, 然后我们使用这个session句柄与服务器连接得到一个HINTERNET connect句柄;
3, 然后我们使用这个connect句柄来打开Http 请求得到一个HINTERNET request句柄;
4, 这时我们就可以使用这个request句柄来发送数据与读取从服务器返回的数据;
5, 最后依次关闭request,connect,session句柄。
在这个例程中以上各个流程都进行了简单封装,以便对比两套API函数的些许差异。下面让源代码说话,原工程是一个windows控制台工程,你可以很容易通过拷贝代码重建工程。
另:如果你从服务器得到的返回数据是utf8格式的文本数据,你将需要对返回的数据进行转换才能正确显示中文,日文等。仅供参考,转换为ATL CStringW的函数见下:
CStringW GetStringWFromUtf8( const std::string & str)
{
int len = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), int(str.length()), 0, 0);
CStringW buf;
WCHAR* dd = buf.GetBuffer(len);
len = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), int(str.length()), dd, len);
buf.ReleaseBuffer(len);
return buf;
} 完整代码如下: 1 // HttpPost.
<td οnclick="do_support('<%=vid%>','<%=name%>')">
如果你不关心其内部实现,只看如何使用的话,直接看这篇即可。
接上篇,接下来,就用最最简单的例子来说明一下:
用两个布局文件main 和 test:
其中,main.xml文件为:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:layout_width="match_parent" android:layout_height="50dp" android:gravity="center" android:text="hello world" /> </LinearLayout> test.xml文件为: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="200dp" android:background="#ffffff00" android:orientation="vertical" > <TextView android:layout_width="match_parent" android:layout_height="50dp" android:gravity="center" android:text="test" /> </LinearLayout> 在test中设置了其高度为200dp,并且设置了背景颜色。 接下来看一下LayoutInflater().inflate方法实现:
第一种方式:inflate(view, null)
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); View view = (LinearLayout) getLayoutInflater().inflate(R.layout.main, null); view = getLayoutInflater().inflate(R.layout.test, null); setContentView(view); } 运行的效果如下:
这个就很容易理解了,因为我没有指定ViewGroup root参数,所以,相当于直接加载了test视图文件,并返回。
而它的高度充满了全屏而不是200dp,因为执行inflate的时候,没有root参数,则无法为test视图设定layoutparam参数。那么为什么会充满屏幕而不是没有显示呢?是因为我们将其设置视图到activity时,会取得当前window的layoutparam赋值给它,也就是充满全屏。有兴趣的话,你可以改一下test的layout_width设定一个数值,最后运行效果是一样的。
第二种方式:inflate(view, root, false)
watch [-dhvt] [-n <seconds>] [--differences[=cumulative]] [--help] [--interval=<seconds>] [--no-title] [--version] <command>
-d 高亮显示变化的字符。
-h 显示帮助
-v 显示版本
-t 显示标题
-n <seconds> 定时的时间间隔,默认是2秒。
--differences 和 -d 一样
--differences=cumulative 粘滞高亮显示变化的字符。
--help 和 -h 一样
--interval=<seconds> 和 -n <seconds> 一样
另外请注意,如果你的原始命令中包含管道,比如。
ps -ef|grep test|grep -v grep # 查看包含test的进程信息。
使用 watch的时候,需要加上 单引号
watch 'ps -ef|grep test|grep -v grep'
LayoutInflater的inflate方法,在fragment的onCreateView方法中经常用到:
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { LayoutInflater的inflate方法一共有四种,但我们日常用经常用到的就只有这两种: public View inflate(int resource, ViewGroup root) { return inflate(resource, root, root != null); } public View inflate(int resource, ViewGroup root, boolean attachToRoot) { if (DEBUG) System.out.println("INFLATING from resource: " + resource); XmlResourceParser parser = getContext().getResources().getLayout(resource); try { return inflate(parser, root, attachToRoot); } finally { parser.close(); } } 所以,这里直接介绍里面调用这个方法即可:
public View inflate(XmlPullParser parser, ViewGroup root, boolean attachToRoot) 在这个方法里面,上半部分为xml解析的代码,这里就不贴出来,确实没什么东西可看。直接看中间部分的代码: ViewGroup.LayoutParams params = null; if (root !
获取手机当前运行在前台的应用程序如下:
第一步,获取当前应用的包名,相信大家应该都知道的,直接上代码:
// 获得当前应用名 String packageName = this.getPackageName(); 是的,一句代码就搞定了。
接下来才是重点,如何获得手机正在运行的应用程序呢?
获得之后,怎么判断哪个是在前台运行的呢?
首先,我们要获得一个应用程序的管理器:
<pre class="java" name="code"> /** 获得应用程序管理器 */ private ActivityManager getManager(Context context) { ActivityManager activityManager = (ActivityManager) context .getSystemService(android.content.Context.ACTIVITY_SERVICE); return activityManager; } 有了这个管理器之后,我们就可以获得手机正在运行的应用程序了。
activityManager有四个关于运行程序的API:
getRunningAppProcesses(); getRunningServices(maxNum); getRunningTasks(maxNum); getRunningServiceControlPanel(service); 具体什么意思我没有查,我用的是第三个,也就是 getRunningTasks(maxNum);
参数maxNum 就是要获得的应用程序个数,
上代码,注释很详细,不多解释:
/** 获得前台运行的应用名 */ private String getRunningName(ActivityManager manager) { // 获得正在运行的应用集合 30是个数 一般三十个足够了 List<RunningTaskInfo> runningTaskInfos = manager.getRunningTasks(30); // 判断集合不为空且 size>0 if (runningTaskInfos != null && runningTaskInfos.size() > 0) { // 集合中的第一个正是前台运行的应用程序 RunningTaskInfo info = runningTaskInfos.
执行下面这个
ALTER DATABASE DBName SET NEW_BROKER WITH ROLLBACK IMMEDIATE; ALTER DATABASE DBName SET ENABLE_BROKER;
前言: 有一段时间没写博客了, "持之以恒"徽章都暗了, 实在不该。 前一段确实比较忙, ...小小地给自己的懒找个借口吧。 大二即将结束, 学习iOS也有一段时间了。今天抽点时间, 开源一个前几天刚上传的App里面的一个功能, RT, 美女图片采集器。 美女.. 相信没有人不喜欢吧, 基于此, 这个小Demo应运而生。
注: 本文正在参加博客大赛。 如果觉得对你有所帮助, 还望帮忙投下票。 多谢。 投票链接: http://vote.blog.csdn.net/Article/Details?articleid=37825177 (投票按钮在最下方)
效果演示: 看到这里, 如果还有兴趣学习的话, 可以先到我的git中下载源码, 然后配合着源码看我下面的解析。相信, 会让你有所收获的。
git下载链接: BeautyPickDemo.git
涉及内容: 百度图片API的使用JSON格式数据解析图片异步下载 + 离线缓存图片基本操作(缩放, 删除, 添加, 保存到本地)下拉刷新, 上提加载幻灯片放映自定义后台显示图片 源码解析: 一。百度图片API的使用 首先, 我们知道百度是没有对外开放图片API的, 但是我们可以通过谷歌浏览器来捕捉到访问过程中它调用的API。有兴趣的, 可以了解下谷歌浏览器Network选项的使用, 也可以参考下这篇文章: 百度图片api 这里, 我们主要介绍如何使用即可。 1.百度图片通用API: http://image.baidu.com/i?tn=resultjsonavstar&ie=utf-8&word=刘德华&pn=0&rn=60 说明: 返回格式为json word为查询的内容 pn为第几页 rn为一页返回的图片数量 用法:大家在浏览器地址栏输入上述地址,回车即可看到返回的图片地址 2.百度图片分类API (我们使用的就是这个) http://image.baidu.com/channel/listjson?pn=0&rn=30&tag1=美女&tag2=全部&ie=utf8 http://image.baidu.com/channel/listjson?pn=0&rn=30&tag1=美女&tag2=全部&ftags=校花&ie=utf8 至于其他的, 依照这个方法都能获取到. 就不重复说明了。 至于如何调用API, 涉及到网络编程。 开源的ASI类库做的比较好(虽然挺老的一个东西了, 也有一段时间没更新了, 但是能满足我们需求)。 从源码中, 可以找到 网络请求ASI文件夹,里面有需要的文件 1。导入这里的文件 2。导入必须的框架, 包括: SystemConfiguration.