2020-03-02 21:49:29 Silent_F 阅读数 1395
  • MVC相关知识简介

    按照课件中总结的编程语句学习并熟练掌握,就可以达到服务端的开发要求。

    6851课时 0分钟 1034人学习 徐照兴
    免费试看

这两天在提交苹果应用的时候遇到下面问题:
在这里插入图片描述
应该是两天可能苹果系统的同步问题,添加了应用id但在https://appstoreconnect.apple.com/ 后台无法创建APP,无法选择新添加的应用id创建APP。

这个问题是因为苹果那边系统同步的问题,经测试,新添加的应用id要过一天才能同步过来,才能选择创建,所以先等待一下!很快苹果会恢复正常。

如果您不想等待,可以尝试使用fastlane 命令创建后台应用

2017-07-04 10:11:11 WoAiBianCheng123abc 阅读数 1839
  • MVC相关知识简介

    按照课件中总结的编程语句学习并熟练掌握,就可以达到服务端的开发要求。

    6851课时 0分钟 1034人学习 徐照兴
    免费试看

上架iOS最基本需要一个付费的开发者账号,还没有的话申请一个或者借用。

通常也还需要一台Mac电脑,不过这里介绍到不用Mac在Windows系统中直接发布iOS APP到App Store。

如果没有Mac,也无所谓。

申请开发者账号介绍

iOS APP上架需要创建一个APP ID、申请iOS发布证书、再用iOS证书打包IPA,然后在上传IPA到App Store

上架过程分七个步骤,按步骤一步步来,清晰了步骤就跟简单了,欢迎交流!

1、创建APP身份证(App IDs)

2、申请发布证书

3、申请发布描述文件

4、Windows下上传证书编译打包

5、在iTunes Connect创建App

6、Windows下上传IPA到App Store

7、上传好IPA回到iTunes Connect填写APP信息并提交审核

一、创建唯一标示符App IDs

APP IDs在后面创建发布文件,创建APP时都要用到。

首先打开开发者中心https://developer.apple.com/cn/,进入证书页面。

1.1点击证书、ID及配件文件,进入设置。

1.2选择App IDs –>点击+创建一个新的App ID

其中有两项需要你自己填:

第一项Name,用来描述你的App ID,这个随便填,没有什么限制,最好是项目名称,这样方便自己辨识(不允许中文)

第二项Bundle ID (App ID Suffix),这是你App ID的后缀,需要仔细填写。用来标示我们的 app,使它有一个固定的身份,和你的程序直接相关。填写 Explicit App ID 的格式为:com.company.appName,一定照着格式写,写个方便记的,后面很多地方要用到。

第三项App Services,默认会选择2项,不能修改,其它根据自己需要的服务选择上,然后点击Continue确认,下一步。

检查下没有错的话直接点击Register后点击Done完成App ID的创建。

二、申请发布证书

iOS证书申请要用到一个工具Appuploader,在win系统中辅助快速申请iOS证书,和后面上传IPA到App Store都要用到。

先安装好 Appuploader安装介绍

2.1打开程序,输入苹果开发者中心账号,登录。

2.2选择Certification

2.3点击+ADD,这里有开发证书等等创建选项,这里选第三项发布证书。

2.4输入,证书名称(随意) 邮箱(任何邮箱都行) 密码(后面打包编译时用到)然后点击ok

2.5此时生成了好了一个发布证书,点击p12 File,下载证书文件,保存到电脑。

这样发布证书就创建好了。

三、申请发布描述文件

3.1回到软件点击Profiles

3.2点击+ADD,这里有开发描述文件等等选项,这里选发布描述文件。

3.3选择APP IDs,之前在开发者中心创建的,这里会自动出现。

3.4勾选刚创建的发布证书关联好,输入name,点击ok

3.5此时生成了发布描述文件,点击 Download下载到电脑保存

四、上传证书编译打包

使用其他平台的,欢迎加入上架交流群,众多大神为你解答。362305994

这里以APPcan平台为例

4.1、选择完工的APP,点击应用打包,选择证书管理,iOS发布证书,上传之前申请的发布证书和申请时设置的密码及发布描述文件

点击检验,APP ids将自动出现,然后保存。

4.2选择云端打包,iOS打包,没有推送证书就不勾选支持推送,选择发布版证书,禁用http请求容易审核通过。

设置好版本号,选择appcan服务器,点击生成安装包。


4.3安装包生成成功后,下载保存到电脑,这个ipa包就可以上传到App Store了

五、在iTunes Connect创建App

