当前位置:  编程技术>移动开发
本页文章导读:
    ▪JKS、BKS、PKCS12证件之间转换        JKS、BKS、PKCS12证书之间转换 常用的证书库: JKS和JCEKS是Java密钥库(KeyStore)的两种比较常见类型,JKS的Provider是SUN,在每个版本的JDK中都有,JCEKS的Provider是SUNJCE,1.4后我们都能够直接使用它。 J.........
    ▪ MSP430学习札记        MSP430学习笔记 1、  IAR程序下载方式:串口下载 2、  复位向量地址:0FFFEH。地址中存放的是程序段的开始地址 3、  程序下载和在线调试电源可通过计算机的jatg口提供,无需加电源   4、  .........
    ▪ (转)苹果运用商店审核指南中文翻译       (转)苹果应用商店审核指南中文翻译 前言我们希望帮助您加入 这个成功的组织。这是我们首次发布《应用程序商店评估指导》(App Store Review Guidelines)。通过它,我们希望帮助您解决.........

[1]JKS、BKS、PKCS12证件之间转换
    来源: 互联网  发布时间: 2014-02-18
JKS、BKS、PKCS12证书之间转换

常用的证书库:
JKS和JCEKS是Java密钥库(KeyStore)的两种比较常见类型,JKS的Provider是SUN,在每个版本的JDK中都有,JCEKS的Provider是SUNJCE,1.4后我们都能够直接使用它。
JCEKS在安全级别上要比JKS强,使用的Provider是JCEKS(推荐),尤其在保护KeyStore中的私钥上(使用TripleDES)
PKCS#12(PFX)是公钥加密标准,它规定了可包含所有私钥、公钥和证书。其以二进制格式存储,在windows中可以直接导入到密钥区,注意,PKCS#12的密钥库保护密码同时也用于保护Key。
BKS来自BouncyCastleProvider,它使用的也是TripleDES来保护密钥库中的Key,它能够防止证书库被不小心修改(Keystore的keyentry改掉1个bit都会产生错误),BKS能够跟JKS互操作。
UBER比较特别,当密码是通过命令行提供的时候,它只能跟keytool交互。整个keystore是通过PBE/SHA1/Twofish加密,因此keystore能够防止被误改、察看以及校验。SunJDK允许你在不提供密码的情况下直接加载一个Keystore,类似cacerts,UBER不允许这种情况。

/**
     * PFX证书转换为JKS(Java Key Store)
     * 
     * @param pfxPassword
     *            PFX证书密码
     * @param pfxFilePath
     *            PFX证书路径
     * @param jksPassword
     *            JKS证书密码
     * @param jksFilePath
     *            JKS证书路径
     */ 
    public static void covertPFXtoJKS(String pfxPassword, String pfxFilePath, String jksPassword, String jksFilePath) 
    { 
        FileInputStream fis = null; 
        FileOutputStream out = null; 
        try 
        { 
            // 加载PFX证书 
            KeyStore inputKeyStore = KeyStore.getInstance("PKCS12"); 
            fis = new FileInputStream(pfxFilePath); 
            char[] inPassword = pfxPassword == null ? null : pfxPassword.toCharArray(); 
            char[] outPassword = jksPassword == null ? null : jksPassword.toCharArray(); 
            inputKeyStore.load(fis, inPassword); 
 
            KeyStore outputKeyStore = KeyStore.getInstance("JKS"); 
            outputKeyStore.load(null, outPassword); 
            Enumeration<String> enums = inputKeyStore.aliases(); 
            while (enums.hasMoreElements()) 
            { 
                String keyAlias = enums.nextElement(); 
                if (inputKeyStore.isKeyEntry(keyAlias)) 
                { 
                    Key key = inputKeyStore.getKey(keyAlias, inPassword); 
                    Certificate[] certChain = (Certificate[]) inputKeyStore.getCertificateChain(keyAlias); 
                    outputKeyStore.setKeyEntry(keyAlias, key, pfxPassword.toCharArray(), (java.security.cert.Certificate[]) certChain); 
                } 
            } 
            out = new FileOutputStream(jksFilePath); 
            outputKeyStore.store(out, outPassword); 
        } catch (Exception e) 
        { 
            e.printStackTrace(); 
        } finally 
        { 
            try 
            { 
                if (fis != null) 
                { 
                    fis.close(); 
                } 
                if (out != null) 
                { 
                    out.close(); 
                } 
            } catch (Exception e) 
            { 
                e.printStackTrace(); 
            } 
        } 
    } 
   
