适用于iOS的11个最有用的旅行应用

在21世纪出行带来了更多的问题,“我应该使用哪个旅游网站?”比“我应该去哪里?”的时代来临,在拥有可用于所有应用程序的智能手机时代,应用程序也将接管一切也就不足为奇了。旅游行业。 在开始下一次冒险之旅之前,请先查看这些应用。 Google旅行 使用Google Trips将所有旅行信息保存在一个地方。 将您的所有预订打包到一个捆绑包中,以方便访问,并使用“轻松旅行计划器”功能逐日计划您的旅行。 如果您不知道要做什么,Google会从当地人那里收集关于去哪里和做什么的想法,从而消除您计划行程的猜测。 孤独星球指南 这个程序是您前往世界上50个最热门旅行目的地的终极资源指南。 指南提供了由当地专家策划的城市指南,离线地图,活动过滤器,短语手册,可以像当地人一样说话,还提供了有用的书签功能,可以帮助您组织旅行。 航班统计 Flight stats是全球任何航空公司和机场的实时机场和航班跟踪器。 通过航班号,机场或航线轻松访问任何航班。 您还可以在互动地图上浏览航班。 Apple Watch功能可让您在连接之间穿越机场时检查航班的航站楼和登机口。 谷歌翻译 Google翻译是一款直观的翻译应用,可以在您键入时翻译103种不同的语言。 使其与其他翻译应用程序区分开的一些功能是能够从相机上拍摄的照片进行翻译,对话的双向翻译以及在屏幕上绘制的符号的翻译。 我周围 “我周围”使用您的GPS位置来帮助您找到您周围的企业类型。 该应用程序最初用于餐厅,但此后已扩展到咖啡店,银行,酒吧,加油站,医院,酒店,电影院,超市,剧院和出租车公司。 每个类别中的结果都会根据每个位置与您的位置之间的距离显示在交互式列表中。 Wiffinity Wiffinity允许您访问全球超过40万个Wi-Fi网络及其登录信息。 用户每天都会更新该数据库,这意味着您在寻找最近的咖啡店时就不必担心漫游。 可用的网络将显示在地图上,连接时就像在旅途中单击它们一样简单。 尤格勒 与孩子们一起旅行可能会令人不知所措,尤其是在寻找使他们保持娱乐的活动方面。 有了Yuggler,您将永远不必担心为任何年龄的孩子找到适合做的事情。 搜索您附近的活动,与其他用户合作以分享他们的经验,直接分享到社交媒体以及为将来的用户查看活动。 Yuggler声称是App Store上最受欢迎的家庭应用程序,并且Parents’Choice和Webby的奖项提供了有力的证据来支持这一主张。 TripIt 永远不要搜索您的电子邮件收件箱以再次查找预订。 通过将所有确认电子邮件转发至plan@tripit.com,轻松组织整个行程。 然后,每笔预订都将在主行程中添加到应用中,以便您可以从一个位置访问它们。 将TripIt与您的日历同步,以便您的预订显示在您计划的其他任何活动旁边。 伴侣 对于大多数人来说,独自一人或与一小群人一起去新城市是一件相当恐怖的事情。 伴侣的目标是使您安全地到达目的地。 在应用程序中输入目的地,然后选择几个联系人作为您的伴侣,直到您到达为止。 如果您感到受到威胁,可以用手指轻按两下以通知您的同伴或致电当地政府。 城市地图 永远不要再为新城市中复杂的公共交通系统感到不知所措。 使用Citymapper,您可以选择目的地,该应用程序将为您提供到达目的地的所有选择。 地铁,火车,汽车和公共汽车的旅行时间和ETA已包括在内,而散步和骑自行车所消耗的热量估计在卡路里中。 Oanda货币转换器 不必担心旅行时是否被多收了费用。 该货币转换器具有易于使用的界面,无论您身在何处,都可以根据您要支付的费用来调整费率。 它甚至还包含过时的货币功能,以了解您的钱用牙买加镑可值多少。 通过访问www.markdziuban.net来关注Mark Dziuban的旅行博客,以获取更新。

投资定制开发

