1)要发布iOS应用程序到App Store首先需要一个iOS developer帐号,账号是收费的(注册Developer账户这里就不介绍了)。
2)当然是将App程序开发好了,并且已经在模拟器(Simulator)中做了全面的测试。
2.准备工作做好之后,就可以发布应用到App Store了,应用发布概括起来需要以下几个步骤:1). 注册App ID,在Xcode中指定Bundle Identifier
2). 创建发布证书(Distribution Certificate)
3). 创建Distribution Provisioning Profile
4). 用Distribution Profile为应用签名
5). 打包App
6). 在iTunes Connect上传App
以上大部分的操作是在Provisioning Portal、XCode、Keychain Access工具和iTunes Connect中完成的。
上传App必须在Xcode软件里执行(也就是要有MacAir, MacMini等运行Moc OS X Mountain等10.x的系统)。
其他操作都可以在普通浏览器里完成。
1).发布iOS应用程序到App Store - 创建App ID首先给iOS应用程序申请一个App ID,它是你的应用程序的唯一标识。登录iOS Developer网站,点击右侧的iOS Provisioning Portal链接,选择App ID。
选择创建新app ID。在Description中输入应用的描述信息。Bundle Identifier是指应用的代码标识,你可以用公司名.应用名来标识,例如:com.company.demoapp。
然后打开X-Code,选择Target > Summary。在Identifier输入框中输入上面注册的Bundle Identifier。
2).发布iOS应用程序到App Store - 创建Distribution CertificateiOS应用都有一个安全证书用于验证开发者身份和签名。在Provisioning Portal的Distribution栏目下有详细介绍,但总体可以归纳为以下步骤。
1. 打开Keychain Access,在Preferences中关闭OCSP和CRL。
2. 点击Keychain Access菜单,选择Certificate Assistant > Request Certificate from Authority。
3. 输入Email地址,选择Saved to Disk和Let me specify key pair information。点击Continue继续。
4. 选择key size of 2048 bits和RSA algorithm,点击Continue继续。
5. 然后会在桌面上生成一个.CSR的文件。
6. 然后进入Provisioning Portal,选择Certificates -> Distribution -> Add Certificate,添加刚才创建的.CSR签名文件。
7. 在等待审核的时候下载并安装WWDR intermediate certificate。
8. 刷新页面,然后就可以下载证书了。下载后安装。
9. 最后一步,打开Keychain Access。选中刚才安装的private key,选择菜单中的Export Item将私钥导出。将导出的私钥备份到一个安全的地方,以便以后重装了系统可以还原。
3).发布iOS应用程序到App Store - 创建Distribution Provisioning Profile打开Provisioning Portal,选择Provisioning -> Distribution,选择添加一个新的profile。Distribution Method要选择App Store,App ID需要输入在前面申请的App ID。提交后需要等一会儿再刷新这个页面。然后就可以下载和安装profile了。安装后profile会被添加到XCode。
4).发布iOS应用程序到App Store - 检查签名和生成设置打开XCode,在Build Settings中选择Code Signing。在Release设置上选择刚才申请的Distribution Profile。
选择生成目标为iOS device,然后点击Archiving开始打包应用。 打包之后,在Organizer中就可以看到打包的程序,点击”Validate“进行验证,验证通过之后,就可以点击”Submit“提交了,这个要耐心等待上传程序了,我等等待几个小时了,还在等待中。。。
这里类似于登陆功能的实现,是基于UDP实现的,而聊天的内容,是基于TCP实现的,大概流程是:
建立一个服务端:
下面是UDP开启服务器返回给客户端的确定值:
public void ServerReceive(){
if(serversocket == null){
try {
serversocket = new DatagramSocket(PORT);
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try {
byte data[] = new byte[1024];
packet= new DatagramPacket(data , data.length);
System.out.println("aaaaaaaaaaaaaaaa");
serversocket.receive(packet);
if(packet != null){
login = new String(packet.getData() , packet.getOffset() , packet.getLength());
address = packet.getAddress().toString();
System.out.println(address);
if(packetAddress.size()>0){
for(int i=0;i<packetAddress.size();i++){
if(address.equals(packetAddress.get(i)) == true){
position = i;
}
}
}
if(login.equals("Quit") == true){
packetAddress.remove(position);
}else{
if(position != -1){
}else{
packetAddress.add(address);
}
}
}
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void ServerSend(){
if(UDPsocket == null){
try {
UDPsocket = new DatagramSocket();
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(("Quit").equals(login) != true){
try {
InetAddress serverAddress = InetAddress.getByName(address.substring(1));
byte data1[] = login.getBytes();
DatagramPacket pack = new DatagramPacket (data1 , data1.length , serverAddress , PORT);
UDPsocket.send(pack);
System.out.println("send over"+ login);
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
客户端:
public void SendToServer(String str,int port,String Address){
try {
InetAddress serverAddress = InetAddress.getByName(Address);
//System.out.println("aaaaaaaaaa"+socket);
if(socket == null){
System.out.println("xxxxxxxxx"+socket);
socket = new DatagramSocket();
}
byte data[] = str.getBytes();
DatagramPacket packet = new DatagramPacket (data , data.length,serverAddress,port);
System.out.println(packet);
socket.send(packet);
socket.close();
socket = null;
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
class ClientSendThread extends Thread{
public void run(){
SendToServer("Login",PORT,"255.255.255.255");
if(Receivesocket == null){
try {
Receivesocket = new DatagramSocket(PORT);
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
while(isUDP){
try {
byte data[] = new byte[1024];
DatagramPacket pack = new DatagramPacket(data , data.length);
System.out.println("aaaaaaaaaaa");
Receivesocket.receive(pack);
ServiceAddress = pack.getAddress().toString();
String login = new String(pack.getData() , pack.getOffset() , pack.getLength());
System.out.println(login + "----------" + ServiceAddress);
Message msg = new Message();
msg.what = 0;
Bundle b = new Bundle();
b.putString("TAG", login);
msg.setData(b);
MainActivity.this.handle.sendMessage(msg);
}catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
简单的登陆功能就实现了,利用上一张说的TCP的实现,进行内容的传递,即可聊天
作者:Younger Liu,
本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 未本地化版本许可协议进行许可。
EMMC与RAND的区别
说到两者的区别,必须从flash的发展历程说起,因为两者都属于flash的范畴。
1. Flash发展历程 1.1 NOR Flash和NAND Flash
NOR Flash和NAND Flash,两者均为非易失性闪存模块。
1988年,Intel首次发出NOR flash技术,彻底改变了原先由EPROM和EEPROM一统天下的局面。NOR类似于DRAM, 以存储程序代码为主,可以让微处理器直接读取。因为读取速度较快,但晶片容量较低,所以多应用在通讯产品中,如手机。
1989,东芝公司发表NAND flash结构,强调降低每比特的成本,更高的性能,并且像磁盘一样可以通过接口轻松升级。因为NAND flash的晶片容量相对于NOR flash大,更像硬盘,写入与清除资料的速度远快于NOR。目前已广泛应用在各种存储设备上, 可存储代码和资料。
1.2 NAND Flash发展
NAND Flash的存储单元发展:从SLC, MLC到TLC。
SLC:Single-Level Cell, 即1bit/cell,读写速度快,寿命长,价格是MLC三倍以上,约10万次读写寿命。
MLC:Multi-Level Cell, 即2bit/cell ,速度一般,寿命一般,价格一般,约3000-10000次读写寿命。
TLC = Triple-Level Cell, 即3bit/cell,速度慢,寿命短,价格便宜,约500次读写寿命,技术在逐渐成长中。
NAND Flash的存储单元从最初的SLC( Single Layer Cell), 到2003年开始兴起MLC (Multi-Layer Cell), 发展至今,SLC已经淡出主流市场,主流存储单元正在从MLC向TLC(Triple Layer Cell)迈进。纳米制程工艺和存储单元的发展,使得同样大小的芯片有更高密度和更多的存储单元,Flash得以在容量迅速增加的同时,还大幅降低了单位存储容量的成本。
但其弊端也轻易显现,从原来的1bit/cell发展到后来3bit/cell, 计算更为复杂,出错率不免更高,读写次数和寿命也会更短。在这种情况下现有MLC 和 TLC Flash 都需要搭配一颗高性能的控制芯片来提供EDC和ECC、平均擦写等Flash管理。
1.3 EMMC的出现
移动设备行业的迅猛发展,引发了电子产品更新换代,对存储硬件提出了更高的要求。多媒体播放、高清摄像,GPS,各色各样的应用以及外观轻薄小巧的发展趋势,要求存储硬件拥有高容量、高稳定性和高读写速度的同时,需要存储芯片在主板中占有更小的空间。然而NAND Flash 随着纳米制程和存储技术的主流趋势发展,性能却在不断下降。可擦写寿命短,出错概率高,读写速度慢,稳定性差。
嵌入式存储芯片eMMC就可以弥补这个市场需求和NAND Flash发展的缺口。
eMMC ( Embedded Multi Media Card) 采用统一的MMC标准接口, 把高密度NAND Flash以及MMC Controller封装在一颗BGA芯片中。针对Flash的特性,产品内部已经包含了Flash管理技术,包括错误探测和纠正,flash平均擦写,坏块管理,掉电保护等技术。用户无需担心产品内部flash晶圆制程和工艺的变化。同时eMMC单颗芯片为主板内部节省更多的空间。
2. 两者分析 2.1 Nand Flash
Nand-flash内存是flash内存的一种,其内部采用非线性宏单元模式,为固态大容量内存的实现提供了廉价有效的。
Nand-flash存储器具有容量较大,改写速度快等优点,适用于大量数据的存储,因而在业界得到了越来越广泛的应用。
2.2 EMMC
eMMC (Embedded Multi Media Card) 为MMC协会所订立的、主要是针对手机产品为主的内嵌式存储器标准规格。
eMMC的一个明显优势是在封装中集成了一个控制器,它提供标准接口并管理闪存,使得手机厂商就能专注于产品开发的其它部分,并缩短向市场推出产品的时间。
其优点如下:
1.简化手机存储器的设计:eMMC目前是最流行的移动设备本地存储,目的在于简化手机存储器的设计。
3.加速产品研发速度,降低了移动设备上市周期和研发成本:eMMC的设计概念——简化手机内存储器的使用,将NAND Flash芯片和控制芯片设计成1颗MCP芯片,移动设备开发商只需要采购eMMC芯片,放进新手机中,不需处理其它繁复的NAND Flash兼容性和管理问题,最大优点是缩短新产品的上市周期和研发成本,加速产品的推陈出新速度
3. 参考资料
http://baike.baidu.com/view/3509283.htm
http://baike.baidu.com/view/3064158.htm
http://baike.baidu.com/subview/64506/5136742.htm?fromId=3233929
作者:Younger Liu,
本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 未本地化版本许可协议进行许可。