/**
     * 从JKS格式转换为PKCS12格式
     * 
     * @param jksFilePath
     *            String JKS格式证书库路径
     * @param jksPasswd
     *            String JKS格式证书库密码
     * @param pfxFilePath
     *            String PKCS12格式证书库保存文件夹
     * @param pfxPasswd
     *            String PKCS12格式证书库密码
     */ 
public void covertJSKToPFX(String jksFilePath, String jksPasswd, String pfxFolderPath, String pfxPasswd) throws Throwable 
    { 
        FileInputStream fis = null; 
        try 
        { 
            KeyStore inputKeyStore = KeyStore.getInstance("JKS"); 
            fis = new FileInputStream(jksFilePath); 
            char[] srcPwd = jksPasswd == null ? null : jksPasswd.toCharArray(); 
            char[] destPwd = pfxPasswd == null ? null : pfxPasswd.toCharArray(); 
            inputKeyStore.load(fis, srcPwd); 
 
            KeyStore outputKeyStore = KeyStore.getInstance("PKCS12"); 
            Enumeration<String> enums = inputKeyStore.aliases(); 
            while (enums.hasMoreElements()) 
            { 
                String keyAlias = (String) enums.nextElement(); 
                System.out.println("alias=[" + keyAlias + "]"); 
                outputKeyStore.load(null, destPwd); 
                if (inputKeyStore.isKeyEntry(keyAlias))
                { 
                    Key key = inputKeyStore.getKey(keyAlias, srcPwd); 
                    java.security.cert.Certificate[] certChain = inputKeyStore.getCertificateChain(keyAlias);
                    outputKeyStore.setKeyEntry(keyAlias, key, destPwd, certChain); 
                } 
                String fName = pfxFolderPath + "_" + keyAlias + ".pfx"; 
                FileOutputStream out = new FileOutputStream(fName); 
                outputKeyStore.store(out, destPwd); 
                out.close(); 
                outputKeyStore.deleteEntry(keyAlias); 
            } 
        } finally 
        { 
            try 
            { 
                if (fis != null) 
                { 
                    fis.close(); 
                } 
            } catch (Exception e) 
            { 
                e.printStackTrace(); 
            } 
        } 
    } 

/**
     * 从BKS格式转换为PKCS12格式
     * 
     * @param jksFilePath
     *            String JKS格式证书库路径
     * @param jksPasswd
     *            String JKS格式证书库密码
     * @param pfxFilePath
     *            String PKCS12格式证书库保存文件夹
     * @param pfxPasswd
     *            String PKCS12格式证书库密码
     */ 
public void covertBKSToPFX(String jksFilePath, String jksPasswd, String pfxFolderPath, String pfxPasswd) throws Throwable 
    { 
        FileInputStream fis = null; 
        try 
        { 
            KeyStore inputKeyStore = KeyStore.getInstance("BKS", new org.bouncycastle.jce.provider.BouncyCastleProvider());
            Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); 
            fis = new FileInputStream(jksFilePath); 
            char[] srcPwd = jksPasswd == null ? null : jksPasswd.toCharArray(); 
            char[] destPwd = pfxPasswd == null ? null : pfxPasswd.toCharArray(); 
            inputKeyStore.load(fis, srcPwd); 
 
            KeyStore outputKeyStore = KeyStore.getInstance("PKCS12"); 
            Enumeration<String> enums = inputKeyStore.aliases(); 
            while (enums.hasMoreElements()) 
            { 
                String keyAlias = (String) enums.nextElement(); 
                System.out.println("alias=[" + keyAlias + "]"); 
                outputKeyStore.load(null, destPwd); 
                if (inputKeyStore.isKeyEntry(keyAlias))
                { 
                    Key key = inputKeyStore.getKey(keyAlias, srcPwd); 
                    java.security.cert.Certificate[] certChain = inputKeyStore.getCertificateChain(keyAlias);
                    outputKeyStore.setKeyEntry(keyAlias, key, destPwd, certChain); 
                } 
                String fName = pfxFolderPath + "_" + keyAlias + ".pfx"; 
                FileOutputStream out = new FileOutputStream(fName); 
                outputKeyStore.store(out, destPwd); 
                out.close(); 
                outputKeyStore.deleteEntry(keyAlias); 
            } 
        } finally 
        { 
            try 
            { 
                if (fis != null) 
                { 
                    fis.close(); 
                } 
            } catch (Exception e) 
            { 
                e.printStackTrace(); 
            } 
        } 
    } 

