日期: 2021 年 4 月 16 日

公有云和私有云之间,我们该如何选择?

云计算就如当初的“不用马拉的马车”,当安全和隐私、技术的成熟度、数据主权、法规遵从等问题让人们欲步又止的时候,我们是不是应该以更长远的眼光判断,这一系列现存的问题都是新事物发展中经历的正常阶段,都将在未来的技术和法规发展完善中一一获得解决,云计算是科技领域一个不可扭转的发展趋势!

云计算分为公有云和私有云,更本质的区别在于是由多家不同企业或机构共享还是由一家企业机构独享计算资源。

公有云和私有云之间,我们该如何选择?

从目前众多信息官所担心的问题来看,私有云通过专用硬件,更容易进入企业防火墙,有可能缓解安全性和隐私问题,而且内部私有云能够更轻松地应对因服务产生的、跨辖区的法规遵从和数据主权问题。当这些问题为IT领导者的决策带来沉重负担时,投资私有云可能更佳。但是从成本权衡的角度来看,公有云更有实现多元化优势的能力,更容易从规模经济效益的角度获得更低的成本支出。微软“云经济白皮书”中也有统计表明,对于拥有约1000台服务器的大型代理机构来说,私有云虽然可行,但是由于整合的规模、需求多样化和多租户效应,其巨大的成本溢价大约是同样服务规模的公有云成本的10倍!

因此,结合用户规模、成本权衡、资源利用时段等因素考虑,海比研究(Hapi Research)认为,中小型企业、时段变数大的企业(如电子商务网站,消费者服务往往是在晚上达到峰值)、不确定增长速度的企业等类似企业都更适宜于选择公有云;而大型传统企业如政府、金融机构、能源等在数据安全和隐私、数据主权等问题上更为重视,并且成本权衡不是主要考虑因素的企业单位会更倾向于私有云的选择。

云计算技术提供商市场上,如微软等IT巨头们都在为用户打造高可用性云计算平台、丰富的云计算应用而持续不断的努力。微软大中华区首席云计算战略官谢恩伟也认为,采用云的障碍将逐渐减少,公有云的经济效益将会随着时间推移而增加,长远来看,公有云将会获得长足的更大程度的普及。

geopandas库的基础学习

geopandas库的基础学习

DataWhale组队学习打卡*阶段内容
本学习笔记为Datawhale开源学习训练营21年4月数据挖掘学习的学习内容,学习链接为:团队学习数据挖掘/智慧海洋
所在学习小组:梅利号

geopandas库的学习记录:
pandas是个用于数据整理和分析的常用第三方库。而geopandas是在pandas的基础上建立的,用法与之类似,主要用于处理地理空间中的数据。
geopandas的数据类型:
GeoSeries 、 GeoDataFrame;用于地理空间数据存储器和shapefile文件

准备工作

import pandas as pd
import geopandas as gpd
import matplotlib.pyplot as plt
%matplotlib inline

初体验
通过matplotlib画出geopandas包里数据集的世界地图文件

world = geopandas.read_file(geopandas.datasets.get_path(‘naturalearth_lowres’))
world.plot()
plt.show()

%title插图%num

数据读取
读取shapefile文件
直接读取shapefile文件
data=gpd.read_file(‘xxxxxxx.shp’)

