塔式服务器放在家用是否合理

之前买过 QNAP 的 NAS ,结果还没过保就不能读盘死翘翘了。现在准备换一个服务器放家里自己玩。
有下面的需求
OS: Windows Server
CPU: 支持虚拟化的 Xeon 系列
Storage: 3.5’HHD x6-x8
其实角色就是 NAS ,不过还想在上面跑一跑虚拟机搭几个 WebServer 折腾折腾。

硬盘 6-8 基本可以排除 gen8,虽然我很喜欢 gen8 的设计,要用 Windows Server 所以也排除了各种厂家的 NAS 。
就想问问大家塔式服务器放家里会不会太吵太闹太费电。以及是否合理。
现在备选有惠普的 ML110 Gen9 ,还有戴尔的 PowerEdge T320

或者有其他方案也好,先谢谢大家 🙂

NAS gen8 塔式 Server9 条回复 • 2016-03-04 14:50:44 +08:00
Strikeactor 1
Strikeactor 2016-03-01 18:28:59 +08:00
挺吵的
wontasia 2
wontasia 2016-03-01 18:43:31 +08:00
@Strikeactor 不知道跟 gen8 比是什么样的水平
Mush 3
Mush 2016-03-01 18:47:25 +08:00
额, 买两个 GEN 8. 不过听说 GEN 8 停产了…..
maskerTUI 4
maskerTUI 2016-03-01 18:54:02 +08:00 via Android
主要是噪音大
alect 5
alect 2016-03-01 19:47:23 +08:00

KexyBiscuit 6
KexyBiscuit 2016-03-01 19:52:19 +08:00 via Android
噪音和功耗都需要考虑,我家里还竖着一台机架式呢……
wontasia 7
wontasia 2016-03-02 09:28:44 +08:00
@KexyBiscuit 功耗倒还好,不知道噪音啥水平,机架式放家里真的没问题么。。。
wontasia 8
wontasia 2016-03-02 09:29:37 +08:00
@maskerTUI 想了想,塔式服务器跟 Gaming PC 的噪音会不会差不多
esxivistawrt 9
esxivistawrt 2016-03-04 14:50:44 +08:00
N54L 就够了

金融公司的服务器搭建

公司在筹建阶段,刚跟电信和联通协商单独拉一根网线过来,那么问题来了,服务器可以放自己公司吗?还是放机房托管?抑或放阿里云?各有什么好处和风险?

服务器 机房 网线 筹建35 条回复 • 2016-05-23 17:15:08 +08:00
lhbc 1
lhbc 2016-02-15 14:25:42 +08:00
这个问你们 CTO, CFO 和 CEO 啊……
ferock 2
ferock 2016-02-15 14:30:11 +08:00
谁拿钱谁回答你
YaphetYin 3
YaphetYin 2016-02-15 14:30:18 +08:00
@lhbc 没有 CTO 。。 CEO 是我朋友,来问我,无奈我只写过逻辑,服务器方面没有涉足过,所以来咨询一下
YaphetYin 4
YaphetYin 2016-02-15 14:31:36 +08:00
@ferock 都是半道出家,不太懂
54dev 5
54dev 2016-02-15 14:33:30 +08:00
https://jr.aliyun.com/
xsec 6
xsec 2016-02-15 14:38:49 +08:00 ❤️ 1
都可以,放公司相当于自己机房啊,控制程度*高,缺点是自己要维护,水电温度什么的;
物理托管就是别人帮你做机房这些方面的维护;阿里云是更高程度托管,更方便,系统什么的都可以帮你维护,但是任何数据它们都可以看到;
基本就是掌控力依次减低,信息保密程度依次降低,方便程度依次提升。
killsting 7
killsting 2016-02-15 14:40:47 +08:00
建议,还是阿里云。
evefree2 8
evefree2 2016-02-15 14:42:55 +08:00
深圳么?
carygao 9
carygao 2016-02-15 14:43:58 +08:00
以你提这个问题的思维来看,建议先放在阿里云,等你们摸熟了自然知道是否应放自己公司维护了。
mhycy 10
mhycy 2016-02-15 14:44:09 +08:00
啥需求没有,免费咨询也不是这么搞啊。。。
scys 11
scys 2016-02-15 14:54:45 +08:00
不闹,找个 CTO
你只是写逻辑,想触及这一块的话,尽可能用 VPS ,刚起步的公司,考虑下大牌子 AWS 会好点,然后 CDN
jasontse 12
jasontse 2016-02-15 14:55:45 +08:00 via iPad ❤️ 1
p2p 么。放哪都一样反正*后是要删除的 :doge:
YaphetYin 13
YaphetYin 2016-02-15 15:03:18 +08:00
@killsting
@carygao
@scys
@xsec

站在我的角度的话也是倾向于先在 VPS 起起来,等后面有需求了再转移,毕竟维护这块不是很懂,出现问题了容易吃瘪 XD

多谢各位的意见哈
YaphetYin 14
YaphetYin 2016-02-15 15:03:46 +08:00
@evefree2 机房在深圳上海北京区别大么?
evefree2 15
evefree2 2016-02-15 15:14:50 +08:00
@YaphetYin 我是说在深圳的话可以给你帮忙下
webjin 16
webjin 2016-02-15 15:32:33 +08:00 via Android
www.71idc.com
gdtv 17
gdtv 2016-02-15 15:35:08 +08:00
不知是什么服务器。如果是公司内部文件共享的服务器,可以放自己公司;如果是网站服务器,必须放机房托管或者阿里云等云服务器,网站服务器*对不能放自己公司,放公司稳定性不行。
abel163 18
abel163 2016-02-15 15:40:51 +08:00
运行网站,还是托管到机房,放公司是不行的哦
Devin 19
Devin 2016-02-15 15:42:10 +08:00 via iPhone
这个问题不是技术问题,而是水表问题。。。
czb 20
czb 2016-02-15 15:51:58 +08:00 via Android
参照 PCI DSS 标准
jwnlive 21
jwnlive 2016-02-15 15:53:55 +08:00
阿里云吧 方便 放公司 各方面不好保证
rssf 22
rssf 2016-02-15 16:17:33 +08:00 ❤️ 1
小额金融公司?随时跑路那种的话,还是放自己公司吧,销毁数据比较方便,不会被留下快照
zmj1316 23
zmj1316 2016-02-15 17:14:46 +08:00
同意 ls,出了什么幺蛾子直接砸了硬盘跑路
tonghuashuai 24
tonghuashuai 2016-02-15 17:51:49 +08:00
如果规模不太大的话,可以先放云平台托管一段时间
akira 25
akira 2016-02-15 18:10:45 +08:00 ❤️ 1
放自己公司的话,你确认可以过备案?
kisinfo 26
kisinfo 2016-02-15 18:14:54 +08:00
*好是放在云上面去了,方便一些,要不自己管理和需要考虑电源,温度,服务器硬件,没有专人很不方便.如果规模大了可以考虑再迁移到本地.
另外放在什么地方,相对的周边的访问会来的快一点,但,真是一点而已.
KenGe 27
KenGe 2016-02-15 19:46:04 +08:00
云服务可以找我啊~
xjchenhao 28
xjchenhao 2016-02-15 19:48:24 +08:00
我们公司也是做互联网金融的, 放在阿里云上面的.
defunct9 29
defunct9 2016-02-15 20:30:32 +08:00 via iPhone
pci dss ,需要托管的
silentime 30
silentime 2016-02-16 11:49:32 +08:00
使用云服务器啊
abel163 31
abel163 2016-02-16 16:58:52 +08:00
没考虑过境外吗?香港机房自营的,托管可以考虑找我,
qq1242245799 32
qq1242245799 2016-02-22 11:04:48 +08:00
金融类型服务器*好是放到专业的数据中心机房,毕竟客户数据资料的安全不是开玩笑的,你放到公司不是长久之计,服务器万一断电或者线路出故障啥都不好说
fendouzhu007 33
fendouzhu007 2016-02-24 10:06:03 +08:00
建议还是放在正规的数据中心 中国电信香港国际数据中心 电信自建的机房 有需要可以联系 QQ712624628 还可以制定针对性的跨境方案
tap123 34
tap123 2016-03-19 15:26:19 +08:00
金融网站的话 涉及用户数据 第三方支付这块什么的 云服务器的话配置跟不上,*好是买一台机器托管到机房去,机器是自己的数据也比较安全。
LongCT 35
LongCT 2016-05-23 17:15:08 +08:00
放机房托管,找你之前的人脉关系找一个兼职的运维帮你处理日常工作和突发情况。
带宽费用低,省心。主要是不吵。