/**
     * 列出JKS库内所有X509证书的属性
     * 
     * @param jksFilePath
     *            证书库路径
     * @param jksPasswd
     *            证书库密码
     * @param algName
     *            库类型
     */ 
    public static void listAllCerts(String jksFilePath, String jksPasswd, String algName) 
    { 
        try 
        { 
            char[] srcPwd = jksPasswd == null ? null : jksPasswd.toCharArray(); 
            FileInputStream in = new FileInputStream(jksFilePath); 
            KeyStore ks = KeyStore.getInstance(algName); 
            ks.load(in, srcPwd); 
            Enumeration<String> e = ks.aliases(); 
            while (e.hasMoreElements()) 
            { 
                String alias = e.nextElement(); 
                java.security.cert.Certificate cert = ks.getCertificate(alias); 
                if (cert instanceof X509Certificate) 
                { 
                    X509Certificate X509Cert = (X509Certificate) cert; 
                    System.out.println("**************************************"); 
                    System.out.println("版本号:" + X509Cert.getVersion()); 
                    System.out.println("序列号:" + X509Cert.getSerialNumber().toString(16)); 
                    System.out.println("主体名:" + X509Cert.getSubjectDN()); 
                    System.out.println("签发者:" + X509Cert.getIssuerDN()); 
                    System.out.println("有效期:" + X509Cert.getNotBefore()); 
                    System.out.println("签名算法:" + X509Cert.getSigAlgName()); 
                    System.out.println("输出证书信息:\n" + X509Cert.toString()); 
                    System.out.println("**************************************"); 
                } 
            } 
        } catch (Exception e) 
        { 
            e.printStackTrace(); 
        } 
    } 
   
    /*
    * 列出BKS库内所有X509证书的属性
    * 
    * @param jksFilePath
    *            证书库路径
    * @param jksPasswd
    *            证书库密码
    * @param algName
    *            库类型
    */
    public static void listAllCertsBks(String jksFilePath, String jksPasswd, String algName) 
    { 
        try 
        { 
            char[] srcPwd = jksPasswd == null ? null : jksPasswd.toCharArray(); 
            FileInputStream in = new FileInputStream(jksFilePath); 
            KeyStore ks = KeyStore.getInstance(algName, new org.bouncycastle.jce.provider.BouncyCastleProvider());
            Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());   
            ks.load(in, srcPwd); 
            Enumeration<String> e = ks.aliases(); 
            while (e.hasMoreElements()) 
            { 
                String alias = e.nextElement(); 
                java.security.cert.Certificate cert = ks.getCertificate(alias); 
                if (cert instanceof X509Certificate) 
                { 
                    X509Certificate X509Cert = (X509Certificate) cert; 
                    System.out.println("**************************************"); 
                    System.out.println("版本号:" + X509Cert.getVersion()); 
                    System.out.println("序列号:" + X509Cert.getSerialNumber().toString(16)); 
                    System.out.println("主体名:" + X509Cert.getSubjectDN()); 
                    System.out.println("签发者:" + X509Cert.getIssuerDN()); 
                    System.out.println("有效期:" + X509Cert.getNotBefore()); 
                    System.out.println("签名算法:" + X509Cert.getSigAlgName()); 
                    System.out.println("输出证书信息:\n" + X509Cert.toString()); 
                    System.out.println("**************************************"); 
                } 
            } 
        } catch (Exception e) 
        { 
            e.printStackTrace(); 
        } 
    } 

 


    
[2] MSP430学习札记
    来源: 互联网  发布时间: 2014-02-18
MSP430学习笔记

1、  IAR程序下载方式:串口下载

2、  复位向量地址:0FFFEH。地址中存放的是程序段的开始地址

3、  程序下载和在线调试电源可通过计算机的jatg口提供,无需加电源

 

4、  特殊功能寄存器(SFR):0H~0FH

5、  8位外转模块+IO端口:010H~0FFH

6、  16位外转模块+TIMER+ADC:0100H~01FFH

7、  定义数据段地址(RAM):0200H~09FFH

8、  专用FLASH引导:0A00H~)FBFH

9、  信息段:FC0H~10FFH(可擦除、读写信息)

10、              程序代码段:1100H~FFDFH

11、              中断向量地址段:FFE0H~FFFFH

 

12、              硬件乘法器是独立于CPU运行的,将变量放入制定的地址即可(建议是用乘法器之前关闭中断)

 

 