随着INVASIVECODE推出SignaKit,我们想解释为什么您应该投资定制的代码。 SignaKit是一个高级iOS框架,可帮助您创建手写签名并将其添加到PDF文档中。 SignaKit是您需要付费的代码,并提供所需的支持,以确保它在将来的Apple更新中仍然有效。 开发应用程序时,您可以选择使用第三方代码和开源库,也可以创建自定义的构建代码。 使用开源代码看似简单,高效且具有成本效益,但是您可能需要考虑使用这些含义。 从长远来看,这实际上可能会花费您更多的金钱和时间。 随着每个Apple iOS过渡,更新iOS应用程序变得至关重要。 更新提供了机会,包括企业优化其应用程序的功能和美观性的机会,开发人员利用新技术和工具的机会以及吸引对利用最新平台感到兴奋的用户的机会。 很容易想到:我的应用程序现在运行流畅,因此可以轻松过渡到下一个iOS版本。 Apple提供了轻松转换代码的工具和平台。 可以重做图形,并且该应用程序看起来已经过完全重新设计。 但是大多数时候,您尚未编写的代码,一段代码或借来“修补”某种功能的库都会出现问题。 使用第三方代码和开放源代码库意味着相信其他开发人员的工作,并希望代码已经以完整性和标准编写。 但是,您应该考虑信任那些没有为编写的代码付费的开发人员,使他们免于承担全部责任:他们可能没有时间更新开源库,因为他们有一份付费的全职工作或他们的优先级可能已经改变。 或简单地说,他们可以编写或不编写质量代码,但是无论如何,您不能责怪他们,因为他们免费提供了代码! 当您的应用程序停止正常运行,或者在更糟的情况下,您的应用程序停止运行时,这将成为问题。 如果您没有与开发人员承担任何合同义务,则所使用的代码将由您自己承担。 为了理解开发过程,想象一下写一本书。 但是,编写本书时,不要自己写每个句子,而是想从其他作家那里借用每个句子。 此过程将节省您的时间。 从头开始写东西总是比从别人那里借书花费更多的时间和精力,并且基本上您要做的就是复制和重新配置。 但是,如果您必须在手稿上找到一个简单的错字,然后才能出版,那么您基本上是无助的,试图阅读和更正数千个未知的句子,最终无法出版您的书。 现在从应用程序开发以及更新iOS应用程序的实际情况来考虑这个问题。 在更新iOS应用时,Apple要求重新编译代码。 在重新编译过程中,Apple会检查应用程序是否存在错误,并确定它是否可以在新的OS版本上正常运行。 如果发现错误,则必须找到并修复。 如果您仍然希望进行更新(这对于保持相关性至关重要),则需要查找错误。 现在,发现错误似乎很简单。 作为编码员,错误是生活的一部分,发现并修复它们是我们的工作。 但是,如果该错误存在于由第三方编写的一段代码中,则开发人员将被迫花费大量时间和资源来浏览并修复其他人的工作,或者等待开发人员维护该代码修复它,可能会发生或可能不会发生,具体取决于开发人员的时间或关注点。 相反,购买SignaKit之类的定制代码将使您放心,当您可以请求快速,无缝地解决问题所需的支持时。 关键是,将代码片段放在一起看似更快,更容易启动,但要注意,随着技术的进步,您可能会遇到很多麻烦。 因此,内部编写本机iOS应用程序以及了解应用程序构成的重要性。 尽管第三方开源代码允许开发人员在短期内加快开发过程并节省资金,但其风险要比许多人希望的高得多。 产品的成功,无论是汽车应用还是移动应用,都取决于寿命。 如果一个小问题导致产品无用,那么就不可能说该产品具有任何实际价值。 尽管开放源代码的使用非常普遍,但是请考虑为在出现问题时提供支持的代码付费。 事实是,与包含第三方代码的应用程序相比,从头编写的iOS应用程序具有更大的价值,并且更易于维护。 有关SignaKit的更多信息,请访问iNVASIVECODE网站。 —伊娃·迪亚兹·桑塔纳(Eva Diaz-Santana) 她是InvasiveCode的共同创始人,从2008年开始开发iOS应用程序并教授iOS开发。她还曾在Apple担任Cocoa Architect和UX设计师。

真正的MVC

