0%

如何将Vapor项目部署到Ubuntu?

Vapor 是基于 Swift 编程语言而开发的最流行的 Web 网络框架,这是一种更先进、强大且类型安全的编程语言。通过 Vapor,你可以使用 Swift 编写后端、Web 应用 API 或 HTTP 服务,与传统的服务器语言相比具有许多优点。

前言

Vapor官方文档
https://legacy.docs.vapor.codes/3.0/
Swift下载地址
https://www.swifwt.org/download/#using-downloads
环境:
Ubuntu 22.04

Swift 5.9,	x86_64
https://download.swift.org/swift-5.9-release/ubuntu2204/swift-5.9-RELEASE/swift-5.9-RELEASE-ubuntu22.04.tar.gz
备注:

文中涉及到的文件路径,可根据自己喜好修改调整

Swift安装包:/usr/src/

Vapor Toolbox: /usr/local/projects/vap

Hello项目:usr/local/projects/vap

1、安装Swift

sudo apt update && sudo apt upgrade
apt-get install \
binutils \
git \
gnupg2 \
libc6-dev \
libcurl4-openssl-dev \
libedit2 \
libgcc-9-dev \
libpython3.8 \
libsqlite3-0 \
libstdc++-9-dev \
libxml2-dev \
libz3-dev \
pkg-config \
tzdata \
unzip \
zlib1g-dev
# 导入 PGP
wget -q -O - https://swift.org/keys/all-keys.asc | gpg --import -
cd /usr/src/
apt install -y wget
# 下载Swift压缩包
wget https://download.swift.org/swift-5.9-release/ubuntu2204/swift-5.9-RELEASE/swift-5.9-RELEASE-ubuntu22.04.tar.gz
# 解压
tar xzf swift-5.9-RELEASE-ubuntu22.04.tar.gz
# 添加软连接
export PATH=/usr/src/swift-5.9-RELEASE-ubuntu22.04/usr/bin:"${PATH}"
# 校验
swift --version

# 输出下面内容,表示安装成功
Swift version 5.9 (swift-5.9-RELEASE)
Target: x86_64-unknown-linux-gnu

2、安装Vapor Toolbox

cd /usr/local/projects/vap
git clone https://github.com/vapor/toolbox.git
cd toolbox
git checkout 18.7.1
swift build -c release --disable-sandbox
mv .build/release/vapor /usr/local/bin
# 校验
vapor --help

3、新建Vapor项目

# 进入文件夹
cd /usr/local/projects/vap
# 新建项目
vapor new Hello
# 构建
cd Hello
swift build
# 运行
swift run

# 或者
swift run App serve --env production
swift run App serve --env development
swift run App serve --env testing

4、安装nginx

使用反向代理,将Vapor 服务器绑定到 80 端口

# 安装
apt-get update
apt-get install nginx
# 修改站点配置
vim /etc/nginx/sites-enabled/default
# 具体修改如下:
server {
listen 80 default_server;
listen [::]:80 default_server;

root /usr/local/projects/vap/Hello/Public/;

# nginx 直接处理所有静态资源文件的请求,其余请求则回落 (fallback) 到 Vapor 应用
location / {
try_files $uri @proxy;
}

location @proxy {
proxy_pass http://127.0.0.1:8080;
proxy_pass_header Server;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 3s;
proxy_read_timeout 10s;
}
}
# 运行
service nginx start

在Hello项目运行的前提下,访问 http://你的IP地址, 一切正常的话,将输出 It works!

5、安装supervisor

使项目保持后台运行

# 安装
sudo apt-get install supervisor
# 进入配置目录
cd /etc/supervisor/conf.d/
# 为项目添加配置
touch Hello.conf
# 编辑配置
vim Hello.conf
# 具体编辑内容如下:
[program:hello]
command=/usr/src/swift-5.9-RELEASE-ubuntu22.04/usr/bin/swift run App serve --env production
directory=/usr/local/projects/vap/Hello/
autorestart=true
user=root
stdout_logfile=/var/log/supervisor/%(program_name)-stdout.log
stderr_logfile=/var/log/supervisor/%(program_name)-stderr.log
# 重启
systemctl restart supervisor
# 重新加载配置
sudo supervisorctl reread
# 添加需要运行的配置
sudo supervisorctl add hello
# 启动配置
sudo supervisorctl start hello
# vap项目更新后,需重启
sudo supervisorctl restart all
# Supervisor状态
systemctl status supervisor
# 查看运行中的服务, 输入exit退出
supervisorctl