13、              MSP430F149有6个8为IO口(共48个),其中P1、P2占两个中断向量,即可设置16个外部中断源

14、              IO口可直接通过端口的输入输出寄存器进行端口通信

15、              因为所有IO口都是和其他外设复用的,因此在使用前需先设定端口功能:外设or P口

 

 

16、              两个16位定时器(对应两个定时器中断向量),看门狗也可以用作定时器

 

17、              包含一个内部时钟(DCOCLK)和两个外部时钟(LFXT1CLK、XT2)

18、              内部始终最高可达1024KHz

19、              一个外部时钟XT1可接32KHz,一个外部时钟XT2可接8MHz(单片机最高工作频率)

20、              CPU和外围模块根据不同需求使用不同的时钟信号:

辅助时钟ACLK:来自LFXT1CLK晶体的频率,用户外围模块

主系统时钟MCLK:用户CPU和系统,可来自于LFXT1CLK、XT2或DCOCLK其中之一,若选择LFXT1CLK或XT2,但时钟源出现问题时,系统会自动切换到选择DCOCLK作为MCLK时钟源,缺省情况下也是选择DCOCLK作为MCLK时钟源;

子系统时钟SMCLK:可由XT2CLK或者DCOCLK产生,用于外围模块

(page8-状态寄存器R2)

 

21、              中断事件能使系统从各种工作方式中唤醒,使用RETI指令返回到中断事件以前所选择的状态,也可以在中断事件中修改工作状态寄存器,使终端退出后进入到不同的工作状态;

22、              中断向量表

 

23、              PUC:上电清除信号,产生它的事件:

发生POR信号(上电复位)

看门狗定时时间到

看门狗定时写入错误的安全值(高位05AH)

RST/NMI设置成NMI模式,在RST/NMI引脚出现低电平信号

FLASH存储器写入错误的安全值(高位05AH)

24、              NMI中断源:RST/NMI(NMIIFG)、振荡器故障(OFIFG)和闪存非法访问(ACCVIFG),这些标志一旦被置位都会保持到他们被软件复位,因此可以通过软件却只中断请求源,即出错的类型;

 

25、              #define DEFC(name,address) __no_initvolatile unsigned char name @ address

将name写入指定地址:address

 

26       捕获模式:外部触发—当触发源(检测信号引脚)有信号(触发方式)时,系统将定时器TxR中的计数值保存到它的锁存寄存器TxCCRx(16位)中,实现精确测量。

27        

28       安装MSP430USB驱动时出错:inf不能找到所需的段

       按照网上的方法:设置smartcard 启动+自动

    打开驱动程序目录,发现有两个INF文件。其中一个带有 [ClassInstall32] 段,另一个没有,于是从一个INF中复制 [ClassInstall32] 和其下面的 AddReg= 。。。。一句,粘贴到无此段的INF文件里面,重新尝试安装。

       还是安装不成功,查看setupapi.log,发现“#E339 添加服务: 服务 "usbser" 的二进制文件 "C:\WINDOWS\system32\DRIVERS\usbser.sys" 不存在。”,在网上下载usbser.sys,复制到C:\WINDOWS\system32\DRIVERS\目录下,重新安装,OK!

 

调试问题:

This product is not licensed for MISRA C checking

解决:

在option里general option 设置一下就可以了
最后一个选项里不选ena××e MISRA-C 点击ok就行了

 

开发板测试问题:

看门狗关闭,但是系统还是老是自动重启

解决:

开了定时器中断,但是未定义中断入口及中断函数

 

ADC配置基本项(F1232):

PxSEL:端口ADC功能使能;

SREF_x:参考电压;

SHTx:转换时序与采样时钟的关系:4*T*x;

MSC:多次采样/转换位:

       ‘SHP = 1’  + ‘MSC=0’ == SHI信号上升沿触发采集定时器

       ‘CONSE!=0’+ ‘MSC=1’==上一次转换完成马上进入下一次转换

ADC10ON:打开ADC10内核

 

INCH_1:转换通道选择

ADC10DIV_7:时钟源分频因子,x + 1

ADC10SSEL_1:时钟选择

CONSEQ_0:转换模式

 

ENC:转换允许位;

ADC10SC:开始转换

 