5.1回到软件,点击ItunerConnect,进入iTunes Connect进入创建APP。

5.2选择我的APP点击左上角+号选择新建APP,输入你的应用名称,语言,套装ID,之前在开发者中心创建的对应APP IDs

(与创建iOS证书所选的appid要一致,这样用iOS证书打包的IPA,上传就能关联到了)

sku不能写中文,点击创建。

5.3这里提示要用到Xcode或者Application loader提交IPA,等下用Appuploader直接在Windows环境下上传ipa,不用Mac了。

现在APP各项信息都没填写,等下把IPA上传成功了再填写。

这里构建版本旁边还没有出现+号,后面上传了IPA就会出现,等下会用到。

六、Windows环境下上传IPA到App Store

6.1打开Appuploader程序,点击Upload.

6.2选择刚生成的iap包

6.3Appuploader将自动上传你的IPA,当出现以下提示时,说明上传成功,点击deail可以查看APP信息。

七、回到iTunes Connect提交审核

7.1上传好了IPA,然后回到iTunes Connect,进入填写信息的页面,下边有一个构建版本的选项,之前这旁边没有+号的,如果上传成功了,过几分钟旁边会出现一个加号按钮,点击一下+然后会出现你刚上传的APP,点击完成即可。

注意:如果一段时间后没有出现+号,可能ipa不符合要求,会有个反馈邮件过来,根据反馈的问题修改后重新上传。

7.2然后设置好APP相关的信息,截图、类别,价格、销售服务等。


7.3设置好相应的APP信息后,点击提交以供审核。

7.3提交审核回到我的APP查看会提示正在等待审核,审核要几天时间,常登陆看看审核情况

如果变成可供销售,恭喜你~上架成功了,如果显示被拒绝,点击查看问题,根据反馈修改再重新上传。

2019-09-25 14:14:53 LANGZI7758521 阅读数 628
  • MVC相关知识简介

    按照课件中总结的编程语句学习并熟练掌握,就可以达到服务端的开发要求。

    6851课时 0分钟 1034人学习 徐照兴
    免费试看

在iTunes Connect  中 【新建 App】  设置 App信息的步骤流程一般是这样的:

1.  名称:指的是App上架后,显示在App Store中的名称。

2.  主要语言: Simplified Chinese (简体中文)。

3.  套装ID: 套装 ID 必须与您在 Xcode 中使用的 ID 相符。该 ID 在您初次提交后便无法更改。

套装ID分为两种情况。

假设在开发者网站已经创建了两个App ID ,一个是:

Explicit App ID  为 :  com.companyA.oneApp,

App ID Description Name  为:oneApp。

另外一个是:

Wildcard App ID  为: com.companyB.* 

App ID Description Name  为:twoApp。

情况一:Explicit App ID

在套装ID填写的文本框右下拉框里,就可以选择你之前创建的App ID了,

选择之后套装ID的文本框就变成了:oneApp - com.companyA.oneApp

生成后的套装ID就是:com.companyA.oneApp

情况二:Wildcard App ID

在套装ID填写的文本框右下拉框里,就可以选择你之前创建的App ID了,

选择之后套装ID的文本框就变成了:twoApp -com.companyB.*

这里紧接着就会出现【套装ID后缀】的文本框,此处填写的应该是:后缀就是Xcode中的 Bundle Identifier 最后一个点后面的内容。假如Xcode中的Bundle Identifier是com.companyB.twoApp。【套装ID后缀】的文本框填写的就是:

twoApp。

生成后的套装ID就是:com.companyB.twoApp

注意:您的套装 ID 后缀必须与 Xcode中的 Bundle Identifier 最后一个点后面的内容相符合。

另外,Wildcard格式的证书没有推送,PassCard等服务的应用,请慎重选择

4.  SKU Number:Stock Keeping Unit,货号。如果你有很多应用,给每一个应用指定一个唯一的货号会方便你管理应用库。你可以用数字或者字母随便指定你的货号。

SKU:一个独特的、不会在 App Store 中显示的 App ID。自己可以自己定义。有人认为SKU主要去区分自己账户下边不同的APP。

不过还是建议使用项目中的Xcode中的 Bundle Identifier。

 

小知识点:

一个公司只能有唯一的公司类型的开发者账号,笔者和苹果官方技术客服打电话确认了,公司类型开发者账号具有唯一性。不过公司可以用一个新的Apple ID申请新的企业类型的开发者账号。

除此之外,个人开发者账号和公司开发者账号,在App Store上发布app的数量是不受限制