👉👉👉👉 End 👈👈👈👈

English

iNavMock 是一款功能强大的 macOS 应用,专为 iPhone 用户设计,旨在修改手机定位并提供逼真的模拟导航体验。无论是为了保护隐私、测试位置相关的应用,还是仅仅为了娱乐,iNavMock 都能满足您的需求。

主要功能:

  1. 定位修改: iNavMock 允许您修改您的 iPhone 手机定位,您可以选择任何地点作为您的当前位置,无论是国际旅行、地理位置测试还是其他用途,都能轻松实现。

  2. 模拟导航:不仅仅是定位修改,iNavMock 还提供了逼真的模拟导航功能。您可以设置起点、终点和途径点,应用将模拟真实的导航体验,包括路线规划、导航指示等,为您提供全面的导航体验。

  3. 隐私保护:保护个人隐私是我们的首要任务。iNavMock只会模拟位置而并不会获取您的真实位置信息,确保您的隐私得到最大程度的尊重和保护。

  4. 易于使用:iNavMock 的用户界面简洁直观,无论您是新手还是有经验的用户,都能够轻松上手。操作简单,只需几步设置,即可开始模拟导航。

  5. 多种应用场景:iNavMock 在多个领域具有广泛的应用。无论您是开发人员需要测试位置相关的应用,还是普通用户为了好玩,iNavMock 都能满足您的需求。

如何使用:

~~暂不支持 iOS 17 系统 ~~

  1. 下载并安装 iNavMock 应用到您的 macOS 设备。下载iNavMock

  2. 下载并安装设备连接工具 Runner 到您的macOS设备。iNavMock 并不直接与手机连接,所以需要与Runner配合使用。下载Runner

  3. 连接您的 iPhone 手机到计算机,并确保iPhone已经开启开发者模式(Developer Mode)。

  4. 打开 iNavMock 应用,在界面上选择您想要修改的位置或者设置模拟导航的起点和终点。

  5. 开始体验虚拟的位置修改和模拟导航。

  6. 可发送邮件至zhangzhaopds@gmail.com需求更多帮助。

预览图

FQA

  1. 手机如何开启开发者模式?

    前往iPhone的「设置」->「隐私与安全性」->「开发者模式」->打开「开发者模式」

  2. 修改定位是所有App都有用吗?

    是的,修改的是整个手机的定位,是全局的

  3. 手机是否需要越狱?

    不需要

  4. 为什么需要开启开发者模式?

    是苹果基于安全的考虑,点击了解更多

  5. 如何还原手机定位?

    在Runner中,选择连接的设备,点击 还原定位,即可重置定位

无论您是在开发应用、保护隐私,还是仅仅为了好玩,iNavMock 都将成为您的得力助手。立即下载并开始探索您的虚拟位置之旅!

中文

iNavMock is a powerful macOS app designed for iPhone users to modify the positioning of the phone and provide a realistic simulated navigation experience. Whether it’s for privacy protection, testing location-sensitive apps, or just for fun, iNavMock has you covered.

Features:

  1. Location modification: iNavMock allows you to modify your iPhone location, you can choose any location as your current location, whether it is for international travel, location testing or other purposes, it can be easily realized.

  2. Mock navigation: Not only positioning modification, iNavMock also provides a realistic mock navigation function. You can set the start point, end point, and way point, and the app will simulate a real navigation experience, including route planning, navigation instructions, etc., to provide you with a comprehensive navigation experience.

  3. Privacy protection: protecting personal privacy is our top priority. iNavMock only simulates the location and does not obtain your real location information, ensuring that your privacy is respected and protected to the greatest extent.

  4. Easy to use: The user interface of iNavMock is simple and intuitive, no matter you are a novice or an experienced user, you can easily get started. The operation is simple, just a few steps to set up, and you can start to simulate navigation.

  5. Various application scenarios: iNavMock has a wide range of applications in many fields. Whether you’re a developer needing to test location-dependent apps, or a regular user just for fun, iNavMock has you covered.

How to get started:

~~iOS 17 is not supported ~~

  1. Download and install iNavMock app to your macOS device. Download iNavMock

  2. Download and install the device connection tool Runner to your macOS device. iNavMock is not directly connected to the phone, so it needs to be used in conjunction with the Runner. Download Runner

  3. Connect your iPhone to the computer, and make sure Developer Mode is turned on.

  4. Open the iNavMock app, select the location you want to modify or set the start and end points of the simulated navigation on the interface.

  5. Start to experience virtual position modification and simulated navigation.

  6. For more help, email zhangzhaopds@gmail.com.

Preview image

FQA

  1. How to enable developer mode on iOS16 phone?

    Go to iPhone’s “Settings” -> “Privacy & Security” -> “Developer Mode” -> Turn on “Developer Mode”

  2. Is it useful for all apps to modify the location?

    Yes, the modification is the positioning of the entire mobile phone, which is global

  3. Does the phone need to be jailbroken?

    Don’t need

  4. Why do I need to enable the developer mode?

    It is based on Apple’s security considerations, click Learn more

  5. How to restore the phone location?

    In Runner, select the connected device and click Reset Location to reset the location

Whether you’re developing apps, protecting privacy, or just for fun, iNavMock will be your right-hand man. Download now and start exploring your virtual location journey!

决策树

我想要创建一个 Observable

  • 产生特定的一个元素:just
    • 经过一段延时:timer
  • 从一个序列拉取元素:from
  • 重复的产生某一个元素:repeatElement
  • 存在自定义逻辑:create
  • 每次订阅时产生:deferred
  • 每隔一段时间,发出一个元素:interval
    • 在一段延时后:timer
  • 一个空序列,只有一个完成事件:empty
  • 一个任何事件都没有产生的序列:never

我想要创建一个 Observable 通过组合其他的 Observables

  • 任意一个 Observable 产生了元素,就发出这个元素:merge
  • 让这些 Observables 一个接一个的发出元素,当上一个 Observable 元素发送完毕后,下一个 Observable 才能开始发出元素:concat
  • 组合多个 Observables 的元素
    • 当每一个 Observable 都发出一个新的元素:zip
    • 当任意一个 Observable 发出一个新的元素:combineLatest

我想要转换 Observable 的元素后,再将它们发出来

  • 对每个元素直接转换:map
  • 转换到另一个 Observable:flatMap
    • 只接收最新的元素转换的 Observable 所产生的元素:flatMapLatest
    • 每一个元素转换的 Observable 按顺序产生元素:concatMap
  • 基于所有遍历过的元素: scan

我想要将产生的每一个元素,拖延一段时间后再发出:delay

我想要将产生的事件封装成元素发送出来

我想要忽略掉所有的 next 事件,只接收 completed 和 error 事件:ignoreElements

我想创建一个新的 Observable 在原有的序列前面加入一些元素:startWith

我想从 Observable 中收集元素,缓存这些元素之后在发出:buffer

我想将 Observable 拆分成多个 Observables:window

  • 基于元素的共同特征:groupBy

我想只接收 Observable 中特定的元素

  • 发出唯一的元素:single

我想重新从 Observable 中发出某些元素

  • 通过判定条件过滤出一些元素:filter
  • 仅仅发出头几个元素:take
  • 仅仅发出尾部的几个元素:takeLast
  • 仅仅发出第 n 个元素:elementAt
  • 跳过头几个元素
    • 跳过头 n 个元素:skip
    • 跳过头几个满足判定的元素:skipWhileskipWhileWithIndex
    • 跳过某段时间内产生的头几个元素:skip
    • 跳过头几个元素直到另一个 Observable 发出一个元素:skipUntil
  • 只取头几个元素
    • 只取头几个满足判定的元素:takeWhiletakeWhileWithIndex
    • 只取某段时间内产生的头几个元素:take
    • 只取头几个元素直到另一个 Observable 发出一个元素:takeUntil
  • 周期性的对 Observable 抽样:sample
  • 发出那些元素,这些元素产生后的特定的时间内,没有新的元素产生:debounce
  • 直到元素的值发生变化,才发出新的元素:distinctUntilChanged
  • 在开始发出元素时,延时后进行订阅:delaySubscription

我想要从一些 Observables 中,只取第一个产生元素的 Observable:amb

我想评估 Observable 的全部元素

  • 并且对每个元素应用聚合方法,待所有元素都应用聚合方法后,发出结果:reduce
  • 并且对每个元素应用聚合方法,每次应用聚合方法后,发出结果:scan

我想把 Observable 转换为其他的数据结构:as…

我想在某个 Scheduler 应用操作符:subscribeOn

我想要 Observable 发生某个事件时, 采取某个行动:do