用云服务器运行代理服务器,为了支持上万人的并发,请问带宽要多大?

就是用云服务器运行自己写的基于 Node 的代理服务器程序, 进行 Http 或 Https 代理。

不知道该怎么计算

这个怎么预估,大家知道吗?

第 1 条附言 · 2016-02-26 20:47:39 +08:00
一般的网络代理,当然会有下载,视频,一般的网站请求
服务器 并发 请问 预估10 条回复 • 2016-05-04 18:41:35 +08:00
ericFork 1
ericFork 2016-02-26 18:00:07 +08:00
用 Node 写的话你的瓶颈是内存
sumhat 2
sumhat 2016-02-26 18:34:02 +08:00
按 V 站的传统,先有上万人流量再说…
vagrant 3
vagrant 2016-02-26 20:42:45 +08:00
@sumhat
@ericFork

讨论带宽的问题,其他问题作为成立的 假设条件。
v1024 4
v1024 2016-02-26 20:44:59 +08:00 via iPhone
你也不说代理什么,代理一万条油管和代理一万个维基,当然是不一样的。
vagrant 5
vagrant 2016-02-26 20:50:07 +08:00
@v1024 都会有,只是做个代理服务器,具体访问的内容当然未知,所以预估下
jacy 6
jacy 2016-02-26 21:21:56 +08:00
带宽够了,机房的网络设备能受得了吗
Karblue 7
Karblue 2016-02-27 14:03:41 +08:00
按一个人占服务器 1M 带宽算。 1W 个客户端同时在线和满载的话。。 你的服务器已经炸了
qq1242245799 8
qq1242245799 2016-02-29 15:39:08 +08:00
一个人算 1kb/s 的流量的话, 1w 就是 10M/s 的速度,这就需要大概 100M 带宽,实际上这个是保守估计,你得配个 G 口的。服务器必须用集群,云你搞不定
alect 9
alect 2016-03-01 21:47:54 +08:00
你如果真有上万用户,你得租 100 台机器……
ytmsdy 10
ytmsdy 2016-05-04 18:41:35 +08:00 via iPhone
当你碰到上万的并发,你要考虑的是系统是否可以扛得住。不是带宽。
你想问的应该是每天的 pv 量吧?

国内那些独立服务器租用的 IDC,对用途和流量有限制吗?

想短时间(两三个月)租一个国内的独服拿来挂 pt ,搞下载。如果我总是跑满上下行带宽,会不会把我的机器给封了?
独服 IDC 租用 带宽8 条回复 • 2016-03-09 08:44:23 +08:00
webjin 1
webjin 2016-03-07 16:20:20 +08:00 via Android
一分钱一分货的不会。
webjin 2
webjin 2016-03-07 16:21:08 +08:00 via Android
现在国内行情的带宽是 50 元 1M 左右
lsylsy2 3
lsylsy2 2016-03-07 16:23:24 +08:00
PT 的话国内一般不会封
但是“共享带宽”很可能限制你的速度。
Mikewu 4
Mikewu 2016-03-07 17:03:57 +08:00 via Android
为什么要租国内独服呢,不是有 pt 盒子吗?
哪个 pt 站?
snsd 5
snsd 2016-03-07 17:52:03 +08:00 via iPhone
@Mikewu 下完以后需要传网盘备份。盒子都在国外,而且盒子都是 Linux 系统,用不了百度网盘
tap123 6
tap123 2016-03-08 08:56:26 +08:00
独立服务器一般不会限用流量的,我是做香港 IDC 的, QQ : 1562691575 需要资源也可以找我
abel163 7
abel163 2016-03-08 10:51:51 +08:00
必须没限制啊,国内 100m 带宽独享,不跑满退款,加我 qq41431935 ,开测试搞下
lining123 8
lining123 2016-03-09 08:44:23 +08:00
流量没限制 按带宽计费

Mac OS – VSCode C++开发配置

VSCode 在 Mac 系统上使用 C++ 开发相信很多人都觉得配置比较难,配置教程也是各式各样的。经过多次的尝试,并参考了 官方教程,在原有资料的基础上进行了补充和整理,这里输出了一个自己配置成功的方法。

⚠️注意:本文同样适用于 Windows 系统。

预先安装
1.安装 VSCode
官方地址 Visual Studio Code on macOS

2.安装插件 C/C++,在扩展插件中搜索 C++。

%title插图%num
3.确认已安装 Clang,Clang 可能在你的电脑里安装过了,打开终端,输入以下命令来确认是否安装。
clang –version
1
若 Clang 未安装,使用 xcode-select –install 进行安装。

创建项目
1.创建一个 Hellow World 项目进行测试:
mkdir projects
cd projects
mkdir helloworld
cd helloworld
code .

上述步骤,创建了一个 Helloworld 项目,并在 VSCode 中打开。

2.创建一个 cpp 文件

%title插图%num
3.创建一个文件取名为 helloworld.cpp,将以下代码粘贴进文件中,并按 Command + S 进行保存。
#include <iostream>
using namespace std;

int main()
{
for(int i=0; i<=5; i++)
cout << “Hello World ” << i << endl;
return 0;
}

 

配置 C++ 相关设置文件
我们需要生成三个文件:

tasks.json (compiler build settings)
launch.json (debugger settings)
c_cpp_properties.json (compiler path and IntelliSense settings)
tasks.json 文件
tasks.json 用来告诉 VSCode 如何编译该程序,这里会调用 Clang C++ 进行编译。
这里需要将 helloworld.cpp 文件在编辑界面中打开,然后选择菜单栏 Terminal(终端) > Configure Default Build Task(配置默认生成任务),选择下面选项。

现在在 .vscode 文件夹中,就生成了 tasks.json 文件。将下面的代码替换掉原来的内容。

{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
“version”: “2.0.0”,
“tasks”: [
{
“type”: “shell”,
“label”: “clang++ build active file”,
“command”: “/usr/bin/clang++”,
“args”: [
“-std=c++17”,
“-stdlib=libc++”,
“-g”,
“${file}”,
“-o”,
“${fileDirname}/${fileBasenameNoExtension}”
],
“options”: {
“cwd”: “${workspaceFolder}”
},
“problemMatcher”: [“$gcc”],
“group”: {
“kind”: “build”,
“isDefault”: true
}
}
]
}

 

接下来,回到 helloworld.cpp 文件,按 Ctrl + Shift + B 进行编译或选择 Terminal(终端) > Run Build Task(运行任务)。

如果编译成功,会在终端中显示,并且可以在目录中看到有一个 helloworld.dSYM 文件夹。(这是用于 Debug 的,先不管它)

launch.json 文件
该文件用于配置 VSCode 启动 LLDB debug。

选择 Run > Add Configuration,并选择 C++ (GDB/LLDB),再选择clang++ build and debug active file