向iOS开发人员提出的最常见的采访问题之一是解释模型-视图-控制器(MVC)设计模式。 简而言之,M代表模型,V代表视图,C代表控制器。 控制器是视图和模型之间的中介。 例如,控制器可以告诉模型获取一些数据,然后模型检索数据,然后将数据发送回控制器,然后控制器告诉视图更新UI,但是视图从不与模型对话。 不幸的是,许多开发人员在实现时都在为这个概念而苦苦挣扎。 我们通常没有得到明确的区分,而是通常只得到2,有时是1。 为了解决此问题,许多人开始使用不同的设计模式,例如MPV,MVVM,Clean Swift(我最近遇到过)。 所有这些模式都试图解决相同的问题。 抽象,可重用性和易于测试。 但是,如果我告诉您MVC足以达到所需的抽象级别,并且足以使测试变得非常容易,并且每个组件都可以重复使用,该怎么办? MVC的问题并不是MVC真正的问题,而是我们实现MVC的方式。 我已经看过并遍历了许多代码,其中视图控制器充满了使测试和可重用性变得异常困难的代码。 如果我们能够按预期真正使用MVC,那么我们应该能够实现我们的目标,因此称为“ True MVC”。 好的,足够多的讨论,让我们看一些真实的例子。 想象我们有一个简单但现实的问题。 我们正在构建一个员工目录应用程序。 我们的应用程序有2个屏幕。 第一个屏幕显示按字母顺序排序的员工列表,当在列表上点按员工时,它将导航到员工详细信息屏幕。 为了保持简短和简单,我们将简单介绍第一个屏幕。 对于“员工列表”屏幕,我们具有以下组件。 EmployeesController,EmployeesModel,EmployeesView和Employee故事板。 由于控制器充当视图和模型之间的中介,因此控制器将具有EmployeesModel和EmployeesView的实例。 控制者 在我们的情节提要中,我们转到EmployeesController场景中的超级视图,转到身份检查器,然后将视图的类更改为EmployeesView。 然后,在控制器中创建一个插座。 //视图实例 @IBOutlet var employeeView:EmployeesView! //模型实例 让employeeModel = EmployeeModel() 现在我们有了Model和View的实例,我们需要在controller-view,controller-model,model-controller,view-controller之间建立通信。 可以通过协议实现通信。 因此,我们需要4个协议。 控制器中为2,视图中为1,模型中为1。 //控制器协议 协议EmployeesControllerModelDelegate { func getEmployees() } 协议EmployeesControllerViewDelegate { func updateTableViewWithData(员工:[员工]) } //查看协议 协议EmployeesViewDelegate { func […]

如何在Visual Studio 2015中设置OAuth以使用Google身份验证

OAuth(开放授权)是一种开放标准,允许用户使用其从其他网站(例如Google)的登录凭据登录网站。 登录时会创建一个访问令牌。 创建一个Web应用程序项目或打开一个包含授权的现有项目。 启用S​​SL(安全套接字层) SSL用于建立加密 Web服务器和浏览器之间的链接。 在解决方案资源管理器中,单击您的项目,然后按F4键或从工具栏中打开“视图”,然后单击“属性窗口”,打开“项目属性”窗口。 请注意,这是与右键单击并选择“属性”时显示的窗口不同的窗口。 在“启用SSL”的行上,双击“假”将其切换为“真”。 现在,“ SSL URL”行上将有一个https URL。 复制SSL URL。 请注意,端口号与通常的http URL不同,后者在下面的行中列出。 在项目属性页面中设置https URL。 在解决方案资源管理器中,右键单击您的项目,然后选择“属性”以打开“属性”页面。 从左侧的选项中选择“网页”页面。 对于“项目URL”,将http URL替换为您在上述步骤中复制的https URL。 您还需要此URL进行Google配置。 生成安全证书 将[RequireHttps]属性添加到家庭控制器,以便所有请求都需要https。 运行您的应用程序。 如果您已经在应用程序上设置为在当前计算机上使用OAuth,则已经为本地主机安装了证书,因此请跳至下一步。 如果这是您首次设置要使用OAuth的应用,则会显示以下窗口。 单击是。 然后将显示以下安全警告消息。 再次单击是。 使用Google启用您的应用程序 启动谷歌浏览器,并通过以下网址转到开发者控制台:https://console.developers.google.com/ 在“ Google API”旁边的顶部栏中,单击下拉列表,然后选择“创建项目”。 输入您的项目名称,然后单击“创建”按钮。 Google将需要一分钟的时间来创建该项目,然后库页面将显示流行的API类型列表。 为此,请在“社交API”下选择“ Google + API”。 在出现的窗口顶部,单击“启用” 在左侧面板中,单击“凭据”,然后在出现的凭据窗口顶部,单击“ OAuth同意屏幕”,然后输入“显示给用户的产品名称”。 这是您的用户会识别为您的应用程序的名称。 您的电子邮件应该已经显示。 点击“保存”。 点击“创建凭据”,然后从凭据类型列表中选择“ OAuth客户端ID”。 (另外两个是API密钥和服务帐户密钥,这些指令未涵盖这些密钥。) 在“凭据”输入页面上,将“ Web应用程序”选择为“应用程序类型”。 […]