三通道ADC单次采样初始化例程:

       ADC12CTL0 = ADC12ON+MSC+SHT0_8;           // Turn on ADC12, extend sampling time

 

                                            // to avoid overflow of results

 

  ADC12CTL1 = SHP+CONSEQ_1;                 // Use sampling timer, repeated sequence

 

  ADC12MCTL0 = INCH_0;                      // ref+=AVcc, channel = A0

 

  ADC12MCTL1 = INCH_3;                      // ref+=AVcc, channel = A1

 

//  ADC12MCTL2 = INCH_2;                      // ref+=AVcc, channel = A2

 

  ADC12MCTL2 = INCH_4+EOS;                  // ref+=AVcc, channel = A3, end seq.

 

  //ADC12IE = 0x01;                           // Enable ADC12IFG.3

  //ADC12IE = 0x02;                           // Enable ADC12IFG.3

  ADC12IE = 0x04;                           // Enable ADC12IFG.2

 

  ADC12CTL0 |= ENC;                         // Enable conversions

 

  ADC12CTL0 |= ADC12SC;                     // Start conversion


    
[3] (转)苹果运用商店审核指南中文翻译
    来源: 互联网  发布时间: 2014-02-18
(转)苹果应用商店审核指南中文翻译
前言

我们希望帮助您加入 这个成功的组织。这是我们首次发布《应用程序商店评估指导》(App Store Review Guidelines)。通过它,我们希望帮助您解决开发应用程序时遇到的问题,以便于您在提交应用程序时,可以加快审批流程的速度。

我们将应用程序(Apps) 视为与书籍或歌曲不同的产品,我们并不存储它们。如果您意欲批评宗教,那就去写本书。如果您想要描述性爱过程,写本书或写首歌曲,或者可以创建一个医疗程 序。这会出现非常复杂的局面,但是我们决定,在应用程序商店(App Store)禁止出现某种内容。这或许会让您认识到我们秉持的更为深远的目的:

我们拥有许多儿童可以下载的应用程序,除非父母事先进行了设置(一般父母都不会设置),否则父母对这些内容的操作控制将会无效。因此,您要了解我们时刻在留意着您的孩子。

在我们的应用程序商店中已经拥有了超过 25万个应用程序。我们不再需要那些垃圾应用程序。如果您的应用程序没有什么有益的用途或者持续性的娱乐功能,则可能不会获得我方的接受。

如果您的应用程序看上去像是那种只花了几天功夫简单拼凑出来的产品,或者只是想在我们的商店中抓住朋友的眼球,请提前做好遭拒的准备。我们有很多具有严谨态度的开发程序员不希望他们的高品质应用程序充斥在一些业余作品之中。

我们将拒绝任何包含越界内容或行为的应用程序。您可能会问道,具体限制是什么?最高法院的法官曾有言:“它出现时我自然心中有数。”当您越过这一范围时,我们认为您也会有自知之明。

如果您的应用程序被拒,我们设立了一个审查委员会供您上诉。如果您去媒体抨击我们,肯定对您于事无补。

这是一个动态文档,新提交的应用程序会导致新的问题产生,并可能随时产生新的规则。或许您的应用程序会触及到这一点。

最后要说明的是,我们非常珍惜这个平台,并且向您的作品表示敬意。我们确实在尝试尽力创建全球最佳平台,以便让您展示才华,同时获得相应的报酬。如果这读上去让您感觉我们的控制欲过强,那是因为我们曾向用户承诺保证,我们将利用我们的产品让他们获得高品质体验。

目录

1. 条款与条件

2. 功能

3. 元数据、评级与排名

4. 位置

5. 推送通知

6. 游戏中心

7. iAd相关

8. 商标与商业外观

9. 媒体内容

10. 用户界面

11. 购买与流通

12. 删除与聚合

13. 设备损害

14. 人身攻击

15. 暴力

16. 异议内容

17. 隐私

18. 色*情

19. 宗教、文化与种族

20. 竞赛、赌金、彩票与罐头抽奖销售|

21. 慈善与援助

22. 法律要件


1. 条款和条件

1.1 为App Store开发程序,开发者必须遵守程序许可协议(PLA)、人机交互指南(HIG)以及开发者和苹果签订的任何协议和合同。以下规则和例子旨在帮助开发者的程序能获得App Store的认可,而不是修改或删除任何其他协议中的条款。


2. 功能

2.1 崩溃的程序将会被拒绝

2.2 有错误的程序将会被拒绝

2.3 跟开发者宣传不符的程序将会被拒绝

2.4 无应用文档或隐藏功能与描述不符的程序将会被拒绝