现在在 .vscode 文件夹中,就生成了 launch.json 文件。其内容如下:

{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
“version”: “0.2.0”,
“configurations”: [
{
“name”: “clang++ – Build and debug active file”,
“type”: “cppdbg”,
“request”: “launch”,
“program”: “${fileDirname}/${fileBasenameNoExtension}”,
“args”: [],
“stopAtEntry”: true,
“cwd”: “${workspaceFolder}”,
“environment”: [],
“externalConsole”: false,
“MIMode”: “lldb”,
“preLaunchTask”: “clang++ build active file”
}
]
}

参数解释:
program 表示你具体的想 Debug 的程序
其中 ${fileDirname} 表示程序所在的文件夹
${fileBasenameNoExtension} 表示想要 Debug的程序。不需要进行修改,对你想要运行的文件进行 Debug 就能够自动识别。
stopAtEntry 设置为 true 时,会让 debugger 在 main 函数处进行一次停顿。
preLaunchTask 的值要和 task.json 中 label 的值一致。
开始 Debug
回到 helloworld.cpp,这一步非常重要,因为 VSCode 会检测你当前哪个窗口处于活跃状态,并对其进行 **Debug。(活跃:你的界面中显示的窗口,并且有光标)

使用 F5 或从菜单栏中选择 Run(运行) > Start Debugging(启动调试)就能进行开始 Debug。

2020 年 iOS 移动开发*新发展趋势

就像不时出现的移动技术趋势一样,了解 iOS 移动开发趋势也有重大的意义。随着 iOS 应用程序总数接近 200 万大关,与*新的iOS应用程序开发趋势保持同步已成为社区的常态。

根据*新数据,大约有 400 万个应用程序可供用户使用。对于用户来说,这意味着他们几乎所有需求都能找到一系列应用程序。

从开发人员的角度来看,应用程序商店中的应用程序数量越多,他们越需要与*新动态保持同步。

我们的博客面向所有希望了解*新移动应用程序开发趋势的开发人员和所有 Apple 爱好者。

2020 年 iOS 移动应用程序的发展趋势

伴随着 iOS 应用程序开发的以下技术趋势,开发人员将很容易理解 iOS 应用程序的未来以及在未来几年内即将出现的技术。

1.增强的安全协议

安全协议仍然是移动应用程序的主要趋势。我们都知道 Apple 的安全算法。它以其核心安全层和不妥协的政策而著称,这些政策不会让任何人侵入 Apple 设备。但是,随着黑客攻击数量的空前增长,单个错误可能造成严重破坏。

Apple Inc. 全球行销高级副总裁 Phil Schiller 在*近的声明中说,

“(苹果公司)正在帮助保护我们的孩子免受可能用于侵犯其隐私和安全性的技术的侵害。”

这清楚地强调了需要加强和弥补苹果的漏洞;苹果已经发起了一种企业范围的文化,以迎合用户需求,以创建一个安全环境。它在提高整体安全性、防止网络攻击和数据泄露方面向前迈进了一步。

例如我们谈论的密码“自动填充”,Apple 已部署了 ASWebAuthentication Session,它可以协调 cookie 和网站数据以进行登录,与此同时,该设备可以使用身份验证服务框架来合并密码管理器应用程序。

2. Swift

iOS 应用趋势列表中的下一个是 Swift。它是 Apple 的官方语言,也是用于构建 iOS 应用程序的编程语言。它帮助许多 iOS 开发人员完成他们的梦想。

根据*新数据,在 Apple App Store 上有超过三十万个用 Swift 编写的应用程序。这种编程语言之所以如此火爆的原因在于其特性,例如可伸缩性,灵活性,安全性和效率。

在 Swift 的*新更新中,Apple 已于2019年4月19日发布了稳定的版本 5.0.1。Swift 5 为开发人员增加了更多动力,并将在更大程度上帮助应用程序开发。

在未来的日子里,我们可以期待功能更强大的 iOS 应用程序,它们将保证无缝的性能。

3. Apple HomeKit

Apple 的 HomeKit 对用户而言是一项特殊的产品,因为它提供了许多便利。HomeKit 借助应用程序帮助用户在家中进行通信以及控制连接的设备和附件。

Apple HomeKit 可以创建一个操作来帮助用户控制连接的设备,因为用户可以选择创建一个组来触发 Siri 语音命令。作为补充,不少公司正在努力开发可以集成到此类设备中的智能家居产品。

这项创新的产品将帮助开发人员创建可以连接到 Apple Homekit 的产品以及易于使用的应用程序。这将给家庭自动化带来革命性的变化,而物联网的元素将随着这些创新而增长。

Apple HomeKit 在移动应用程序中仍然是 iOS 的重要趋势

4.以物联网为中心的应用程序将更加突出

对于全世界的应用程序开发人员来说,物联网技术正变得越来越重要。物联网促进了连接。

而且,iOS 开发人员已经在开发可以连接到支持 Internet 的设备的应用程序。围绕物联网的讨论声并不新鲜。通过在应用程序中嵌入更好的连接功能,它已帮助开发人员为用户创造了卓越的产品。

%title插图%num

物联网的未来将非常重要。对于 iOS 开发人员来说,它是可以通过帮助终端用户更方便实现目标,并*终实现自我增值的重要元素。

例如,药品中的物联网可帮助专业人士开发温度监控应用程序,以检测某些过程(如所需)的温度是否未超过允许的限制。

5. Apple Pay 对用户更加友好

“用户友好”一词不仅是 iOS 应用程序开发人员的关键字,还是 Android 开发人员的关键字。从根本上说,这是一个令人鼓舞的问题,它正在激发全球的开发人员在为用户创建实用程序的同时进行创新。

在 iOS 生态系统中,这种用户友好性也将体现在 Apple Pay。那么,这种用户友好性实际上对用户意味着什么?让我们和我一起探讨细节。Apple Pay 可以使用户轻松进行金融交易。

使付款更容易意味着为用户提供更安全,更轻松和更可信赖的付款来源。而且,根据统计数据,Apple Pay 的增长令人瞩目,全球用户的交易量增长了 500%。

用户无需将其信用卡和借记卡详细信息存储在设备上。iPhone 中还嵌入的 NFC 或近场通信为用户完成了工作。

6. Core Machine Learning

对于 iOS 应用开发人员而言,Core Machine Learning 是专业人士的*佳工具。机器学习框架是由 Apple 提供的,并且对于与QuickType,Camera 或 Siri 相关的任务而言,已经证明了其出色的能力。

借助强大的库,Core ML 集成为 iOS 设备提供了通信功能事实证明,该技术在人脸检测方面也令人印象深刻。

Core ML 是特定于域的功能的基础。除了作为自然语言处理的基础之外,它还支持图像分析,当在设备上实施时,Core ML 的功能针对性能进行了优化。额外添加的用户数据的隐私提供了更高的安全性。

7.增强现实与 ARKIt

增强现实对于所有开发人员都很重要。但是,对于 iOS 开发人员而言,随着 iOS 11 的发布,重点已转移到 ARKit。ARKit 帮助开发人员为用户创建 3D 和基于虚拟的移动应用程序。值得一提的是,亚马逊与苹果联手,将 ARKit 的创新提升到一个新的水平,旨在为用户提供前所未有的体验。

在亚马逊的帮助下,Apple ARKit 对于用户而言将变得更加突出。从而鼓励企业将 AR 和 VR 的优点添加到其客户服务需求中,从而为客户提供令人印象深刻的服务。

在虚拟生态系统中查看事物是客户感知业务的新方式,苹果已经通过将 ARKit 集成到其应用程序开发技术中来做到这一点。

8. AI 和 Siri 的进步