iOS 10.2:在CoreFoundation上了解“互斥锁失败:参数无效”

几周前,iOS 10.2开始推出,Spreaker Podcast Radio几乎立即开始从10.2设备获取流量。 我们始终对崩溃进行严格监控,因此几天后,虽然iOS 10.2市场渗透率不断提高,但我们立即注意到iOS 10.2上平均每日崩溃的趋势有所增加。 这是从实际堆栈跟踪中提取的: 或这个: 如您所见,整个堆栈仅包含平台代码,因此一开始很难理解正在发生什么以及涉及应用程序的哪一部分。 我们还注意到有时涉及一些Javascript内容,wtf? 唯一的线索来自我们的日志:每次崩溃发生时,应用程序所做的最后一件事就是尝试从网络中播放(或预加载)音频文件。 我们的应用程序播放了来自多个不同来源的音频文件,并且在这些崩溃中均未发生这些音频文件,这些数据并未显示出某个音频文件(或远程托管)与这些崩溃之间的任何特定关联,我们也无法找到一种在本地播放它们的方法,只是玩一些随机的东西。 在花了数小时收集更多信息之后,我们偶然发现了Core Foundation参考,其中提到了在与代理自动配置相关的函数中通过CFArray和CFError传递结果的某些信息,并且在我们的堆栈跟踪中,这些对PAC / PACClient / PACFetcher的引用晦涩难懂。 if如果PAC表示“代理自动配置”怎么办? 💡💡💡 我们以前没有使用高级代理配置的经验,只是知道有一种方法可以配置设备以自动发现代理设置。 您可以浏览此站点以了解其详细信息,但为了简短起见,它类似于以下内容: 您配置代理自动发现设置以从远程URL获取配置 该URL用PAC文件答复,该文件是公开入口函数的Javascript文件。 在执行过程中,系统调用此函数,传递要获取的资源的url,该函数需要返回如何获取资源的方式,例如通过使用特定的代理或直接连接。 我们立即尝试运行Charles Proxy,并在请求/proxy.pac时启动本地http服务器来提供此PAC文件: 并使用以下网址在iOS设备上配置代理设置: http:// : /proxy.pac 有效!!! 好吧,它崩溃了,但这正是重现问题的关键,对吗? 那么,什么触发了此行为以及如何解决呢? 为了在我们的应用程序中提供出色的播放体验,我们必须实现自己的播放系统,而不是依靠Apple提供的基本AVAudioPlayer,并且此播放系统的某些内部组件直接处理CoreFoundation流。 从HTTP请求创建流后,我们对其进行配置,以考虑系统代理设置,方法是: 显然,注释最后两行将导致崩溃立即停止,但这意味着,如果您的网络仅允许通过代理的出站流量,则播放系统将无法工作。 有99.99%的人确定这是iOS 10.2上的错误,并且受iOS上一些Websocket库中所做工作的启发,其中CoreFoundation不会自动使用代理设置,因为它不了解ws://和wss://方案(此处为示例),我们决定手动实现Proxy Auto-Discovery协议, 但仅在iOS 10.2上,这是我们支持的唯一iOS版本(iOS8 +),不能自行处理 。 这项工作涉及: 查看代理设置,并检查是否启用了自动发现协议 提取PAC文件,并将其内容与CFNetworkCopyProxiesForAutoConfigurationScript一起使用,以确定需要使用哪个代理 相应地在流上设置kCFStreamPropertyHTTPProxy属性。 这里有人遇到过这个问题吗? 您是否还有其他想法可以改善此解决方法并使它更好地工作? 在评论中让我知道! 再见!

中等需求的iOS应用程序上的东西,这样我就不会失去理智