我想要 Observable 发出一个 error 事件:error

  • 如果规定时间内没有产生元素:timeout

我想要 Observable 发生错误时,优雅的恢复

  • 如果规定时间内没有产生元素,就切换到备选 Observable :timeout
  • 如果产生错误,将错误替换成某个元素 :catchErrorJustReturn
  • 如果产生错误,就切换到备选 Observable :catchError
  • 如果产生错误,就重试 :retry

我创建一个 Disposable 资源,使它与 Observable 具有相同的寿命:using

我创建一个 Observable,直到我通知它可以产生元素后,才能产生元素:publish

  • 并且,就算是在产生元素后订阅,也要发出全部元素:replay
  • 并且,一旦所有观察者取消观察,他就被释放掉:refCount
  • 通知它可以产生元素了:connect

https://beeth0ven.github.io/RxSwift-Chinese-Documentation/content/decision_tree.html

Git命令

专用名词

Workspace:工作区
Index / Stage:暂存区
Repository:仓库区(或本地仓库)
Remote:远程仓库

新建代码库

# 在当前目录新建一个Git代码库
$ git init
# 新建一个目录,将其初始化为Git代码库
$ git init [project-name]
# 下载一个项目和它的整个代码历史
$ git clone [url]

配置

# 显示当前的Git配置
$ git config --list
# 编辑Git配置文件
$ git config -e [--global]
# 设置提交代码时的用户信息
$ git config [--global] user.name "[name]"
$ git config [--global] user.email "[email address]"

增加/删除文件

# 添加指定文件到暂存区
$ git add [file1] [file2] ...
# 添加指定目录到暂存区,包括子目录
$ git add [dir]
# 添加当前目录的所有文件到暂存区
$ git add
# 删除工作区文件,并且将这次删除放入暂存区
$ git rm [file1] [file2] ...
# 停止追踪指定文件,但该文件会保留在工作区
$ git rm --cached [file]
# 改名文件,并且将这个改名放入暂存区
$ git mv [file-original] [file-renamed]

代码提交

# 提交暂存区到仓库区
$ git commit -m [message]
# 提交暂存区的指定文件到仓库区
$ git commit [file1] [file2] ... -m [message]
# 提交工作区自上次commit之后的变化,直接到仓库区
$ git commit -a
# 提交时显示所有diff信息
$ git commit -v
# 使用一次新的commit,替代上一次提交
# 如果代码没有任何新变化,则用来改写上一次commit的提交信息
$ git commit --amend -m [message]
# 重做上一次commit,并包括指定文件的新变化
$ git commit --amend ...

分支

# 列出所有本地分支
$ git branch
# 列出所有远程分支
$ git branch -r
# 列出所有本地分支和远程分支
$ git branch -a
# 新建一个分支,但依然停留在当前分支
$ git branch [branch-name]
# 新建一个分支,并切换到该分支
$ git checkout -b [branch]
# 新建一个分支,指向指定commit
$ git branch [branch] [commit]
# 新建一个分支,与指定的远程分支建立追踪关系
$ git branch --track [branch] [remote-branch]
# 切换到指定分支,并更新工作区
$ git checkout [branch-name]
# 建立追踪关系,在现有分支与指定的远程分支之间
$ git branch --set-upstream [branch] [remote-branch]
# 合并指定分支到当前分支
$ git merge [branch]
# 选择一个commit,合并进当前分支
$ git cherry-pick [commit]
# 删除分支
$ git branch -d [branch-name]
# 删除远程分支
$ git push origin --delete
$ git branch -dr

标签

# 列出所有tag
$ git tag
# 新建一个tag在当前commit
$ git tag [tag]
# 新建一个tag在指定commit
$ git tag [tag] [commit]
# 查看tag信息
$ git show [tag]
# 提交指定tag
$ git push [remote] [tag]
# 提交所有tag
$ git push [remote] --tags
# 新建一个分支,指向某个tag
$ git checkout -b [branch] [tag]

查看信息