AI 和 Siri 是我们 iOS 移动应用趋势中的*后一个。自从 Siri 集成到 Apple 设备以来,这家技术巨头就在世界范围内获得了广泛认可。个人助理的特性和功能给用户留下了深刻的印象。借助 Siri,人工智能的商机*大地促进了私人助理的工作。

%title插图%num

Loop Ventures 的一份报告称,Siri 给出正确答案的百分比为70%,并且由于相同的原因,与微软的 Cortana 和亚马逊的 Alexa 相比,许多行业专家都对 Siri 表示赞赏。

每个新的 iOS 版本,基于 AI 的助手都会变得更好,更先进。为了帮助开发人员,Apple 推出了 SiriKit,它有助于整合 Siri 的新功能。

iOS 将如何塑造未来?

这些是主导应用程序开发领域的*新应用程序趋势。随着 iOS 移动应用程序趋势的不断发展,我们可以期望越来越多的 iOS 应用程序引入更多先进的技术元素。

受 iOS 进展影响的另一件事是开发人员就业市场的需求增加。iOS 在工作前景中仅次于 Cloud(后端),而多于 Android 和 DBA(数据库管理员)。

%title插图%num

有趣的是,iOS 应用程序的总数少于 Android 应用程序的总数。尽管如此,对 iOS 开发人员的需求仍将超过对 Android 开发人员的需求。

展望未来,iOS 领域将进一步扩展,因此,我们有望看到一些突破性的技术进步。

iOS应用开发入门(1)——*个iOS应用

*近因为工作的原因,需要学习iOS应用开发。

本人现在在公司负责的是智能设备联网模块,所谓的智能设备联网,就是让一些智能设备(多半是没用屏幕的设备)连上wifi,因为没有屏幕,所以无法像手机和平板那样通过屏幕选择wifi和输入wifi密码,这个时候就需要手机来辅助,将手机上的wifi信息同步到智能设备上,同步传输的方式又很多,如声波联网、802.11数据帧联网、softAP、BLE联网等,这里就不过多介绍了,但是不管用什么方式,都需要在手机上开发一个应用,测试连接方式是否可行,本人学生时代有做过Android应用开发,但是因为那时候穷,没钱买iOS设备,所以没有搞iOS开发,现在有钱了,终于可以搞搞iOS应用开发了,当然,开发设备也不用自己买了,公司给配了台MacBook,开心,嘻嘻。

拿到Mac后,*反应就是陌生,的确有很多地方跟windows不一样,关闭菜单和*小化按钮都在窗口的左上角,日期时间什么的都在右上角,和ubuntu很相似,让我一个用惯windows做开发的程序员觉得很不习惯。

边百度边摸索,开始了我的iOS应用开发之旅。

首先是到App Store里下载Xcode

%title插图%num

%title插图%num

Mac很爽的地方就是编译器直接到App Store下就行了,下好了就安装,装完也不用配置什么,直接就能开发了,不像 windows上作android 开发一样,下完还要配jdk等各种东西,因为国内要*的原因,下载起来还特别麻烦。

打开xcode,创建一个新项目。

%title插图%num
名字就叫 hellow_iOS吧,配置信息和Android开发很类似,开发语言可以选择Objective-C或者swift,因为本人有c\c++基础,Objective-C和c\c++很类似,所以先选择Objective-C进行开发。

%title插图%num

新项目创建好之后进入到开发界面,白花花的一片叶不知道什么鬼,仔细一看好像能看懂,但是也说不出具体事什么,不管了,继续开发,先printf一个hellow world再说。

在ViewController.m中添加这段代码,表示添加一个textview

//定义一个textview
UITextView *textview1 = [[UITextView alloc]init ];

//位置
textview1.frame = CGRectMake(100,100,100,50);
//背景颜色
textview1.backgroundColor = [UIColor blueColor];
//设置它显示的内容
textview1.text = @”hellow_iOS”;
//将视图加到父视图中
[self.view addSubview:textview1];

%title插图%num

编译运行

%title插图%num
好了,这样就输出了一个显示hellow_iOS字段的textview在屏幕上了。

*个小demo完成了,嘻嘻

终于走出了万里长征的*步,这感觉,好怀念,好像回到了大学的时候,一个人深夜在寝室里摸索,*次把Android 小demo跑出来的时候。

加油,路还很长,长到你我都难以想象。

ios app开发学习流程(入门到精通)

一、xcode编译并运行app后,iphone模拟器已安装的app所在目录:

# 1. /Users/alpha/Library/Application Support/iPhone Simulator/5.1/Applications

# 2. 删除此目录下的app目录,即可清空模拟器里安装过的app

# 3. sqlite数据库文件一般在上面目录下的某个app目录下的Documents目录

二、xcode编译出来的app目录:

/Users/alpha/Library/Developer/Xcode/DerivedData

{ 熟悉UITableView使用 =>自定义UITableViewCell =>coredata数据库框架(sqlite本地存储) =>网络数据传输框架熟悉()}

1. 熟悉cocoa touch框架(MVC),弄清楚框架中哪个是作为model,哪个作为View,哪个作为Controller

appdelegate:是cocoa框架中,对应用程序生命周期的管理(app程序的启动和关闭,清理内存等操作),启动 viewController

viewController:即mvc中的控制器(控制view的显示,和实现ui控件的事件循环,接受button的按钮事件,并调用相应的处理函数【也即业务逻辑、数据库读取数据等】)

xib:mvc中的view(设计ui的资源文件)Xcode4以前的版本中使用xib文件来设计ui,当然xcode4以上的版本也可以使用xib,但是推荐用storyboard来设计界面(只有ios5以上支持)

storyboade: iOS5以上的版本支持使用此概念来设计ui(前提需要使用低耦合的mvc模式来设计)

(下面两个概念重要)

插座变量:(IBOutlet修饰的变量):此变量和 UI控件(如:UITextField)关联后,相当于是UI控件的操作指针,获取控件的值等操作。

@property( nonatomic, retain) IBOutlet UITextField *textField;

1. @property关键词告诉编译器把textField插座变量公开为属性。

2. nonatomic关键词指出不需要确保属性以thread安全的方式使用。

3. .m文件中,使用synthesize关键词告诉编译器为插座变量指定的getter和setter。

控件触发函数:(IBAction修饰的事件):用于关联 按钮 到 本函数,当UIButton的某个事件出发时,调用此函数,可以完成数据库操作等业务逻辑。

2.弄清楚了上述MVC结构,开始熟悉objective-c的语法,就可以上手开发app了。

3.xib设计ui的模式:(iOS5上已经过时)

a.创建一个工程

b.拖动viewController对象到IB设计器中

c.新建一个子类继承自UIViewController(xcode中自动生成.h .m两个文件)此控制器文件用于管理刚刚设计的view

d.viewController.h中定义插座变量和按钮的点击触发函数

e。ctrl按住,点击拖动想要关联的UI控件 到 File’s owner, 会弹出刚刚定义的插座变量和按钮的点击触发函数。

4.storyboard设计ui的开发模式:(iOS5以上版本才有此特性,目前开发都用这种)

a. 绘制并布局ui控件(这里有个插座变量的概念,用IBOutlet修饰,此变量可以通过拖线的方式和ui控件建立关系,然后controller代码中使用此插座变量就可以操作ui控件)

如:controller.h 中定义: @property (nonatomic,retain) IBOutlet UITextField *textField; 然后界面上绘制的UITextField控件和 textField变量建立关联,代码中操作textField变量即可操控UITextField控件了。

b. 当然这里红色的插座变量textField我是在controller.h代码中手写的,也可以打开storyboard后,按option+command+return打开controll.h窗口,使用拖动UITextField控件到controller.h中来自动生成上面的textField插座变量代码。//同理,button生成IBAction的点击事件函数也可以用拖动控件到controller.h中的方式来生成,并自动在controller.m中生成事件函数的原型代码。