亲爱的朋友@中, 我们中的某些人将平板电脑用作主要计算机,而我们中的某些人则喜欢甚至更喜欢Medium iOS应用程序的简便性。 但是,有一些微小的小问题会使应用程序变得更好,更易于使用,并且完全不需要临时移动到台式机/笔记本电脑(或切换到我的移动浏览器并假装成成为桌面浏览器),以便我可以调整故事。 图像:我喜欢选择使图像居中或围绕文本环绕。 我们目前在应用程序上没有该选项。 画廊:图像网格很棒,但是在iOS中,我每次只能上传一张图像。 我们可以做到这一点吗? 计划:实施起来并不难。 如果我可以安排故事安排在以后在完整的浏览器中撰写时发布,那么我应该可以在移动设备上使用相同的选项。 出版物:对某人的出版物有更多控制权,例如能够查看统计信息和关注者信息。

将GitLab CI支持添加到iOS项目

我最近发表了一篇文章,详细介绍了几个持续集成系统以及我最终决定使用的系统:GitLab CI。 今天,我将我的另一个项目转移到了新服务中,我认为我将逐个演示如何使用GitLab CI构建和部署该项目。 关于该项目 有问题的项目是iOS的Scrawl Notes。 这是一个相对简单的应用程序,具有相对简单的要求。 它具有单个依赖项¹,由Carthage管理。 有两个测试目标(UI和单元测试)²,每当我推送到GitLab服务器时,我都希望同时运行它们。 最后,我通过Apple的TestFlight将此应用程序部署到Beta测试人员,因此当我推送到master分支时,我想自动将构建版本上传到那里。 快车道 Fastlane使在其他项目上进行所有这些设置变得更加容易,因此我将在这里再次使用它。 Scrawl Notes尚未使用Fastlane,因此将其添加为第一步。 $ fastlane setup 在设置过程中,Fastlane要求我提供我的Apple ID。 我有一个单独的Apple开发者帐户,仅用于我的持续集成系统。 这主要是因为,如果它完全变成了麻烦,至少它仅限于我的工作,而不是我的雇主或我们的任何客户的工作。 安装完成后,Fastlane为我创建了几个文件: $ git status On branch 1.2-release Changes to be committed: (use “git reset HEAD …” to unstage) new file: fastlane/Appfile new file: fastlane/Deliverfile new file: fastlane/Fastfile … 我在这里关心的主要是Fastfile ,它描述了我希望Fastlane运行的所有任务。 默认生成的文件中包含大量内容,我现在不想要所有这些。 这是我得到的: min_fastlane_version(“2.73.0”) […]

Xcode 9和Swift Playgrounds#健忘

XCode 9打破了旧操场 您必须以不同的方式执行一两个步骤才能在Swift Playground上运行cocoapods。 脚步 创建一个Xcode项目 创建一个podfile 运行pod安装 打开xcworkspace Xcode 9的新功能: 您将无法再将Playground文件添加到工作区。 代替: 通过选择File > New > Playground来创建游乐场文件 此新文件将不会自动添加到您的Xcode项目中,并且您将无法自动将其保存到您的项目目录中。 您必须导航回到项目的目录来存储文件。 然后选择项目,右键单击并选择“ Add Files to 将新的Playground文件添加到您的项目中 确保运行Build以确保Pod出现在您的项目中。 码 Tabula Rasa :与Xcode 9兼容的Swift Playground Alamofire Cocoapod 共同利益 几年前,@ neonichu创建了一个宝石ThisCouldBeUsButYouPlaying,但是进步的车轮使它过时了。 我们其中之一应对此进行更新!

iOS 10和消息框架