直接读取文件夹
当文件夹下面只有一个shapefile文件时,可以直接读取这个文件夹(效果同读取该文件夹下shapefile文件一样)
读取zip压缩包中的文件
支持读取zip格式压缩包中的shapefile文件
shp文件在压缩包根目录时
#读取数据规则 zip://路径/xxxxxx.zip
data=gpd.read_file(‘zip://路径/xxxxxxxx.zip’)

原理同直接读取文件夹类似,可参考理解

shp文件在压缩包内部文件夹里时
#读取数据规则 zip://路径/xxx.zip!压缩包内指定文件路径
data=gpd.read_file(‘zip://路径/xxxxxxxx.zip!压缩包内文件路径/xxxxxxxxx.shp’)

读取gdb和gpkg
gdb
data=gpd.read_file(‘xxxxx.gdb’,layer=’xxxxx’) #layer参数为对应图层名称

gpkg
data=gpd.read_file(‘xxxxx.gpkg’,layer=’xxxxx’,encoding=’utf-8′) #layer参数为对应图层名称

读取GeoJSON
读取在线地图框架常用的数据源格式GeoJSON

data=gpd.read_file(‘xxxxxxx.json’)

常用CRS:
WGS84纬度-经度投影:
“+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs” ;也可以用proj4字符串调用”+init=epsg:4326″
UTM区域(北):
“+ proj = utm + zone = 33 + ellps = WGS84 + datum = WGS84 + units = m + no_defs”
UTM Zones(南):
“+ proj = utm + zone = 33 + ellps = WGS84 + datum = WGS84 + units = m + no_defs + south”
合并图层时,要确保地图s的共享公用CRS(方便对齐)

将nginx作为视频点播服务器

流媒体服务器
流媒体指以流方式在网络中传送音频、视频和多媒体文件的媒体形式。相对于下载后观看的网络播放形式而言,流媒体的典型特征是把连续的音频和视频信息压缩后放到网络服务器上,用户边下载边观看,而不必等待整个文件下载完毕。由于流媒体技术的优越性,该技术广泛应用于视频点播、视频会议、远程教育、远程医疗和在线直播系统中。作为新一代互联网应用的标志,流媒体技术在近几年得到了飞速的发展。

流媒体播放方式
HTTP方式
这种方式要下载FLV视频文件到本地播放,一旦FLV视频文件下载完成,就不会消耗服务器的资源和带宽,但是拖动功能没有RTMP/RTMP流媒体方式强大,很多视频网站都是用HTTP方式实现的,如:YouTube,土豆,酷6等

RTMP/RTMP流媒体方式
这种方式不用下载FLV视频文件到本地,可以实时的播放flv文件,可以任意拖拽播放进度条,但是比较消耗服务器的资源。

安装
nginx 1.1.3之后已经默认支持mp4,flv模块,无须第三方模块支持。我这里使用的是docker容器:

docker run -d –name nginx -p 80:80 -v ~/opt/local/nginx/logs:/var/log/nginx -v ~/opt/local/nginx:/etc/nginx nginx
1
将容器内的nginx配置目录(即/etc/nginx)挂载到了本机目录方便我们对配置文件进行修改。

配置文件
在~/opt/local/nginx/conf.d下新建一个mp4.conf,加入如下配置

1 server {
2 listen 80 ;
3 server_name localhost;
4 root /etc/nginx/mp4;
5 limit_rate 256k;
6
7 location ~ \.flv$ {
8 flv;
9 }
10
11 location /video/ {
12 rewrite ^/video/(.*)$ /jwplayer-7.10.4/$1 last;
13 }
14
15 location ~ \.mp4$ {
16 mp4;
17 # mp4_buffer_size 1m;
18 # mp4_max_buffer_size 5m;
19 limit_rate_after 5m;
20 limit_rate 100k;
21 # limit_conn perip 1;
22 }
23 }

关于nginx的基本配置不再赘述,(可以参考我的博客nginx进阶-配置文件)将由flv与mp4结尾的uri交给对应的模块。随便找一个mp4或flv格式的视频放在root目录下(配置虚拟容器中的路径/etc/nginx/mp4,映射到真实机器的路径时~/opt/local/nginx/mp4)现在我们搭配jwplayer进行视频的点播。

下载jwplayer,我这里使用的7.10.4的免费版本,解压后得到如下目录
%title插图%num

这里注意两个文件,一个是jwplayer.flash.swf,还有一个就是jwplayer.js文件。官方已经贴心的为我们准备好了demo,打卡demo.html进行一些修改:

<script type=”text/javascript” src=”jwplayer.js”></script>
<script>jwplayer.key=”4sNBpozdkb2Gv+IYeWyd+CID9tW2NXdJE5GeSg==”;//修改为自己的key</script>
<div id=”player”>
Loading…
</div>
<script type=”text/javascript”>
jwplayer(“player”).setup({
“flashplayer”: “http://localhost/jwplayer.flash.swf”, //player.swf文件的uri
“file”: “http://localhost/1.mp4”,//视频文件的服务器uri
“aspectratio”: “16:9”,//播放器自适应比例
“height”: “360”,//播放器高度
“type”:”mp4″,//播放文件类型(可选)
“title”: “测试标题”,//标题(可选)
“description”: “测试视频描述”,//描述(可选)
“image”: “http://ww4.sinaimg.cn/large/b6839357jw1e3val80tknj20dw099jsb.jpg”,//视频封面(可选)
“repeat”:”true”,//重复播放(留空则不重复播放)
“autostart”:”true”,//自动播放(留空则不启用自动播放)
});
</script>

重点关注javascript标签中的内容,请配合注释一起食用。

效果
访问我们的nginx http://localhost/video/demo.html

%title插图%num

这样一个简单的视频点播服务器就完成了,其它的需求自行扩展即可。接下来有空会研究一下RTMP流媒体服务器的搭建(懒,逃~~)

ios-deploy时,终端构建失败

安装ios-deploy时,终端构建失败:
ios-deploy是一个从mac电脑把app打包到手机的工具
安装:sudo npm install -g ios-deploy –unsafe-perm=true

安装出现问题:
** BUILD FAILED **
The following build commands failed:
CompileC /usr/local/lib/node_modules/ios-deploy/build/ios-deploy.build/Release/ios-deploy-lib.build/Objects-normal/x86_64/libios_deploy.o /usr/local/lib/node_modules/ios-deploy/src/ios-deploy-lib/libios_deploy.m normal x86_64 objective-c com.apple.compilers.llvm.clang.1_0.compiler
(1 failure)
npm ERR! code ELIFECYCLE
npm ERR! errno 65
npm ERR! ios-deploy@1.11.0 preinstall: ./src/scripts/check_reqs.js && xcodebuild`
npm ERR! Exit status 65
npm ERR!
npm ERR! Failed at the ios-deploy@1.11.0 preinstall script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

解决方式:
需要把macOS,ios,xcode版本号升级为一致,因为用命令安装的时候默认安装*新的ios-deploy,而电脑的配置不相符:

升级之后执行
终端运行:sudo xcode-select –switch /Applications/Xcode.app/Contents/Developer
在执行:sudo npm install -g ios-deploy –unsafe-perm=true
open /Applications/Xcode.app/Contents/Developer

安装成功

云计算的定义、云计算系统的架构组成、云计算的应用和云计算的问题

1 云计算的定义
云计算是在通信和互联网的发展比计算机的发展速度更快的大背景下的必然产物[1]。假如你是一家大公司的经理,你的职责是为你所有的员工提供工作中必需的计算机硬件和软件,光提供计算机硬件是不够的,还需要购买相关的系统软件和应用软件以及相关软件的许可证。
随着公司的壮大员工不断增加,你必须为他们提供足够的工作所需的一切应用软件,为他们提供一些专业软件的许可证。如果只需要加载一个应用程序,该应用程序将允许员工登录到一个基于Web服务的主机上,远程主机上拥有这家公司所需的包括电子邮件、文字处理和复杂的数据分析程序等应用程序,不需要再为每个员工单个安装相关的程序了,这就是所谓的云计算。公司员工只需要关注自己的核心业务,不需要成为一个“业余的计算机工程师”。本地计算机对硬件和软件的需求降低,只要能够满足云计算系统的接口软件运行即可。
2 云计算系统的架构组成
云计算系统总体分为两部分:前端和后端。这两部分彼此通过网络连接,这个网络就是互联网。前端就是计算机用户或者客户,后端系统就是所说的“云端”服务器。
前端是客户通过自己计算机网络访问云计算系统上自己所需的应用程序,根据客户的需求云计算系统为其提供相应的用户界面。例如基于Web的电子邮件系统,主要利用现有的Web浏览器如Internet Explorer或Foxmail等来访问“云端”服务器上邮件系统。其他独特的应用都可以通过特定客户端应用程序从“云端”服务器上获得专业级的服务。
后端是基于互联网的各种计算机服务器系统和数据云存储系统,为客户提供“云端”的各种服务。理论上一个云计算系统可以包括几乎所有的计算机程序,从数据处理到视频游戏等,每个应用程序都有自己的专用服务器,都有专业的团队对其进行相关的维护和管理。
所有“云端”服务器服从中央服务器管理,中央服务器根据客户和网络的通畅情况确定客户使用哪个“云端”服务器的服务,确保客户使用的顺利,它遵循一套规则即协议,采用一种特殊的软件称为中间件。中间件根据许可允许联网计算机互相沟通,通过专业软件,在一个物理服务器上运行多个虚拟服务器,每个虚拟服务器运行其自己独立的操作系统,是一套在云计算环境中的开放式基础架构虚拟化平台,服务器的虚拟化减少了更多的物理机器的需要。
如果一个云计算的公司有很多客户,可能就会需要大量的存储空间,客户把大量的数据存储在“云端”服务器上,云计算系统所需的存储设备至少是两倍的存储容量,需要把客户的存储的数据保留至少两份或更多。这样就可以防止一旦某个存储服务器瘫痪,别的服务器还可以继续提供服务,对客户没有任何影响。
3 云计算的应用
云计算的应用是很广泛的,通过正确的中间件,云计算系统可以在客户端执行所有的应用程序。从一般的字处理软件到一些专业级软件的应用,还可以为特定的公司定制在云计算系统运行的应用计算机程序。
云计算系统可以说无处不在,客户可以在任何时间任何地点访问他们的应用程序和数据,可以使用任何连接互联网的计算机访问云计算系统。数据不会被限制在一个硬盘上、某个用户的计算机上或一个公司的内部网中。
云计算系统的应用带来硬件成本的下降,减少在客户端先进的硬件需求。在客户端不需要*快的计算机设备,云计算系统为你提供更先进的计算机设备。你可以买价格比较合理、处理能力够用的计算机终端连接到“云端”服务器的中间件,不需要足够大的硬盘,因为你的数据存储到远程计算机的云存储上。
一个公司或某一个客户可以同拥有向云计算系统的公司购买他们所需要的应用软件的服务,本公司不要购买相关软件或为每一个员工购买软件许可证,只需要根据本公司的应用要求向云计算服务公司支付计量收费来使用云计算系统即可。
云计算系统的后端如果是网格计算机系统,那么客户端用户可以利用整个网络的处理能力。通常情况下,科学家或研究人员工作和计算都跟复杂,通过他们的个人电脑需要几年的时间才能完成他们的计算任务。在网格计算系统中,客户可以通过客户端把需要的计算任务通过云计算来处理,云计算系统利用本网络内的所有可用的闲置计算机的处理能力来参与计算,这样就大大提高了计算速度。
4 云计算存在的问题
云计算*大的问题是云计算系统安全和隐私的保护。
如果一个公司把本公司的与业务相关的一些核心数据存放到不是本公司的设备上,而是存放到公共网络的某个地方,的确让公司高管们担心。它们在使用云计算系统前会仔细考虑这些关乎公司命运的核心数据存放的安全性。因此,提供云计算服务的公司必须具有良好的声誉,具有可靠地安全措施,具有严格的管理规章制度,具有法律的约束力,拥有专业级的管理团队和*先进的技术来维护客户的所有信息数据[8]。
隐私的安全性也是客户考量使用云计算系统的关键因素。一个客户可以从任何地点任何时间登录云计算系统访问数据和使用应用程序,他可能就会影响客户的隐私安全问题。云计算公司就需要提供保护客户隐私的安全措施,一种方法使用认证技术,每个用户提供独立的用户名和密码,而且具有严格的用户名和密码申请程序以及用户名密码找回的安全评估;另一种采用授权格式,每个用户只能访问和他或她工作关的数据和相关应用。
云计算的发展前景广阔,它应用广泛为人们的学习生活以及工作带来了快捷和便利,同时云计算还存在着技术、管理与法律风险,需要进一步加强技术优势、加强法律对云计算的约束力,让人们越来越放心的使用云计算系统。

appium+iOS元素的定位方式

查找元素的顺序,从快到慢:
查找元素的顺序,从快到慢:
ios_predicate >> accessibility_id >> class_name >>xpath
(论坛比较多的说法是class_name>>accessibility_id,在这里我们姑且认为它们的速度是一样的。)
1,ios_predicate:OS 的 UI 自动化中,使用原生支持的Predicate定位方式是*好,可支持元素的单个属性和多个属性定位,强烈推荐使用
driver.find_element_by_ios_predicate(“value == ‘ClearEmail’”)
driver.find_element_by_ios_predicate(“type == ‘’ AND value == ‘’)
https://www.jianshu.com/p/a6c2d72fe704
2,accessibility_id
替代以前的name定位方式,在 iOS 上,主要使用元素的label或name(两个属性的值都一样)属性进行定位,如该属性为空,也是不能使用该属性。
driver.find_element_by_accessibility_id(‘ClearEmail’)
3、class_name
使用元素的type属性定位,特别注意该属性的唯一性!class_name唯一的情况并不多,一般情况下用不上。
driver.find_element_by_class_name(‘XCUIElementTypeButton’)
4、xpath
由于 iOS 10开始使用的 XCUITest 框架原生不支持,定位速度很慢,所以官方现在不推荐大家使用,也有其他替代的定位方式可使用。
1)使用*对路径定位:
driver.find_element_by_xpath(’/XCUIElementTypeApplication/XCUIElementTypeButton’)
2)使用相对路径定位
driver.find_element_by_xpath(’//XCUIElementTypeButton’)
3)通过元素的索引定位
driver.find_element_by_xpath(’//XCUIElementTypeButton[index]’)
4.通过元素的属性定位
一种属性:
driver.find_element_by_xpath(”//className[@value=‘ClearEmail’]”)
两种属性:
driver.find_element_by_xpath(“//className[@value=‘ClearEmail’][@ visible =true]”)
部分属性(*强大):driver.find_element_by_xpath(“//className[contains(@value,‘ClearEmail’)]”)
5,iOSNsPredicateString
仅支持 iOS 10或以上,可支持元素的单个属性和多个属性定位,推荐使用。
一种属性:MobileBy.iOSNsPredicateString(“type == ‘XCUIElementTypeButton’”)
两种属性:MobileBy.iOSNsPredicateString(“type == ‘XCUIElementTypeButton’ AND label == ‘更多信息’”)

被大众普遍接受的云计算,有哪些特点?

云计算的特点

云计算是通过使计算分布在大量的分布式计算机上,而非本地计算机或远程服务器中,企业数据中心的运行将与互联网更相似。这使得企业能够将资源切换到需要的应用上,根据需求访问计算机和存储系统。

好比是从古老的单台发电机模式转向了电厂集中供电的模式。它意味着计算能力也可以作为一种商品进行流通,就像煤气、水电一样,取用方便,费用低廉。*大的不同在于,它是通过互联网进行传输的。

被普遍接受的云计算特点如下:

1.超大规模

“云”具有相当的规模,Google云计算已经拥有100多万台服务器, Amazon、IBM、微软、Yahoo等的“云”均拥有几十万台服务器。企业私有云一般拥有数百上千台服务器。“云”能赋予用户前所未有的计算能力。

2.虚拟化

云计算支持用户在任意位置、使用各种终端获取应用服务。所请求的资源来自“云”,而不是固定的有形的实体。应用在“云”中某处运行,但实际上用户无需了解、也不用担心应用运行的具体位置。只需要一台笔记本电脑或者一部手机,就可以通过网络服务来实现我们需要的一切,甚至包括超级计算这样的任务。

3.高可靠性

“云”使用了数据多副本容错、计算节点同构可互换等措施来保障服务的高可靠性,使用云计算比使用本地计算机可靠。

4.通用性

云计算不针对特定的应用,在“云”的支撑下可以构造出千变万化的应用,同一个“云”可以同时支撑不同的应用运行。

5.高可扩展性

“云”的规模可以动态伸缩,满足应用和用户规模增长的需要。

6.按需服务

“云”是一个庞大的资源池,你可按需购买;云可以像自来水、电、煤气那样计费。

7.*其廉价

由于“云”的特殊容错措施可以采用*其廉价的节点来构成云,“云”的自动化集中式管理使大量企业无需负担日益高昂的数据中心管理成本,“云”的通用性使资源的利用率较之传统系统大幅提升,因此用户可以充分享受“云”的低成本优势,经常只要花费几百美元、几天时间就能完成以前需要数万美元、数月时间才能完成的任务。

8.潜在危险性

云计算服务除了提供计算服务外,还必然提供了存储服务。但是云计算服务当前垄断在私人机构(企业)手中,而他们仅仅能够提供商业信用。对于政府机构、商业机构(特别像银行这样持有敏感数据的商业机构)对于选择云计算服务应保持足够的警惕。
一旦商业用户大规模使用私人机构提供的云计算服务,无论其技术优势有多强,都不可避免地让这些私人机构以“数据(信息)”的重要性挟制整个社会。对于信息社会而言,“信息”是至关重要的。另一方面,云计算中的数据对于数据所有者以外的其他用户云计算用户是保密的,但是对于提供云计算的商业机构而言确实毫无秘密可言。所有这些潜在的危险,是商业机构和政府机构选择云计算服务、特别是国外机构提供的云计算服务时,不得不考虑的一个重要的前提。

IOS学习之——CoreLocation定位的使用

1 在移动互联网时代,移动app能解决用户的很多生活琐事,比如
2 导航:去任意陌生的地方
3 周边:找餐馆、找酒店、找银行、找电影院
4
5 在上述应用中,都用到了地图和定位功能,在iOS开发中,要想加入这2大功能,必须基于2个框架进行开发
6 Map Kit :用于地图展示
7 Core Location :用于地理定位
8
9 2个热门专业术语
10 LBS :Location Based Service
11 SoLoMo :Social Local Mobile(索罗门)
12
13 CoreLocation框架使用前提
14 导入框架
15
16 导入主头文件
17 #import <CoreLocation/CoreLocation.h>
18
19 CoreLocation框架使用须知
20 CoreLocation框架中所有数据类型的前缀都是CL
21 CoreLocation中使用CLLocationManager对象来做用户定位
22
23 CLLocationManager
24
25 CLLocationManager的常用操作
26 开始用户定位
27 – (void)startUpdatingLocation;
28
29 停止用户定位
30 – (void) stopUpdatingLocation;
31
32 当调用了startUpdatingLocation方法后,就开始不断地定位用户的位置,中途会频繁地调用代理的下面方法
33 – (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations;
34 locations参数里面装着CLLocation对象
35
36
37 CLLocation
38
39 CLLocation用来表示某个位置的地理信息,比如经纬度、海拔等等
40 @property(readonly, nonatomic) CLLocationCoordinate2D coordinate;
41 经纬度
42
43 @property(readonly, nonatomic) CLLocationDistance altitude;
44 海拔
45
46 @property(readonly, nonatomic) CLLocationDirection course;
47 路线,航向(取值范围是0.0° ~ 359.9°,0.0°代表真北方向)
48
49 @property(readonly, nonatomic) CLLocationSpeed speed;
50 行走速度(单位是m/s)
51
52 用- (CLLocationDistance)distanceFromLocation:(const CLLocation *)location方法可以计算2个位置之间的距离
53
54
55 CLLocationManager
56
57 @property(assign, nonatomic) CLLocationDistance distanceFilter;
58 每隔多少米定位一次
59
60 @property(assign, nonatomic) CLLocationAccuracy desiredAccuracy;
61 定位精确度(越精确就越耗电)
62
63 CLLocationCoordinate2D
64
65 CLLocationCoordinate2D是一个用来表示经纬度的结构体,定义如下
66 typedef struct {
67         CLLocationDegrees latitude; // 纬度
68         CLLocationDegrees longitude; // 经度
69 } CLLocationCoordinate2D;
70
71 一般用CLLocationCoordinate2DMake函数来创建CLLocationCoordinate2D
72
73
74 用户隐私的保护
75
76 从iOS 6开始,苹果在保护用户隐私方面做了很大的加强,以下操作都必须经过用户批准授权
77 要想获得用户的位置
78 想访问用户的通讯录、日历、相机、相册等等
79
80 当想访问用户的隐私信息时,系统会自动弹出一个对话框让用户授权
81
82 从iOS 8开始,用户定位分两种情况
83 总是使用用户位置:NSLocationAlwaysUsageDescription
84 使用应用时定位:NSLocationWhenInUseDescription
85
86 当想访问用户的隐私信息时,系统会自动弹出一个对话框让用户授权
87
88
89 CLGeocoder
90
91 使用CLGeocoder可以完成“地理编码”和“反地理编码”
92 地理编码:根据给定的地名,获得具体的位置信息(比如经纬度、地址的全称等)
93 反地理编码:根据给定的经纬度,获得具体的位置信息
94
95 地理编码方法
96 – (void)geocodeAddressString:(NSString *)addressString completionHandler:(CLGeocodeCompletionHandler)completionHandler;
97
98 反地理编码方法
99 – (void)reverseGeocodeLocation:(CLLocation *)location completionHandler:(CLGeocodeCompletionHandler)completionHandler;
100
101
102 CLGeocodeCompletionHandler
103
104 当地理\反地理编码完成时,就会调用CLGeocodeCompletionHandler
105 typedef void (^CLGeocodeCompletionHandler)(NSArray *placemarks, NSError *error);
106 这个block传递2个参数
107 error :当编码出错时(比如编码不出具体的信息)有值
108 placemarks :里面装着CLPlacemark对象
109
110 CLPlacemark
111
112 CLPlacemark的字面意思是地标,封装详细的地址位置信息
113 @property (nonatomic, readonly) CLLocation *location;
114 地理位置
115
116 @property (nonatomic, readonly) CLRegion *region;
117 区域
118
119 @property (nonatomic, readonly) NSDictionary *addressDictionary;
120 详细的地址信息
121
122 @property (nonatomic, readonly) NSString *name;
123 地址名称
124
125 @property (nonatomic, readonly) NSString *locality;
126 城市

iOS学习——自动定位

*近在项目中需要做自动定位功能,就是你在参加会议通过扫描二维码签到的时候自动定位并将你的定位信息在签到中上传,这样可以避免我们进行假签到。在这个功能中,主要用到的是系统自带的定位模块,首先我们是需要配置定位功能的参数,然后当我们定位成功时调用特定的方法进行相应操作就可以了,当然,在定位失败时我们也可以进行相应的操作,这些都有对应的一些回调方法,我们只需要重写对应的回调方法就可以实现对应的功能了。

首先,我们用到的系统自带的定位模块是: <CoreLocation/CoreLocation.h> ,定位成功/失败的方法都是通过代理 CLLocationManagerDelegate 来完成的,所以我们在需啊哟进行定位的类中也需要继承自代理,并实现对应的一些方法才能成功完成回调。在定位功能的调用中,主要分为两步:1、定位参数的配置;2、代理回调方法的实现

一 定位参数的配置

定位参数的配置主要是通过系统的定位管理器CLLocationManager进行配置,参数配置的几个要点主要是设置代理,设置寻址精度,然后开启定位。当然,这些参数的配置的前提是我们的手机已经对我们的项目进行了地理位置的授权,所以我们再配置之前需要对当前定位权限进行判断,通过 [CLLocationManager locationServicesEnabled] 方法可以直接得到定位权限是否开启,如果有对应的权限,我们就可以进行对应的配置信息,否则我们无法进行对应的配置,这时候我们可以弹出一个对话框进行提示用户如何开启定位权限,在我们的项目中因为不需要进行提示,所以没有对应的代码模块。

- (void)viewDidLoad {
    [super viewDidLoad];

    //配置定位信息
    [self configLocation];
}

- (void)configLocation{
    self.place = @"";
    //判断定位权限是否打开
    if ([CLLocationManager locationServicesEnabled]) {
        locationManager = [[CLLocationManager alloc] init];
        locationManager.delegate = self;
        //设置寻址精度
        locationManager.desiredAccuracy = kCLLocationAccuracyBest;
        locationManager.distanceFilter = 100.0f;
        //开始定位
        [locationManager startUpdatingLocation];
    } else {
        //如果定位权限没有打开,可以进行相应的提示
        //具体代码省略
    }
}

 二 代理方法的回调

在前面我们说过了,我们的类需要继承CLLocationManagerDelegate代理,并实现其中的一些方法才能在定位成功/失败时能够正确地调用对应的代理方法。主要用到的代理方法有两个,一个是成功时调用,一个是失败时调用,具体代码如下。在定位失败时,我们首先可以弹框提示定位失败的原因,接着我们可以选择重新定位,或者我们也可以选择限制连续定位失败多少次后就不再进行定位了,具体需要实现的方法大家可以根据需要进行配置和开发。

#pragma mark - CLLocationManagerDelegate
//定位成功的回调,在这里我们配置我们的位置信息
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{
    [locationManager stopUpdatingLocation];
    CLLocation *currentLoc = [locations lastObject];
    CLGeocoder *geoCoder = [[CLGeocoder alloc] init];
    //利用经纬度进行反编译获取位置信息
    [geoCoder reverseGeocodeLocation:currentLoc completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
        if (placemarks.count > 0) {
            //获取当前定位信息
            CLPlacemark *placeMark = [placemarks firstObject];
            if (placeMark) {
                self.place = [NSString stringWithFormat:@"%@%@%@%@",placeMark.administrativeArea,placeMark.locality,placeMark.subLocality,ZYIsNullOrEmpty(placeMark.thoroughfare)?@"":placeMark.thoroughfare];
            }
        }
    }];
}

//定位失败时调用
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{
    [locationManager startUpdatingLocation];
}

IOS自动化定位方式

元素属性的介绍
type:元素类型,与className作用一致,如:XCUIElementTypeStaticText
value: 一般不用
name:元素的文本内容,可用作 AccessibilityId定位方式,如:测试420班级群
label:*大多数情况下,与 name 作用一致
enabled:元素是否可点击,一般值为true或者false
visible:元素是够可见,一般值为true或者false

1.findElementByIosNsPredicate

这个定位方式需要用java-client -5.0.版本,4.x的版本没有这个定位方式

driver.findElementByIosNsPredicate(“value ==’11′”).sendKeys(“AXPC11@ett.com”);

driver.findElementByIosNsPredicate(“name == ‘login_default_icon'”).click();

driver.findElementByIosNsPredicate(“value ==’请输入登录密码'”).sendKeys(“1111”);

driver.findElementByIosNsPredicate(“name == ‘login_default_icon'”).click();

driver.findElement(By.id(“登录”)).click();

仅支持 iOS 10或以上,可支持元素的单个属性和多个属性定位,推荐使用。
一种属性:MobileBy.iOSNsPredicateString(“type == ‘XCUIElementTypeButton'”)
两种属性:MobileBy.iOSNsPredicateString(“type == ‘XCUIElementTypeButton’ AND label == ‘更多信息'”)
具体 iOSNsPredicate语法结构可查看官方文档,或查看的这个帖子:iOS 定位方式 iOSNsPredicateString 详解。

2.

Appium 的定位方式种类
我说的定位方式都是基于我自己亲测过,没使用或比较少用的就在这里不列举了,如有错误的地方,请多多包涵!常用的定位方式(仅限 Android 和 iOS 两种系统)有 className、id、xpath、AccessibilityId、AndroidUIAutomator、iOSNsPredicateString、iOSClassChain、IosUIAutomation等

className
使用元素的className属性定位,支持:Android 和 iOS,推荐使用。
MobileBy.className(“XCUIElementTypeButton”)

id
使用元素的Resource Id属性定位,支持:Android,仅支持 Android 4.3或以上,推荐使用。反正我没有在 iOS 用过,大家有正确使用过的例子,可以分享一下。
MobileBy.id(“package.name:id/android”)

xpath
支持:Android 和 iOS。但由于 iOS 10开始使用的 XCUITest 框架原声不支持,定位速度很慢,所以官方现在不推荐大家使用,也有其他替代的定位方式可使用。
1.使用*对路径定位,如截图所显示的 xpath 路径
MobileBy.xpath(“className/className/className/className”)
2.使用相对路径定位
MobileBy.xpath(“//className”)
3.通过元素的索引定位
MobileBy.xpath(“//className[index]”)
4.通过元素的属性定位
一种属性:MobileBy.xpath(“//className[@label=’更多信息’]”)
两种属性:MobileBy.xpath(“//className[@label=’更多信息’][@isVisible=’1′]”)
部分属性(*强大):MobileBy.xpath(“//className[contains(@label,’更多’)]”)

AccessibilityId
替代以前的name定位方式,推荐使用。
在 Android 上,主要使用元素的content-desc属性,如该属性为空,不能使用此定位方式。
在 iOS 上,主要使用元素的label或name(两个属性的值都一样)属性进行定位,如该属性为空,如该属性为空,也是不能使用该属性。
MobileBy.AccessibilityId(“更多信息”)

AndroidUIAutomator
仅支持 Android 4.2或以上,可支持元素的单个属性和多个属性定位,推荐使用。
一种属性:MobileBy.AndroidUIAutomator(“new UiSelector().text(\”发送\”)”)
两种属性:MobileBy.AndroidUIAutomator(“new UiSelector().text(\”发送\”).clickable(true)”)
元素的所有属性都可用做定位,功能非常强大,且速度很快。

iOSNsPredicateString
仅支持 iOS 10或以上,可支持元素的单个属性和多个属性定位,推荐使用。
一种属性:MobileBy.iOSNsPredicateString(“type == ‘XCUIElementTypeButton'”)
两种属性:MobileBy.iOSNsPredicateString(“type == ‘XCUIElementTypeButton’ AND label == ‘更多信息'”)
具体 iOSNsPredicate语法结构可查看官方文档,或查看的这个帖子:iOS 定位方式 iOSNsPredicateString 详解。

iOSClassChain
仅支持 iOS 10或以上,这是 github 的 Mykola Mokhnach 大神开发,仅限在 WebDriverAgent 框架使用,用于替代 xpath 的,但使用一阵子后,感觉灵活性没有 xpath 和 iOSNsPredicate 好,应该还不完善吧。具体使用方法,请见:https://github.com/appium/appium-xcuitest-driver/pull/391 。
MobileBy.iOSClassChain(‘XCUIElementTypeWindow[1]/XCUIElementTypeOther[1]/XCUIElementTypeOther[1]/XCUIElementTypeNavigationBar[1]/XCUIElementTypeOther[1]/XCUIElementTypeButton[2]’)

IosUIAutomation
仅支持 iOS 9.3或以下,是 iOS 旧框架 UIAutomation 的定位方式,现在基本上很少使用,这个定位类型同样可使用 iOS 谓词进行定位,详细可参考:iOSNsPredicate

总结:
以上这个多定位方式,很少说全部用完。根据我的经验,推荐使用:Android:AndroidUIAutomator > className = id = AccessibilityId > xpath。iOS:iOSNsPredicateString > className = AccessibilityId

 

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