5.接下来熟悉了上面的概念,其实ios开发设计,都是主要针对tableView的设计和各种viewController之间跳转(segue)

如何获取storyboard中tableView的对象我已经写了相应的文章。

下面的内容转自互联网:

Cocoa的MVC架构分析
Cocoa MVC Objective-C MacRuby OS
Cocoa是Mac OS和iPhone OS上的开发框架,使用Objective-C做为开发语言。当然,在代码中也可以嵌入C和C++的语句。初识Objective-C时会觉得它的语法很奇怪,但本质上和其他面向对象语言都差不多。具体语法大家可以参考相关文档。

在Cocoa框架中:

所有的控件、窗口等都继承自 UIView,对应MVC中的 V。UIView及其子类主要负责UI的实现,而UIView所产生的事件都可以采用委托的方式,交给UIViewController实现。对于不同的UIView,都有相应的UIViewController 对应MVC中的C。比如在iPhone OS上常用的UITableView,它所对应的Controller就是UITableViewController。至于MVC中的M,那需要根据用户自己的需求来实现了。

下面看一下一个自定义UIView的架构是怎么样的。这之前要认识一下Objective-C中的几个重要的关键字。

@interface 定义一个类,这个很容易和Java中的interface混淆。

@protocol 定义一个协议,我跟喜欢把它理解成一个接口,相当于Java中的interface。

Objective-C只支持单继承,但可以实现多个协议(接口),语法如下:

Objective-c代码
@interface Child : Parent <Protocol1,Protocol2>

{

//成员变量定义

}

//成员方法,类方法,属性定义

@end

有了以上的知识后,我们就可以来定义自己的UIView了。

首先是定义一个UIView的子类。

Objective-c代码
然后定义一个Protocol,按照Cocoa的习惯,一般它以delegate结尾,熟悉C#的同学应该知道它的意义。其实不论是接口,委托,还是回调函数,本质上都做了一件事情。就是定义了一个操作契约,然后由用户自己来实现它的具体内容。

Objective-c代码

完成以上两步之后就需要设计自己的UIViewController了。一般简单的做法,可以让这个Controller来实现上面定义的MyUIViewDelegate。在Cocoa框架中,很多控件和它的Controller都是采用的这种方式。

Java代码
: UIViewController <MyUIViewDelegate>
{
//成员变量
}

//成员方法,类方法,属性

@end

定义都完成了,到这里其实还看不出这三者是怎么联系起来的。那接下来就要看看,MyUIView和MyUIViewController的具体实现了。

首先是MyUIView的实现代码,假设在MyUIView在发生某个事件后会调用doSometing方法(按钮事件)

Objective-c代码
– (void)doSomething
{
if( delegate != nil ) //这里的delegate就是UIView定义时候的一个委托对象
{
[delegate func1]; //[]表示对一个对象发消息,如果在Java中会写成delegate.func1()
}
}

上面的代码中 nil 相当于 Java中的 null,这里的意思就很明显了,如果delegate委托对象不为空,则调用相应的方法,但是这个delegate委托对象的方法在哪里实现呢。可以看一下MyUIViewController的定义,它实现了MyUIViewDelegate。所以这个方法当然是由它来实现。代码如下

Objective-c代码
– (id)init
{
MyUIView *myView = [[MyUIView alloc] init]; //对MyUIView进行初始化
myView.delegate = self; //将MyUIViewController自己的实例作为委托对象
self.view = myView;
}

– (void)func1
{
//具体实现,可以加入Model相关的代码 ,界面上的button点击后,调用此函数来实现业务逻辑
}

这么一来整个,整个代码的线路就明白了。

1.MyUIViewController初始化(viewController控制view的展示,和定义ui点击事件的处理函数-(IBAction)onbuttonClick(id):sender;)

2.MyUIViewController初始化时初始化MyUIView,并且将自己作为委托对象赋值给MyUIView

3.MyUIView发生事件,调用(回调)委托对象的方法,其实就是调用MyUIViewController的方法。(界面点击事件,增加model相关代码)

 

iOS开发各种证书详解

引言

关于开发证书配置(Certificates & Identifiers & Provisioning Profiles),相信做iOS开发的同学没少被折腾。对于一个iOS开发小白、半吊子(比如像我自己)抑或老兵,或多或少会有或曾有过以下不详、疑问、疑惑甚至困惑:

  1. 什么是App ID?Explicit/Wildcard App ID有何区别?什么是App Group ID?
  2. 什么是证书(Certificate)?如何申请?有啥用?
  3. 什么是Key Pair(公钥/私钥)?有啥用?与证书有何关联?
  4. 什么是签名(Signature)?如何签名(CodeSign)?怎样校验(Verify)?
  5. 什么是(Team)Provisioning Profiles?有啥用?
  6. Xcode如何配置才能使用iOS真机进行开发调试?
  7. 多台机器如何共享开发者账号或证书?
  8. 遇到证书配置问题怎么办?
  9. Xcode 7免证书调试真机调试

 

本文将围绕相关概念做个系统的梳理串烧。
从 Xcode 7 开始支持普通 Apple 账号进行免证书真机调试,详情参考*新官方文档《Launching Your App on Devices》,或参考本文*后一节简介。

写在前面

1.假设你使用过Apple设备(iMac/iPad/iPhone)且 注册过Apple ID(Apple Account)。

2.假设你或你所在的开发组已加入苹果开发者计划(Enroll in iOS Developer Program to become a  member),即已 注册开发者账号(Apple Developer Account)。

  • 只有拥有开发者账号,才可以申请开发/发布证书及相关配置授权文件,进而在iOS真机上开发调试Apps或发布到App Store。
  • 开发者账号分为Individual和Company/Organization两种类型。如无特别交代,下文基于$99/Year的普通个人开发者(Individual)账号展开。

3.若要真机调试实践,你必须至少拥有一台装有Mac OS X/Xcode的Mac开发机(iMac or MacBook),其上自带原生的Keychain Access。

一.App ID(bundle identifier)

App ID即Product ID,用于标识一个或者一组App。
App ID应该和Xcode中的Bundle Identifier是一致(Explicit)的或匹配(Wildcard)的。
App ID字符串通常以 反域名(reverse-domain-name)格式的Company Identifier(Company ID)作为前缀(Prefix/Seed),一般不超过255个ASCII字符。
App ID全名会被追加Application Identifier Prefix(一般为TeamID.),分为两类:

  • Explicit App ID:唯一的App ID,用于唯一标识一个应用程序。例如“com.apple.garageband”这个App ID,用于标识Bundle Identifier为“com.apple.garageband”的App。
  • Wildcard App ID:含有通配符的App ID,用于标识一组应用程序。例如“*”(实际上是Application Identifier Prefix)表示所有应用程序;而“com.apple.*”可以表示Bundle Identifier以“com.apple.”开头(苹果公司)的所有应用程序。

用户可在Developer MemberCenter网站上注册(Register)或删除(Delete)已注册的App IDs。

App ID被配置到【XcodeTarget|Info|Bundle Identifier】下;对于Wildcard App ID,只要bundle identifier包含其作为Prefix/Seed即可。

二.设备(Device)

Device就是运行iOS系统用于开发调试App的设备。每台Apple设备使用 UDID来唯一标识。
iOS设备连接Mac后,可通过iTunes->Summary或者Xcode->Window->Devices获取iPhone的UDID(identifier)。
Apple Member Center网站个人账号下的 Devices中包含了注册过的所有可用于开发和测试的设备,普通个人开发账号每年累计*多只能注册 100个设备。

  • Apps signed by you or your team run only on designated development devices.
  • Apps run only on the test devices you specify.