2.5 使用非公开API的程序将会被拒绝

2.6 在指定容器范围外读写数据的程序将会被拒绝

2.7 以任何方式或形式下载代码的程序将会被拒绝

2.8 安装或释放其他可执行代码的程序将会被拒绝

2.9 beta版、演示版、trial版和测试版的程序将会被拒绝

2.10 iPhone程序必须不经修改就能以iPhone分辨率和2倍 iPhone 3GS的分辨率在iPad上运行

2.11 与App Store已有程序重复的程序可能会被拒绝,特别是数量很多的情况下

2.12 没有显著用途或不提供任何持久娱乐价值的程序可能会被拒绝

2.13 主要内容为营销或广告的程序将会被拒绝

2.14 欺骗或有虚假功能,没有明确标明的程序将会被拒绝

2.15 大于20MB的程序不会通过蜂窝网络下载(App Store会自动禁止)

2.16 多任务程序仅可以为达到预期目的而使用后台服务:网络电话、音频播放、地点、任务完成、本地通知等

2.17 浏览网络的程序必须使用iOS WebKit框架和WebKit Javascript

2.18 鼓励过量饮酒或非法物质,或鼓励青少年饮酒或吸烟的程序将会被拒绝

2.19 提供不正确诊断或其他不准确设备数据的程序将会被拒绝

2.20 向App Store上传大量相似版本程序的开发者将会从iOS开发者项目中除名


3. 元数据(名称、描述、评级、排名等)

3.1 带有任何其他移动平台名称的元数据程序将会被拒绝

3.2 带有占位符文本的程序将会被拒绝

3.3 带有与程序内容和功能不相关描述的程序将会被拒绝

3.4 连接到 iTunes 中的程序名称及显示在设备的程序名称应该相似,不至引起混淆

3.5 程序的大图标与小图标应该类似,不至引起混淆

3.6 程序图标与画面不符合4+年龄评级的程序将会被拒绝

3.7 目录与类型不适合于程序内容的程序将会被拒绝

3.8 开发程序员负责为其程序指定适合的评级。评级不适用可能会由苹果公司修改

3.9 开发程序员负责为其程序指定适合的关键字。关键字不适用可能会由苹果公司修改/删除

3.10 利用伪造或付费评论的方式在App Store中企图操纵或欺骗用户评价或图表排名的开发程序员(或者采用其他不正当方式)将会从iOS开发者项目中除名


4. 位置

4.1 在采集、传送或使用位置数据之前未通知并获得用户同意的程序将会被拒绝

4.2 使用基于位置的API用于车辆、飞机或其他设备的自动控制或自主控制的程序将会被拒绝

4.3 使用基于位置的API用于调度、车队管理或应急服务的程序将会被拒绝


5. 推送通知

5.1 不采用苹果推送通知 (APN)应用接口提供推送通知的程序将会被拒绝

5.2 未从苹果获得推送应用ID便擅自使用APN服务的程序将会被拒绝

5.3 未获得用户初次同意便发送推送通知的程序将会被拒绝

5.4 使用推送通知发送敏感个人信息或机密信息的程序将会被拒绝

5.5 使用推送通知发送非请求消息或用于钓鱼或群发垃圾邮件用途的程序将会被拒绝

5.6 程序不可使用推送通知发送广告、促销或任何类型的直销

5.7 程序不能向使用推送通知服务的用户收取费用

5.8 使用推送通知会利用过多APN服务的网络流量或带宽或给设备带来过度负担的程序将会被拒绝

5.9 如果程序能够传送病毒、文件、计算机代码或程序,并且对APN服务的正常运行造成损害或中断,该程序将会被拒绝


6. 游戏中心

6.1 向终端用户或任意第三方显示玩家ID的程序将会被拒绝

6.2 将玩家ID用于任何未经游戏中心条款批准用途的程序将会被拒绝

6.3 企图进行反向查找、跟踪、关联、挖掘、获得或利用玩家ID、化名或通过游戏中心获得的其他信息将会从iOS 开发程序员项目中除名

6.4 游戏中心信息(例如计分板得分)可能仅能用于游戏中心批准的程序

6.5 利用游戏中心服务发送非请求信息或用于钓鱼或群发垃圾邮件的程序将会被拒绝

6.6 过多使用游戏中心网络流量或带宽的程序将会被拒绝

6.7 如果程序能够传送病毒、文件、计算机代码或程序,并且对游戏中心服务的正常运行造成损害或中断,该程序将会被拒绝