# 显示有变更的文件
$ git status
# 显示当前分支的版本历史
$ git log
# 显示commit历史,以及每次commit发生变更的文件
$ git log --stat
# 显示某个文件的版本历史,包括文件改名
$ git log --follow [file]
$ git whatchanged [file]
# 显示指定文件相关的每一次diff
$ git log -p [file]
# 显示指定文件是什么人在什么时间修改过
$ git blame [file]
# 显示暂存区和工作区的差异
$ git diff
# 显示暂存区和上一个commit的差异
$ git diff --cached []
# 显示工作区与当前分支最新commit之间的差异
$ git diff HEAD
# 显示两次提交之间的差异
$ git diff [first-branch]...[second-branch]
# 显示某次提交的元数据和内容变化
$ git show [commit]
# 显示某次提交发生变化的文件
$ git show --name-only [commit]
# 显示某次提交时,某个文件的内容
$ git show [commit]:[filename]
# 显示当前分支的最近几次提交
$ git reflog

远程同步

# 下载远程仓库的所有变动
$ git fetch [remote]
# 配置远程仓库地址
$ git remote add origin url
# 删除远程仓库
$ git remote rm origin
# 显示所有远程仓库
$ git remote -v
# 显示某个远程仓库的信息
$ git remote show [remote]
# 增加一个新的远程仓库,并命名
$ git remote add [shortname] [url]
# 取回远程仓库的变化,并与本地分支合并
$ git pull [remote] [branch]
# 上传本地指定分支到远程仓库
$ git push [remote] [branch]
# 强行推送当前分支到远程仓库,即使有冲突
$ git push [remote] --force
# 推送所有分支到远程仓库
$ git push [remote] --all

撤销

# 恢复暂存区的指定文件到工作区
$ git checkout [file]
# 恢复某个commit的指定文件到工作区
$ git checkout [commit] [file]
# 恢复上一个commit的所有文件到工作区
$ git checkout .
# 重置暂存区的指定文件,与上一次commit保持一致,但工作区不变
$ git reset [file]
# 重置暂存区与工作区,与上一次commit保持一致
$ git reset --hard
# 重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变
$ git reset [commit]
# 重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致
$ git reset --hard [commit]
# 重置当前HEAD为指定commit,但保持暂存区和工作区不变
$ git reset --keep [commit]
# 新建一个commit,用来撤销指定commit
# 后者的所有变化都将被前者抵消,并且应用到当前分支
$ git revert [commit]

其他

# 生成一个可供发布的压缩包
$ git archive
# 当前分支的时间线
$ git log --graph --pretty=oneline --abbrev-commit
# 暂存
$ git stash
# 恢复暂存到工作区
$ git stash apply
# 暂存列表
$ git stash list
# 清除暂存
$ git stash clear

请仔细阅读本条款,除此使用条款外,我们不时发布的适用于服务的任何法律声明(所有这些法律声明中的条款下称“额外条款”)亦构成您和我们之间关于您使用本产品的具有法律约束力的协议。如果额外条款的内容和此使用条款的内容发生任何冲突,则应以额外条款为准。

1、接受本条款

您在使用本产品提供的各项服务之前,应仔细阅读本使用条款。如您不同意本使用条款及/或我们不时发布的额外条款,您可以主动卸载本应用产品;您一旦使用服务,即视为您已了解并完全同意本服务条款及额外条款的各项内容,并成为本产品的用户。

2、我们提供的服务

我们不断创新研发迭代以向您提供最优体验。您认知并同意我们提供的服务的形式和本质可不经事先通知您而不时变换。
我们需要定期或不定期地对提供服务的平台或相关的设备进行检修或者维护,如因此类情况而造成服务的中断,您应予以理解。
您认知并同意我们可自行决定,无须事先通知您,即停止(永久或暂时)向您或全体用户提供服务。

3、仅供个人使用

本产品仅供您个人用于非商业用途。如果要将与服务有关或派生的任何资料、服务或软件用于销售或其它商业用途,则必须得到我们的允许。
您在使用服务时,不得损害、禁用、影响服务或使服务负担过重,也不得影响任何其它方使用此产品。如果您对产品有任何意见,或有如何改进的建议,可向我们提出。请注意,如果这样做,还会授予我们和第三方在服务中无偿使用和加入您的建议或意见的权利。

4、隐私政策

本隐私政策适用于您与本产品页面的交互行为。尊重用户隐私是我们的一项基本政策。我们有网站上公布的隐私政策。收集、存储、使用、披露和保护您的个人信息。请您完整阅读上述隐私权政策,以帮助您更好地保护您的个人信息。

5、付费服务协议