当苹果公司最近在WWDC向开发社区开放Messages时,我们的最初反应是HURRAY ! 像许多热情的开发人员一样,我们一直在等待这一刻,以便将有趣的内容集成到Messages中。 实际上,每个iPhone所有者都使用“电话”,“设置”和“消息”应用程序-这3个应用程序基本上是必不可少的。 直到iOS 10为止,Messages都是与我们的开发人员隔离的一个应用程序。 因此可以肯定地说我们很兴奋。 第一印象 在玩Ice Cream Builder示例时,您会发现Apple不仅在框架中进行了一半。 他们正在寻求创建一种新的应用程序范例,以量身定制以改善消息传递体验。 当苹果公司允许在iOS 8中使用第三方键盘时,我们开始看到这种希望的一瞥。该键盘允许以以前无法实现的方式共享GIF,贴纸和图像等丰富的内容。 有了iOS 10,大门就敞开了。 具有协调参与的交互式消息为开发人员带来了许多新的可能性。 回合制游戏(象棋,西洋跳棋和ooh战舰😀)立刻浮现在脑海,但更令人兴奋的是更实际的用例,例如在小组对话中直接与几个朋友分割支票。 每个人都点击Square Cash或Venmo片段并支付其份额。 此外,有了Messages片段中的归因支持,群聊中的每个人都有机会安装贡献者应用程序。 对于开发人员来说,这是一个梦想成真。 如果深入研究Messages Framework文档,您会发现有两种不同类型的集成: 贴纸包 有人说贴纸吗? 是! 在imoji,我们为贴纸而活! 实际上,我们之所以制作了表情符号,是因为我们了解了全球消息传递趋势,并且知道贴纸注定将成为iMessage及更高版本中可视通信的关键部分。 iOS 10不仅通过增加轻松向用户发送视觉效果的功能,而且还允许用户在聊天对话中的任意位置剥离和放置贴纸,从而使贴纸成为消息传递的重要组成部分。 消息传递曾经只是来回传递,但现在会变得更加有趣! 苹果公司一直重视视觉交流,并且作为该策略的一部分,为开发人员创建了一个简单而优雅的解决方案来创建贴纸包。 以下是开发人员如何发布基本贴纸包(功能受限)的示例。 首先创建一个新的Sticker Pack项目: 接下来,将您的图像拖到贴纸包资产目录中。 对于此示例,我们决定创建一个动画猫贴纸包(由Iconka提供)。 因为谁不喜欢可爱的动画猫咪贴纸? 差不多了! 这是我们手机中“消息”中的外观: 很容易吧? 借助如此简单的工具,我们可以确定,一旦iOS 10推出,数千个贴纸包应用程序将立即在App Store中弹出。 消息扩展 尽管贴纸包既有趣又可爱,但它们并非功能强大。 用户可以将贴纸发送给他们的朋友或将其拖动到照片上,但是要增加体验的复杂程度(例如搜索贴纸的能力),我们需要做更多的工作。 这是Messages扩展的来源。 消息扩展功能一目了然。 与具有较少内存的键盘不同,Messages扩展更为宽松。 更好的是,用户不再需要采取其他步骤来在“设置”中启用完全访问权限。 只是……有效。 简而言之,Messages扩展与任何其他扩展一样工作。 iOS将调用您的主视图控制器,该控制器必须扩展MSMessagesAppViewController。 […]

EORA3D:更大,更粗,更糟

最新版本(134)包括带有网格输出,自由形状对齐和全新 智能 校准 的冲头 。 今天是个好日子! 随着您的宝贵反馈意见不断涌入,我们将继续乐意解决。 今天的更新(内部版本134)包含在我们上线应用商店之前,我们认为可能是该应用最大的更改集。 如果您发现有任何奇怪之处,请告知我们,以便我们进行深入研究并进行检查。 全新的校准[新] 没有转盘对准扫描 网格导出[新] 应用内扫描对齐工具 自由格式扫描对齐[新] 更智能的校准 我们几乎从头开始重建校准。 我们非常重视您的反馈意见,今天的更新解决了许多这些问题。 与往常一样,感谢您帮助我们使EORA 3D应用达到最佳状态。 在这里阅读更多。 网格导出 我们最需要的功能之一。 现在,您只需按一下按钮,就可以导出STL,PLY或OBJ中的网格文件! 使用网格生成时,有许多方法可以执行计算。 目前,我们正在以低尺度分辨率使用体积扩散(类似于Octree 8级泊松重建)。 这将产生100%防水的3d可打印网格。 在这里阅读更多。 我们在这里有很大的计划。 应用内扫描对齐工具已经有人进行了Beta测试,现已发布给所有人。 自由形式的扫描对齐 对于那些对于转盘来说太大的物体。 扫描对象的各个部分,然后在应用内对齐这些扫描。 这是一个早期预览。 如果您是Eoraphile,那就去扫描人们吧! 如果您正在考虑以开创性的方式来捕捉周围的现实世界,请确保查看Facebook,Twitter,Youtube,Instagram或直接联系! 祝您扫描愉快!