7. iAd相关

7.1 人工增加访问次数或者广告点击量的应用程序将会被拒绝

7.2 包含有空的iAd广告栏的应用程序将会被拒绝

7.3 主要设计目的在于显示广告的应用程序将会被拒绝


8. 商标与商业外观

8.1 应用程序必须遵守使用苹果商标和版权以及苹果商标列表指导手册中说明的所有条款与条件

8.2 任何误导和暗示苹果公司是该应用程序来源或提供商,或者苹果公司以任何形式表示认可其质量或功能的应用程序将会被拒绝

8.3 与目前已有苹果产品或者广告主题外观相似混淆的应用程序将会被拒绝

8.4 在应用程序名称中将苹果产品名拼错的应用程序(例如,GPS for Iphone, iTunz)将会被拒绝

8.5 使用受保护的第三方材料(商标、版权、商业机密、其他私有内容)在申请时需要提供一份文本形式的版权确认

8.6 当原内容所有的商标特征保持不被修改并完整显示时, 谷歌地图和通过谷歌地图API获取的谷歌地球的图像可以在应用程序内部使用。掩盖或者修改谷歌标志或者版权拥有者身份证明的应用程序将会被拒绝


9. 媒体内容

9.1 不使用媒体播放器框架(MediaPlayer Framework)获取音乐库中媒体的应用程序将会被拒绝

9.2 模仿任何iPod界面的应用程序将会被拒绝

9.3 通过蜂窝网络传输的音频流内容每5分钟不得大于5MB

9.4 通过蜂窝网络传输超过10分钟的视频流内容需要使用HTTP直播流(HTTP Live Streaming)并包含一个亟待64kbps仅音频的HTTP直播流


10. 用户界面

10.1 应用程序必须遵守苹果《iPhone用户界面指导原则》以及《iPad用户界面指导原则》中解释的所有条款和条件。

10.2 与App Store、iTunes Store和iBookstore等提供的iPhone捆绑应用程序类似的应用程序将会被拒绝。

10.3 未能按苹果《iPhone用户界面指导原则》及《iPad用户界面指导原则》所述,正确使用系统自带的按钮、图标等项目的应用程序可能会被拒绝。

10.4 创建alternat桌面/主屏幕环境或者模拟多应用程序widget体验的应用程序将会被拒绝。

10.5 改变音量大小和铃声/静音开关等标准开关功能的应用程序将会被拒绝。

10.6 苹果及我们的客户高度推崇简单、精致、富有创造性以及经过精心设计的界面。虽然需要付出更多,但却非常值得。苹果设立了很高的门槛。如果你的用户界面太过复杂或者水准不高,可能会被拒绝。


11. 购买与货币

11.1 使用App Store以外的软件开启或提供额外功能的应用程序将会被拒绝。

11.2 使用应用内支付系统(IAP)以外的系统购买内容、功能或服务的应用软件将会被拒绝。

11.3 使用IAP购买实物商品和并非用于该软件的服务的应用软件将会被拒绝。

11.4 应用软件使用IAP购买信用点或者其他货币必须消费本软件内的信用点。

11.5使用IAP购买已过期信用点或者其他货币的应用软件将会被拒绝。

11.6使用IAP订阅内容最少需持续30天,所有iOS设备用户都可使用这项功能。

11.7 应用软件使用IAP购买的商品必须具有可购买性。

11.8 使用IAP购买iOS提供的照相摄像或陀螺仪等内置功能的应用软件将会被拒绝。

11.9 含有已超过限定时间的“出租”内容或服务的应用软件将会被拒绝。

11.10 保险应用软件必须免费,遵守发布地区的法律同时不能使用IAP。

11.11 一般而言,你的应用程序越贵,我们的评审越彻底。


12. 抓取和聚合

12.1 从苹果网站(例如apple.com、iTunes Store、App Store、iTunes Connect、苹果开发者计划等)抓取任何信息或者使用苹果网站的内容和服务进行排名的应用软件将遭到拒绝。

12.2 应用软件可以使用获得批准的苹果RSS feeds,例如iTunes Store RSS feeds。

12.3 只是简单的网页剪切、内容聚合器或者罗列链接的应用软件可能会被拒绝。

13. 设备损害

13.1 怂恿用户以可能造成损害的方式使用苹果设备的应用软件将会被拒绝。

13.2 快速耗光设备电量或产生过多热量的应用软件将会被拒绝。





14. 人身攻击