用户可在网站上注册或启用/禁用(Enable/Disable)已注册的Device。

本文的Devices是指连接到Xcode被授权用于开发测试的iOS设备(iPhone/iPad)。

三.开发证书(Certificates)

1.证书的概念
证书是由公证处或认证机关开具的证明资格或权力的 证件,它是表明(或帮助断定)事理的一个 凭证。证件或凭证的尾部通常会烙印 公章
每个中国人一生可能需要70多个证件,含15种身份证明。证件中“必需的”有30到40个。将这些证件按时间顺序铺开,那就是一个天朝子民的一生——持 准生证许可落地,以户籍证明入籍,以身份证认证身份,持结婚证以合法同居,*终以 死亡证明注销。
2.数字证书的概念
数字证书就是互联网通讯中 标志通讯各方 身份信息的一串数字,提供了一种在Internet上验证通信 实体身份的方式,其作用类似于司机的驾驶执照或日常生活中的身份证。它是由一个由权威机构—— CA机构,又称为证书授权中心(Certificate Authority)发行的,人们可以在网上用它来识别对方的身份。

  • 数字证书是一个经证书授权中心数字签名的包含公开密钥拥有者信息以及公开密钥的文件。*简单的证书包含一个公开密钥、名称以及证书授权中心的数字签名。
  • 数字证书还有一个重要的特征就是时效性:只在特定的时间段内有效。

数字证书中的公开密钥(公钥)相当于公章。
某一认证领域内的根证书是CA认证中心给自己颁发的证书,是信任链的起始点。安装根证书意味着对这个CA认证中心的信任。
为了防止GFW进行中间人攻击(MitM),例如篡改github证书,导致无法访问github网站等问题,可选择不信任CNNIC:

  • 在[钥匙串-系统]中双击CNNIC ROOT,在【信任】|【使用此证书时】下拉选择【永不信任】
  • %title插图%num
  • 在天朝子民的一生中,户籍证明可理解为等效的根证书:有了户籍证明,才能办理身份证;有了上流的身份证,才能办理下游居住证、结婚证、计划生育证、驾驶执照等认证。
    3.iOS(开发)证书
    iOS证书是用来证明iOS App内容(executable code)的合法性和完整性的数字证书。对于想安装到真机或发布到AppStore的应用程序(App),只有经过签名验证(Signature Validated)才能确保来源可信,并且保证App内容是完整、未经篡改的。
    iOS证书分为两类:Development和Production(Distribution)。

    • Development证书用来开发和调试应用程序:A development certificate identifies you, as a team member, in a development provisioning profile that allows apps signed by you to launch on devices.
    • Production主要用来分发应用程序(根据证书种类有不同作用):A distribution certificate identifies your team or organization in a distribution provisioning profile and allows you to submit your app to the store. Only a team agent or an admin can create a distribution certificate.

    普通个人开发账号*多可注册iOS Development/Distribution证书各2个,用户可在网站上删除(Revoke)已注册的Certificate。
    下文主要针对iOS App开发调试过程中的开发证书(Certificate for Development)。
    4.iOS(开发)证书的根证书
    那么,iOS开发证书是谁颁发的呢?或者说我们是从哪个CA申请到用于Xcode开发调试App的证书呢?
    iOS以及Mac OS X系统(在安装Xcode时)将自动安装AppleWWDRCA.cer这个中间证书(Intermediate Certificates),它实际上就是iOS(开发)证书的证书,即根证书(Apple Root Certificate)。
    AppleWWDRCA(Apple Root CA)类似注册管理户籍的公安机关户政管理机构,AppleWWDRCA.cer之于iOS(开发)证书则好比户籍证之于身份证

    如果Mac Keychain Access证书助理在申请证书时尚未安装过该证书,请先下载安装(Signing requires that you have both the signing identity and the intermediate certificate installed in your keychain)。

    %title插图%num

  • 5.申请证书(CSR:Certificate Signing Request)
    可以在缺少证书时通过Xcode Fix Issue自动请求证书,这里通过Keychain证书助理从证书颁发机构请求证书:填写开发账号邮件和常用名称,勾选【存储到磁盘】。
  • %title插图%num

keychain将生成一个包含开发者身份信息的CSR(Certificate Signing Request)文件;同时,Keychain Access|Keys中将新增一对Public/Private Key Pair(This signing identity consists of a public-private key pair that Apple issues)。

%title插图%num

private key始终保存在Mac OS的Keychain Access中,用于签名(CodeSign)对外发布的App;public key一般随证书(随Provisioning Profile,随App)散布出去,对App签名进行校验认证。用户必须保护好本地Keychain中的private key,以防伪冒。

  • Keep a secure backup of your public-private key pair. If the private key is lost, you’ll have to create an entirely new identity to sign code.
  • Worse, if someone else has your private key, that person may be able to impersonate you.

在Apple开发网站上传该CSR文件来添加证书(Upload CSR file to generate your certificate):

%title插图%num

Apple证书颁发机构WWDRCA(Apple Worldwide Developer Relations Certification Authority)将使用private key对CSR中的public key和一些身份信息进行加密签名生成数字证书(ios_development.cer)并记录在案(Apple Member Center)。

%title插图%num

从Apple Member Center网站下载证书到Mac上双击即可安装(当然也可在Xcode中添加开发账号自动同步证书和[生成]配置文件)。证书安装成功后,在KeychainAccess|Keys中展开创建CSR时生成的Key Pair中的私钥前面的箭头,可以查看到包含其对应公钥的证书(Your requested certificate will be the public half of the key pair.);在Keychain Access|Certificates中展开安装的证书(ios_development.cer)前面的箭头,可以看到其对应的私钥。

%title插图%num

 

%title插图%num

Certificate被配置到【Xcode Target|Build Settings|Code Signing|Code Signing Identity】下,下拉选择Identities from Profile “…”(一般先配置Provisioning Profile)。以下是Xcode配置示例:

%title插图%num

 

四.供应配置文件(Provisioning Profiles)

1.Provisioning Profile的概念
Provisioning Profile文件包含了上述的所有内容: 证书、App ID和设备

%title插图%num

一个Provisioning Profile对应一个Explicit App ID或Wildcard App ID(一组相同Prefix/Seed的App IDs)。在网站上手动创建一个Provisioning Profile时,需要依次指定App ID(单选)、证书(Certificates,可多选)和设备(Devices,可多选)。用户可在网站上删除(Delete)已注册的Provisioning Profiles。
Provisioning Profile决定Xcode用哪个证书(公钥)/私钥组合(Key Pair/Signing Identity)来签署应用程序(Signing Product),将在应用程序打包时嵌入到.ipa包里。安装应用程序时,Provisioning Profile文件被拷贝到iOS设备中,运行该iOS App的设备也通过它来认证安装的程序。
如果要打包或者在真机上运行一个APP,一般要经历以下三步:

  • 首先,需要指明它的App ID,并且验证Bundle ID是否与其一致;
  • 其次,需要证书对应的私钥来进行签名,用于标识这个APP是合法、安全、完整的;
  • 然后,如果是真机调试,需要确认这台设备是否授权运行该APP。

Provisioning Profile把这些信息全部打包在一起,方便我们在调试和发布程序打包时使用。这样,只要在不同的情况下选择不同的Provisioning Profile文件就可以了。
Provisioning Profile也分为Development和Distribution两类,有效期同Certificate一样。Distribution版本的ProvisioningProfile主要用于提交App Store审核,其中不指定开发测试的Devices(0,unlimited)。App ID为Wildcard App ID(*)。App Store审核通过上架后,允许所有iOS设备(Deployment Target)上安装运行该App。
Xcode将全部供应配置文件(包括用户手动下载安装的和Xcode自动创建的Team Provisioning Profile)放在目录~/Library/MobileDevice/Provisioning Profiles下。
2.Provisioning Profile的构成
以下为典型供应配置文件*.mobileprovision的构成简析