2020-01-07 17:07:49 weixin_44476336 阅读数 1654
  • MVC相关知识简介

    按照课件中总结的编程语句学习并熟练掌握,就可以达到服务端的开发要求。

    6851课时 0分钟 1034人学习 徐照兴
    免费试看

近两天可能苹果系统的同步问题,添加了应用id但在https://appstoreconnect.apple.com/ 后台无法创建APP,无法选择新添加的应用id创建APP。

这个问题是因为苹果那边系统同步的问题,经测试,新添加的应用id要过一天才能同步过来,才能选择创建,所以先等待一下!很快苹果会恢复正常。

无法选择新添加的应用id

没有套装id提示

2014-11-19 21:13:10 shenjie12345678 阅读数 210427
  • MVC相关知识简介

    按照课件中总结的编程语句学习并熟练掌握,就可以达到服务端的开发要求。

    6851课时 0分钟 1034人学习 徐照兴
    免费试看

好久没有写过博客啦,今天就由本菜鸟给大家做一个简单的IOSApp消息推送教程吧!一切从0开始,包括XCode6, IOS8, 以及苹果开发者中心最新如何注册应用,申请证书以及下载配置概要文件,相信很多刚开始接触ios的人会很想了解一下。(ps:网上看了一下虽然有很多讲述推送的好教程,我也是看着一步步学会的,但是这些教程的时间都是去年或者更早时期的,对引导新手来说不是很合适

第一部分

首先第一步当然是介绍一下苹果的推送机制(APNS)咯(ps:其实每一篇教程都有),先来看一张苹果官方对其推送做出解释的概要图。

Provider是给你手机应用发出推送消息的服务器,而APNS(Apple Push Notification Service)则是苹果消息推送服务器。你本地的服务器当需要给应用推送一条消息的时候,先要将消息发出到苹果推送服务器,然后再由苹果推送服务器将消息发到安装了该应用的手机。

接下来再看一张解释图:


根据上图的逻辑我来给大家解释一下:

1.你的IOS应用需要去注册APNS消息推送功能。

2.当苹果APNS推送服收到来自你应用的注册消息就会返回一串device token给你(很重要)

3.将应用收到的device Token传给你本地的Push服务器。

4.当你需要为应用推送消息的时候,你本地的推送服务器会将消息,以及Device Token打包发送到苹果的APNS服

5.APNS再将消息推送给目的iphone


第二部分

1.从证书颁发机构颁发证书

打开你mac的钥匙串访问: 然后点击钥匙串访问


随后它会弹出一个窗口用户电子邮件信息就填写你苹果开发者账号的名称即可(应该是一个邮件名称),点击保存到磁盘的选

项,点击继续,显示如下:



点击存储,文件名为:CertificateSigningRequest.certSigningRequest 随后将他放在一个文件夹中我们取名push吧!


第三部分

访问苹果开发者网址:https://developer.apple.com/


选中MemberCenter选项,进入登陆页面,用你的苹果开发者账号登陆,过一会网页就会自动跳转到下图。

点击红色所选部分内容进行下一步的操作。


选择Certificates选项,设置证书,如图所示先解释一下:

 


Development选项的作用顾名思义就是用来作为开发使用的证书,Production选项则是用来发布产品使用的,名称很陌生是不是,之

前的开发者网页是没有这一选项的,可能是苹果把他修改了,用这个名称更加能让人理解吧(字面上解释就是产品么)。两个选项生

成证书的步骤是一样的,现在我们使用开发者的选项进行证书的制作,步骤如下:选择Development选项:



点击上面的加号选项,



选择APNS选项(开发么当然是在沙盒环境下了,模拟真实情况),然后Continue



这个AppID我们在下一部分讲如何生成,现在我用的是已经生成好的一个应用ID,继续Continue



这边就要选择在钥匙串访问环节下载下来的CertificateSigningRequest.certSigningRequest文件了,选择并生成:


点击下载,得到aps_development .cer,保存到push文件中去。


第四部分

新建一个AppID,选择网页上的AppIDs,然后点击右上角的 “加号



App的取名只要按照苹果要求的就可以了



然后BundleID是比较重要的,在提交审核以及测试(苹果的TestFlight)和付费环节都需要用到,也只需按照苹果要求来写就好了。



接下来就是对你的应用需要使用苹果的哪些服务进行选择就行了,例如广告,游戏中心,推送,付费等等情况。


最后选择“Submit”选项,在下一个界面中选择“done”选项,这样我们设置AppID的步骤我们就完成了。


第五部分:生成Provisioning Profiles

这个配置概要文件分为两种,一种是为开发使用的,还有一种则是为发布到appStore上面。


创建发布版的ProvisioningProfile与开发版的流程相同,点击Development然后点击右上角的加号


会进入选择何种配置概要文件的界面:



我们现在时测试,所以选择“IOS App Development”的选项,在下面的Distribution发布选项中有两个选择,“App Store”以及

“Ad hoc”,你可以根据下面的描述选择你发布所需的选项。点击Continue进入下一步。


选择你上一步创建的AppID,点击Continue 进行下一步


选择你的开发者账号,Continue进行下一步


在这一步上选择你的设备(你只有在这一步上勾选了你的设备,你才能在设备上用这个签名进行调试)。关于如何将你的设备号添加

进去也是非常简单的,选择左侧的"Devices",然后点击右上角的加号,在随后出来的页面上添加你设备的UUID(在XCode中可以查

看到)以及name( 可以随便取,自己看的懂就行)然后Register一下,照着流程走到最后一步就完成了。

好咱们继续回到上面的Provisioning Profile配置环节,当你选好了你的设备后点击“Continue”进入下一页,



输入一个文件名(最好是起的能看懂是干嘛的,当然也可以随便起),点击“Generate”进入下一个页面,在这个页面中就会有一个下

载按钮让你下载这个文件,我们把它下载下来放在Push文件夹中。


第六部分

好了,前期的准备工作都已经做完了,现在让我们开始推送吧!(吼吼)

首先双击我们生成的 “aps_development .cer” 文件,进入钥匙串访问,找到我们的专用秘钥(根据在第二部分中从证书机构颁发证书操作中填写的常用名



我在第二部分填写的是“silicon”,由于换了一台mac之前安装的没有了,之前没有截图,所以随便找了个图给大家看一下,凭大家的聪明才智应该不难理解吧。

然后右击导出,会弹出如下所示的图。



将他存储到push文件夹中,命名为“push.p12”,在这一步中导出会让你输入密码并验证,你可以自定义一个密码,例如abc123

现在push文件夹中应该有几个文件“aps_development .cer” ,"push.p12",“CertificateSigningRequest.certSigningRequest”以及

刚才下下来的配置概要文件。


接下来我们打开终端将他们生成.pem文件

1.把aps_development .cer文件生成.pcm文件,cd到push文件夹下



2.把push.p12文件生成为.pem文件


上边输入的密码则是你导出证书所设的密码,即abc123.接着还会让你输入.pem文件的密码,还是使用abc123好了,防止混淆。

这样我们在push文件夹中就又得到了两个文件,PushChatCert.pem和PushChatKey.pem。


3.把PushChatCert.pem和PushChatKey.pem合并为一个pem文件,



在push文件夹中又多了一个ck.pem文件,以上我们把需要使用的文件都准备好了


接下来就要测试一下啦,是不是很激动~

为了测试证书工作的状况,我们可以使用“telnet gateway.sandbox.push.apple.com 2195”来检测一下,如果显示下图则表示成功了。



然后,我们使用我们生成的证书和私钥来设置一个安全的链接去链接苹果服务器

在终端输入如下命令:openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert PushChatCert.pem -key PushChatKey.pem

需要输入密码(abc123 我们刚才所设置的)。

然后他会返回一系列的数据,这里我就粘贴一部分啦:


CONNECTED(00000003)

depth=1 /C=US/O=Entrust, Inc./OU=www.entrust.net/rpa is incorporated by reference/OU=(c) 2009 Entrust, Inc./CN=Entrust Certification Authority - L1C

verify error:num=20:unable to get local issuer certificate

verify return:0

---

Certificate chain

。。。。。(省略)

。。。。。(省略)

。。。。。(省略)

    Start Time: 1416389389

    Timeout   : 300 (sec)

    Verify return code: 0 (ok)

---

测试就到这里啦。。。


第七部分

1.建立推送项目

//
//  AppDelegate.m
//  TestPushNotifiy
//
//  Created by silicon on 14-10-30.
//  Copyright (c) 2014年 silicon. All rights reserved.
//

#import "AppDelegate.h"

@implementation AppDelegate
@synthesize mainView = _mainView;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    if ([application respondsToSelector:@selector(isRegisteredForRemoteNotifications)])
    {
        //IOS8
        //创建UIUserNotificationSettings,并设置消息的显示类类型
        UIUserNotificationSettings *notiSettings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIRemoteNotificationTypeSound) categories:nil];
        
        [application registerUserNotificationSettings:notiSettings];
        
    } else{ // ios7
        [application registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge										 |UIRemoteNotificationTypeSound										 |UIRemoteNotificationTypeAlert)];
    }
    
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    
    self.mainView = [[MainViewController alloc] initWithNibName:@"MainViewController" bundle:nil];
    self.window.rootViewController = self.mainView;
    return YES;
}

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)pToken{
    NSLog(@"---Token--%@", pToken);
}

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{
    
    NSLog(@"userInfo == %@",userInfo);
    NSString *message = [[userInfo objectForKey:@"aps"]objectForKey:@"alert"];
    
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:message delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];
    
    [alert show];
}

- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error{

    NSLog(@"Regist fail%@",error);
}

- (void)applicationWillResignActive:(UIApplication *)application
{
    // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
    // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
}

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 
    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}

- (void)applicationWillEnterForeground:(UIApplication *)application
{
    // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
}

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
}

- (void)applicationWillTerminate:(UIApplication *)application
{
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}

@end

在appdelegate.m中加入以上代码,

if ([application respondsToSelector:@selector(isRegisteredForRemoteNotifications)])
    {
        //IOS8
        //创建UIUserNotificationSettings,并设置消息的显示类类型
        UIUserNotificationSettings *notiSettings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIRemoteNotificationTypeSound) categories:nil];
        
        [application registerUserNotificationSettings:notiSettings];
        
    } else{ // ios7
        [application registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge										 |UIRemoteNotificationTypeSound										 |UIRemoteNotificationTypeAlert)];
    }

由于ios8的推送跟ios7及以下的不一样,所以需要加判断来注册消息推送。

函数:

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)pToken{
    NSLog(@"---Token--%@", pToken);
}


会接收来自苹果服务器给你返回的deviceToken,然后你需要将它添加到你本地的推送服务器上。(很重要,决定你的设备能不能接收到推送消息)。

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{
    
    NSLog(@"userInfo == %@",userInfo);
    NSString *message = [[userInfo objectForKey:@"aps"]objectForKey:@"alert"];
    
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:message delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];
    
    [alert show];
}