14.1 具有诽谤、人身攻击性质以及内容狭隘卑鄙的应用软件或者打击特定个人或组织的应用软件将会被拒绝。

14.2 职业政治讽刺家不受这一禁令约束,可进行具有攻击性或狭隘刻薄的评论。





15. 暴力

15.1 应用程序中出现人或动物被杀、致残以及枪击、刺伤、拷打等受伤情形的真实画面将会被拒绝。

15.2 出现描绘暴力或虐待儿童等内容的应用程序将会被拒绝。

15.3 游戏中出现的“敌人”不可指向一个特定种族、文化、一个真实存在的政府、企业或者其他任何现实中的实体。

15.4 对武器进行真实描述以怂恿非法使用或滥用这些武器的应用程序将会被拒绝。

15.5 内含与俄罗斯轮*盘相关的应用程序将会被拒绝。





16. 不当内容

16.1 应用程序中出现过于令人反感或者低俗的内容将会被拒绝。

16.2 在设计上用于激怒用户或令人感到厌恶的应用程序将会被拒绝。





17.隐私

17.1 应用程序不能在未获用户允许或未向用户提供如何使用及在何处使用数据的相关信息情况下传输有关用户的数据。

17.2 要求用户共享电子邮箱地址和出生日期等私人信息才可使用其功能的应用程序将会被拒绝。

17.3 锁定未成年人进行数据收集的应用程序将会被拒绝。





18. 色*情

18.1 含有色*情素材,也就是《韦氏词典》中定义的“旨在激发情欲,对性器官或性行为的明确描述或展示,而无关美学或情绪感受”的程序将会被拒绝

18.2 用户产生内容多为色*情的程序(比如以前的Chat Roulette程序)将会被拒绝





19.宗教,文化与种族

19.1 涉及宗教、文化或种族群体的引用或评论包含诽谤性、攻击性或自私性内容,或会使特定群体遭受伤害或暴力的程序将会被拒绝

19.2 程序可以包含或引用宗教经文,程序所提供的引用或翻译必须准确且不会引起误导。评论应该有教育意义,可以令人开阔眼界,而不应有煽动性





20.竞赛、赌金、彩票与抽彩售物

20.1 赌金和竞赛必须由程序的开发者公司发起

20.2 赌金和竞赛的正式规则必须在程序中注明,并且必须明确表示苹果不是发起者,也没有以任何方式参与活动

20.3 开发者运营的彩票程序必须在法律容许范围之内,彩票程序必须具有以下所有特性:报酬、几率及奖品

20.4 允许用户直接购买彩票或抽彩售物券的程序将会被拒绝





21.慈善与援助

21.1包含可以向认证的慈善组织捐赠功能的程序必须是免费的

21.2 捐赠款项的募集必须通过Safari浏览器中的网站或是手机短消息。





22. 法律要件

22.1 程序必须遵守各地用户遵守的任何法律要求。开发者有义务了解并遵守当地所有法律

22.2 包含虚假,欺诈或误导性陈述的程序将会被拒绝

22.3 请求、促进或鼓励犯罪或明显鲁莽行为的程序将会被拒绝

22.4 使用非法文件共享的程序将会被拒绝

22.5 被设计用作非法赌*博辅助工具,包括算牌的程序将会被拒绝

22.6 具有拨打匿名或恶作剧电话或发送类似短信彩信功能的程序将会被拒绝

22.7 开发暗中收集用户密码或用户私人数据程序的开发者将会从iOS开发者项目中除名



动态文档

这份文档展现了我们在竭尽所能向您分享我们对提交到App Store的程序的审查方式,我们希望您在开发和提交程序时,这份指南能对您有所帮助。这是一份动态文档,随着新程序和新情况的发生会有所变化。我们会定期更新,以反映这些变化。

感谢您参与到iOS的开发中来。虽然此文档是一份“不该做事宜”的列表,但也请将那份短得多的“必做事宜”列表牢记在心。最重要的是,与我们一道共同努力让用户感到惊奇和欣喜。用创新方式向他们展示世界,让他们用前所未有的方式与之交流。根据我们的经验,无论是在功能和用户界面上,用户确实会对完善的程序有所反应。更进一步,给他们期望之外的东西,带他们去从未去过的地方。我们愿意提供帮助。

来自: http://luoyl.info/blog/2012/05/ios-app-atore-review-guidelines/

官方英文原版:https://developer.apple.com/appstore/guidelines.html

    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3