(1) Name:该mobileprovision的文件名。

(2) UUID:该mobileprovision文件的真实文件名。

(3) TeamName:Apple ID账号名。

(4) TeamIdentifier:Team Identity。

(5) AppIDName:explicit/wildcard App ID name(ApplicationIdentifierPrefix)。

(6) ApplicationIdentifierPrefix:完整App ID的前缀(TeamIdentifier.*)。

(7) DeveloperCertificates:包含了可以为使用该配置文件应用签名的所有证书<data><array>。

证书是基于Base64编码,符合PEM(PrivacyEnhanced Mail, RFC 1848)格式的,可使用OpenSSL来处理(opensslx509 -text -in file.pem)。

从DeveloperCertificates提取<data></data>之间的内容到文件cert.cer(cert.perm):

—–BEGIN CERTIFICATE—–

将<data></data>之间的内容拷贝至此

—–END CERTIFICATE—–`

Mac下右键QuickLook查看cert.cer(cert.perm),在Keychain Access中右键Get Info查看对应证书ios_development.cer,正常情况(公私钥KeyPair配对)应吻合;Windows下没有足够信息(WWDRCA.cer),无法验证该证书。
如果你用了一个不在这个列表中的证书进行签名,无论这个证书是否有效,这个应用都将CodeSign Fail。

(8) Entitlements键<key>对应的<dict>:

keychain-access-groups:$(AppIdentifierPrefix),参见 Code Signing Entitlements(*.entitlements)。

每个应用程序都有一个可以用于安全保存一些如密码、认证等信息的 keychain,一般而言自己的程序只能访问自己的keychain。通过对应用签名时的一些设置,还可以利用keychain的方式实现同一开发者签证(就是相同bundle seed)下的不同应用之间共享信息的操作。比如你有一个开发者帐户,并开发了两个不同的应用A和B,然后通过对A和B的keychain access group这个东西指定共用的访问分组,就可以实现共享此keychain中的内容。

application-identifier:带前缀的全名,例如$(AppIdentifierPrefix)com.apple.garageband。

com.apple.security.application-groups:App Group ID(group. com.apple),参见 Code Signing Entitlements(*.entitlements)。

com.apple.developer.team-identifier:同Team Identifier。

(9) ProvisionedDevices:该mobileprovision授权的开发设备的UDID <array>。
Provisioning Profile 被配置到【XcodeTarget|Build Settings|Code Signing|Provisioning Profile】下,然后在Code Signing Identity下拉可选择Identities from Profile “…”(即Provisioning Profile中包含的Certificates)。

五.开发组供应配置文件(Team Provisioning Profiles)

1.Team Provisioning Profile的概念
每个Apple开发者账号都对应一个唯一的 Team ID,Xcode3.2.3预发布版本中加入了Team Provisioning Profile这项新功能。
在Xcode中添加Apple Developer Account时,它将与Apple Member Center后台勾兑 自动生成iOS Team Provisioning Profile(Managed by Xcode)。

%title插图%num

Team Provisioning Profile包含一个为Xcode iOS Wildcard App ID(*)生成的iOS Team Provisioning Profile:*(匹配所有应用程序),账户里所有的Development Certificates和Devices都可以使用它在这个team注册的所有设备上调试所有的应用程序(不管bundle identifier是什么)。同时,它还会为开发者自己创建的Wildcard/Explicit App IDs创建对应的iOS Team Provisioning Profile。

%title插图%num

2.Team Provisioning Profile生成/更新时机

  • Add an Apple ID account to Xcode
  • Fix issue “No Provisioning Profiles with a valid signing identity” in Xcode
  • Assign Your App to a Team in Xcode project settings of General|Identity
  • Register new device on the apple development website or Xcode detected new device connected

利用Xcode生成和管理的iOS Team Provisioning Profile来进行开发非常方便,可以不需要上网站手动生成下载Provisioning Profile。
Team Provisioning Profile同Provisioning Profile,只不过是由Xcode自动生成的,也被配置到【XcodeTarget|Build Settings|Code Signing|Provisioning Profile】下。

六.App Group (ID)

1.App Group的概念
WWDC14除了发布了OS X v10.10和switf外,iOS 8.0也开始变得更加开放了。说到开放,当然要数应用扩展( App Extension)了。顾名思义,应用扩展允许开发者扩展应用的自定义功能和内容,能够让用户在使用其他应用程序时使用该项功能,从而实现各个应用程序间的功能和资源共享。可以将扩展理解为一个轻量级(nimble and lightweight)的分身。
扩展和其Containing App各自拥有自己的沙盒,虽然扩展以插件形式内嵌在Containing App中,但是它们是独立的二进制包,不可以互访彼此的沙盒。为了实现Containing App与扩展的数据共享,苹果在iOS 8中引入了一个新的概念——App Group,它主要用于同一Group下的APP实现数据共享,具体来说是通过以App Group ID标识的共享资源区——App Group Container。
App Group ID同App ID一样,一般不超过255个ASCII字符。用户可在网站上编辑Explicit App IDs的App Group Assignment;可以删除(Delete)已注册的AppGroup (ID)。
2.App Group的配置
Containing App与Extension的Explicit App ID必须Assign到同一App Group下才能实现数据共享,并且Containing App与Extension的App ID命名必须符合规范:

  1. 置于同一App Group下的App IDs必须是唯一的(Explicit,not Wildcard)
  2. Extension App ID以Containing App ID为Prefix/Seed

假如Garageband这个App ID为“com.apple.garageband”,则支持从语音备忘录导入到Garageband应用的插件的App ID可能形如“com.apple.garageband.extImportRecording”。

App(ex)
App Group IDProvisioning ProfileCode Signing Identity
(Certificate Key Pair)App ID
(bundle identifier)Devices
(test)GarageBand置于同一分组:
group.com.apple(1)共用同一证书:ios_development.cer
(2)共用证书Key Pair中的Private Key进行CodeSigncom.apple.garageband授权开发测试设备的UDIDsGarageBand扩展插件com.apple.garageband.extImportRecording
关于Provisioning Profile,可以使用自己手动生成的,也可以使用Xcode自动生成的Team Provisioning Profile。

App Group会被配置到【Xcode Target|Build Settings|Code Signing|Code Signing Entitlements】文件(*.entitlements)的键com.apple.security.application-groups下,不影响Provisioning Profile生成流程。

七.证书与签名(Certificate& Signature)

1.Code Signing Identity

%title插图%num

 

%title插图%num

Xcode中配置的Code Signing Identity(entitlements、certificate)必须与Provisioning Profile匹配,并且配置的Certificate必须在本机Keychain Access中存在对应Public/Private Key Pair,否则编译会报错。
Xcode所在的Mac设备(系统)使用CA证书(WWDRCA.cer)来判断Code Signing Identity中Certificate的合法性:

  • 若用WWDRCA公钥能成功解密出证书并得到公钥(Public Key)和内容摘要(Signature),证明此证书确乃AppleWWDRCA发布,即证书来源可信;
  • 再对证书本身使用哈希算法计算摘要,若与上一步得到的摘要一致,则证明此证书未被篡改过,即证书完整。

2.Code Signing
每个证书(其实是公钥)对应Key Pair中的私钥会被用来对内容(executable code,resources such as images and nib files aren’t signed)进行数字签名(CodeSign)——使用哈希算法生成内容摘要(digest)。
Xcode使用指定证书配套的私钥进行签名时需要授权,选择【始终允许】后,以后使用该私钥进行签名便不会再弹出授权确认窗口。

%title插图%num

3.Verify Code Signature with Certificate
上面已经提到,公钥被包含在数字证书里,数字证书又被包含在描述文件(Provisioning File)中,描述文件在应用被安装的时候会被拷贝到iOS设备中。
*步,App在Mac/iOS真机上启动时,需要对配置的bundle ID、entitlements和certificate与Provisioning Profile进行匹配校验:
%title插图%num

第二步,iOS/Mac真机上的ios_development.cer被AppleWWDRCA.cer中的 public key解密校验合法后,获取每个开发证书中可信任的公钥对App的可靠性和完整性进行校验。
iOS/Mac设备(系统)使用App Provisioning Profile(Code Signing Identity)中的开发证书来判断App的合法性:

  • 若用证书公钥能成功解密出App(executable code)的内容摘要(Signature),证明此App确乃认证开发者发布,即来源可信;
  • 再对App(executable code)本身使用哈希算法计算摘要,若与上一步得到的摘要一致,则证明此App(executable code)未被篡改过,即内容完整。

小结:

  • 基于Provisioning Profile校验了CodeSign的一致性;
  • 基于Certificate校验App的可靠性和完整性;
  • 启动时,真机的device ID(UUID)必须在Provisioning Profile的ProvisionedDevices授权之列。

 

八.在多台机器上共享开发账户/证书

1.Xcode导出开发者账号(*.developerprofile)或 PKCS12文件(*.p12)
进入Xcode Preferences|Accounts:

  • 选中Apple IDs列表中对应Account的的Email,点击+-之后的☸|Export Accounts,可导出包含account/code signing identity/provisioning profiles信息的*.developerprofile(Exporting a Developer Profile)文件供其他机器上的Xcode开发使用(Import该Account)。

选中右下列表中某行Account Name条目|ViewDetails,可以查看Signing Identities和Provisioning Profiles。

  • 选中欲导出的Signing Identity条目,点击栏底+之后的☸|Export,必须输入密码,并需授权export key “privateKey” from keychain,将导出Certificates.p12。

点击左下角的刷新按钮可从Member Center同步该账号下所有的Provisioning Profile到本地。
选中右击列表中某个Provisioning Profile可以【Show in Finder】到[~/Library/MobileDevice/Provisioning\ Profiles]目录,其中Provisioning Profile的真实名称为$(UUID).mobileprovision,名如”2488109f-ff65-442e-9774-fd50bd6bc827.mobileprovision”,其中<key>Name</key>中为Xcode中看到的描述性别名。

2.Keychain Access导出PKCS12文件(*.p12)
在Keychain Access|Certificates中选中欲导出的certificate或其下private key,右键Export或者通过菜单File|Export Items导出Certificates.p12——PKCS12 file holds the private key and certificate。

其他Mac机器上双击Certificates.p12(如有密码需输入密码)即可安装该共享证书。有了共享证书之后,在开发者网站上将欲调试的iOS设备注册到该开发者账号名下,并下载对应证书授权了iOS调试设备的Provisioning Profile文件,方可在iOS真机设备上开发调试。

九.证书配置常见错误

1.no such provisioning profile was found
Xcode Target|Genera|Identity Team下提示”Your build settings specify a provisioning profile with the UUID “xxx”,howerver, no such provisioning profile was found.”
Xcode Target|BuildSettings|Code Signing|当前配置的指定UDID的provisioning profile在本地不存在,此时需要更改Provisioning Profile。必要时手动去网站下载或重新生成Provisioning Profile或直接在Xcode中Fix issue予以解决(可能自动生成iOS Team ProvisioningProfile)!
2.No identities from profile
Build Settings|CodeSigning的Provisioning Profile中选择了本地安装的provisioning profile之后,Code Signing Identity中下拉提示 No identities from profile “…”or No identities from keychain.
Xcode配置指定UDID的provisioning profile中的DeveloperCertificates在本地KeyChain中不存在( No identities are available)或不一致(KeyPair中的Private Key丢失),此时需去网站检查ProvisioningProfile中的App ID-Certificate-Device配置是否正确。如果是别人提供的共享账号(*.developerprofile)或共享证书(*.p12),请确保导出了对应Key Pair中的Private Key。必要时也直接在Xcode中Fix issue予以解决(可能自动生成iOS Team ProvisioningProfile)。
3.Code Signing Entitlements file do not match profile
” Invalid application-identifier Entitlement” or “Code Signing Entitlements file do not match those specified in your provisioning profile.(0xE8008016).”
(1)检查对应版本(Debug)指定的*.entitlements文件中的“Keychain Access Groups”键值是否与ProvisioningProfile中的Entitlements项相吻合(后者一般为前者的Prefix/Seed)。
(2)也可以将Build Settings|Code Signing的Provisioning Profile中对应版本(Debug)的Entitlements置空。
4.Xcode配置反应有时候不那么及时,可刷新、重置相关配置项开关(若有)或重启Xcode试试。

十. Xcode7 免证书真机调试

在 Xcode 7 中,苹果改变了自己在许可权限上的策略:

  1. 此前 Xcode 只开放给注册开发者下载,现在 Xcode 7 改变了这种惯有的做法,无需注册开发者账号,仅使用普通的Apple ID就能下载和上手体验。
  2. 此前开发者需每年支付99美元的费用成为注册开发者才能在 iPhone/iPad 真机上运行调试APP,苹果新的开发者计划则放宽要求,无需购买,只要你感兴趣同样可以在设备上测试app。——Developers would be able to test apps on devices without a paid Apple developer account in Xcode 7.

所谓“免证书”真机调试,并不是真的不需要证书,Xcode真机调试原有的证书配置体系仍在——All iOS, tvOS, and watchOS appsmust be code signed and provisioned to launch on a device. 所以,上文啰嗦几千字还是有点用的。
自 Xcode7 开始,原来基于付费开发者账号及自助生成证书及配置文件的繁琐过程被苹果简化,Xcode将针对任何普通账号自动为联调真机生成所需相关的证书及配置文件。当你打算向 App Store 提交发布应用,才需要付费。
*步:进入 Xcode Preferences|Accounts,添加自己的 Apple ID 账号。
第二步:Build Settings|Code Signing 下的 Provisioning Profile 选择 Automatic,Code Signing Identity 选择 Automatic 下的iOS Developer

第三步:General 配置 Bundle identifier,Team 下拉选择苹果Member Center自动为你的账号生成的Personal Team ID。
自己的账号在调试公司或其他第三方APP代码时,若填写 Bundle identifier 为他人账号注册的 APP ID(例如苹果相机应用 com.apple.camera),会报错:
No provisioning profiles with a valid signing identity (i.e. certificate and private key pair) matching the bundle identifier “com.apple.camera” were found.
即使编译通过了,可能运行时APP自身与服务器校验也可能会报签名错误,肿么办???
Her skill:此时,可以在他人原有App ID基础上添加后缀(例如com.apple.camera.extension),配置成应用的衍生插件(相当于置于同一 App Group 下)就可以快乐的玩耍了。
如果启动APP时,Xcode报错“process launch failed: Security”或iPhone报错【不受信任的开发者】,此时需要到iPhone通用配置中的描述文件(*新系统中可能叫设备管理)中,在描述文件(开发商应用)中选择对应的描述文件(你的Apple ID)点击 信任 或 验证 即可。

Windows上也可以开发 iOS App了

终于可以在Windows 上开发 iOS App了哦!!!因为Windows 自带了一个 iOS模拟器。你不再需要一个真机,因为你可以本地操作进行调试了。在Visual Studio里面你可以直接用拖拽的方式来编辑和设计iOS App的用户界面,还有 Android 界面设计,也是在Visual Studio中直接搞定。C Sharp 可以在 Windows 平台上完整的编译 Android 和 iOS 应用