这个函数则是当设备接收到来自苹果推送服务器的消息时触发的,用来显示推送消息。

- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error{

    NSLog(@"Regist fail%@",error);
}

当注册失败时,触发此函数。



2.PHP服务端

将simplepush.php这个推送脚本也放在push文件夹中

<?php

// ??????????deviceToken???????????????
$deviceToken = 'c95f661371b085e2517b4c12cc76293522775e5fd9bb1dea17dd80fe85583b41';

// Put your private key's passphrase here:
$passphrase = 'abc123';

// Put your alert message here:
$message = 'My first push test!';

////////////////////////////////////////////////////////////////////////////////

$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem');
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);

// Open a connection to the APNS server
//??????????
 //$fp = stream_socket_client(?ssl://gateway.push.apple.com:2195?, $err, $errstr, 60, //STREAM_CLIENT_CONNECT, $ctx);
//?????????????appstore??????
$fp = stream_socket_client(
'ssl://gateway.sandbox.push.apple.com:2195', $err,
$errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);

if (!$fp)
exit("Failed to connect: $err $errstr" . PHP_EOL);

echo 'Connected to APNS' . PHP_EOL;

// Create the payload body
$body['aps'] = array(
'alert' => $message,
'sound' => 'default'
);

// Encode the payload as JSON
$payload = json_encode($body);

// Build the binary notification
$msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;

// Send it to the server
$result = fwrite($fp, $msg, strlen($msg));

if (!$result)
echo 'Message not delivered' . PHP_EOL;
else
echo 'Message successfully delivered' . PHP_EOL;

// Close the connection to the server
fclose($fp);
?>

deviceToken填写你接收到的token,passPhrase则填写你的ck.pem设置的密码。

此刻就是见证奇迹的时候了,使用终端进入到push文件夹,在终端输入 php simplepush.php



若显示以上提示则表示推送成功了。附上一张成功图。



推送就到这边吧!

感谢这篇博客的指导:http://blog.csdn.net/showhilllee/article/details/8631734


simplepush.php以及XCode工程我会上传到我的资源里去,大家可以去那边下载。有什么不明白的地方大家可以留言或者私信我,我会第一之间回复的~



大家可以关注我的微信公众号与我互动,相关问题也可以直接用公众号联系我:












ios app 提交审核

阅读数 444

IOS APP IDs

阅读数 12971