用户按照APP内指定的支付方式完成支付一定的服务费用后,用户可以享受对应的付费服务。购买成功后该服务即可生效。
具体服务种类、价格、内容以相应服务界面的公布为准,用户可以根据自己需要自行选择相应服务。一旦用户购买服务,即视为您认可该服务标明的价格。我们会根据产品和服务内容的变化,对现有服务种类和价格进行调整,以不断完善和优化服务。
用户购买服务后,可以在不同移动苹果设备上使用自己的账号,并享受购买的服务。
我们按照本条款提供服务,但不承诺解决因为用户自身引起的问题,包括且不限于用户设备硬件故障,网络故障引起的问题。

6、责任限制

您认知并同意,我们可能会以非人工检索方式自动生成到第三方网页的链接,我们不存储、控制或修改该等第三方网页中的内容,且不对该等第三方网页或资源的可用性负责,亦不对该等网络或资源上的或从该等网站或资源获得的任何广告、产品或其他材料加以认可。
您理解并同意自主选择、使用服务的风险自负,并且对于因使用服务而对计算机系统造成的损坏或数据的丢失,您应承担全部责任。
在适用法律允许的最大范围内,我们明确表示不提供任何其他类型的保证,不论使明示的或默示的,包括但不限于适销性、适用性、可靠性、准确性、完整性、无病毒以及无错误的任何默示保证和责任。另外,在适用法律允许的最大范围内,我们并不担保服务一定能满足您的要求,也不担保服务不会被修改、中断或终止,并且对服务的及时性、安全性、错误发生,以及信息是否能准确、及时、顺利的传送均不作任何担保。
在适用法律允许的最大范围内,我们不就因您使用服务引起的或与服务有关的任何意外的、非直接的、特殊的、或间接的损害或请求(包括但不限于因人身伤害、因隐私泄漏、因未能履行包括诚信或合理谨慎在内的任何责任、因过失和因任何其他金钱上的损失或其他损失而造成的损害赔偿)承担任何责任。

7、本条款的变更

我们可不时对服务条款作出变更并通过适当方式向您提示变更内容。您理解并同意,如果您在服务条款作出变更后继续使用服务,则视为接受该变更。

8、一般法律条款

用户使用本产品和服务时,承诺准守当地法律法规,社会制度,国家利益,公民合法权益,公共秩序,社会道德风尚。不得利用本产品和服务违反法律和法规。
如出现纠纷,双方协商一致解决;如果双方无法通过协商解决,则双方同意由中国成都仲裁机构,在成都进行仲裁解决。

上述条款是各方针对本文主题的全部协议,优先于并取代所有以前或同期对此类主题的书面或口头的规定或协议。
本协议中的标题仅为方便而设,在解释本协议时应被忽略。

如您对本协议内容有任何疑问,可发邮件至邮箱(zhangzhaopds@icloud.com)。

在不影响软件使用的情况下,软件会最大限度的不获取用户的信息。因为我们坚信,“不获取是对用户隐私最好的保护方式”。

会收集的信息

1、收集实现产品功能所必须的信息。例如手机型号、操作系统信息、位置信息、相册权限。
2、会收集信息只为提供更加个性化的服务和体验。例如你注册账号时的手机号码、邮箱、密码。
3、收集改善用户体验的信息。例如用户操作习惯。

信息的使用

1、实现产品功能。例如,操作系统信息是为了更好的适配您的手机。
2、体验的优化。例如,用户操作习惯,更好的设计应用布局和功能,优化使用体验。

您的选择

1、用户操作习惯的信息搜集,您选择我们的软件,默认您允许我们搜集此信息,此信息不针对个人,不定位到个人。如果您不允许可停止软件的使用。
2、相册权限,位置信息,开始收集前会有提示,如果您不允许搜集,可能会影响一些功能的使用,你可以在应用或者手机设置中关闭。

我们的责任和保证

我们有必要遵守相关法律义务,遵循相关法规要求,解决纠纷,防止欺诈和滥用。
我们保证不主动向第三方透漏用户的隐私信息,我们不针对单个个人的隐私信息进行分析,我们将尽力保护用户的隐私信息安全。
如果出现管理变更或软件出售,我们可以在保证安全的情况下向第三方共享您的信息,该第三方有权在符合《隐私权政策》条款的情况下使用该信息。
我们有可能适时修订此政策内容,如果有修订后继续使用我们的服务,即表示同意修订的隐私政策。
如果您对本政策有疑问你可以通过zhangzhaopds@icloud.com联系我们,我们将尽快审核涉及的问题,并予以回复。