十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
1.预先准备在你开始将程序提交到App Store之前,你需要有一个App ID,一个有效的发布证书,以及一个有效的Provisioning profile。下面来看看它们各自的作用。Step 1: App ID(应用ID)App ID是识别不同应用程序的唯一标示符。每个app都需要一个App ID或者app标识。目前有两种类型的App标识:一个是精确的App ID( explicit App ID),一个是通配符App ID( wildcard App ID)。使用通配符的App ID可以用来构建和安装多个程序。尽管通配符App ID非常方便,但是一个精确的App ID也是需要的,尤其是当App使用iCloud 或者使用其他iOS功能的时候,比如Game Center、Push Notifications或者IAP。 如果你不确定什么样的App ID适合你的项目,我推荐你读下苹果关于这一主题的文档: Technical Note QA1713。 Step 2: Distribution Certificate(发布证书) iOS应用都有一个安全证书用于验证开发者身份和签名。为了可以向App Store提交app,你需要创建一个iOS provisioning profile 。首先需要创建一个distribution certificate(发布证书),过程类似于创建一个development certificate(开发证书)。如果你已经在实体设备上测试你的App,那么你对创建development certificate就已经很熟悉了。 如果对此不熟悉,我建议你读下 苹果关于signing certificates和provisioning profiles的详细指导 。 Step 3: Provisioning Profile(配置文件) 一旦你创建了App ID和distribution certificate,你可以创建一个iOS provisioning profile以方便在App Store中销售你的App。不过,你不能使用和ad hoc distribution相同的provisioning profile。你需要为App Store分销创建一个单独的provisioning profile,如果你使用通配符App ID,那么你的多个app就可以使用相同的provisioning profile。 Step 4: Build Settings(生成设置)配置App ID、distribution certificate 和provisioning profile已经完成,是时候配置Xcode中target的build settings了。在Xcode Project Navigator的targets列表中选择一个target,打开顶部的 Build Settings选项,然后更新一下 Code Signing来跟之前创建的distribution provisioning profile相匹配。最近添加的provisioning profiles有时候不会立马就在build settings的 Code Signing中看到,重启一下Xcode就可以解决这个问题。 配置Target的Build SettingsStep 5: Deployment Target(部署目标)非常有必要说下deployment target,Xcode中每个target都有一个deployment target,它可以指出app可以运行的最小版本。不过,一旦应用在App Store中生效,再去修改deployment target,你要考虑到一定后果。如果你在更新app的时候提高了deployment target,但是已经购买应用的用户并没有遇到新的deployment target,那么应用就不能在用户的移动设备上运行。如果用户通过iTunes (不是设备)下载了一个更新过的app,然后替代了设备上原先的版本,最后却发现新版本不能在设备上运行,这确实是个问题。(1) 当你决定提高现有app的deployment target时,要在新版本的版本注释中进行说明。如果你提前告知用户,那么至少有一点,你已经尽力阻止问题的发生了。(2) 对于一款新app,我经常会把deployment target设置为最近发布的系统版 本。因为新iOS版本发布后,渗透率的增长速度是令人难以置信的。很多人认为提高deployment target会失去大部分市场,这个说法并不准确,比如iOS 6, iOS 6发布后一个月,超过60%的设备已经进行了更新 。但对Android而言,就是另外一回事了, Android用户并不会像iOS用户那样热衷于更新操作系统版本 。 【以上简而言之,最好从项目设计时,就决定是否考虑兼容低版本用户,支持的话,写代码时使用ios新特性时最好做一下判断,if是老版本if是新版本】在最新的WWDC2014上,公布的数字显示,iOS7的市场占有率已经为87%2. Assets(资源包)Step 1: Icons(图标)Icon是App中不可分割的一部分,你要确保icon尺寸不会出现差错。iTunes Artwork: 1024px x 1024px (required)iPad/iPad Mini: 72px x 72px and 114px x 114px (required) iPhone/iPod Touch: 57px x 57px and 114px x 114px (required) 120px x 120px(required) for iPhone5/iPhone5c/iPhone5sSearch Icon: 29px x 29px and 58px x 58px (optional) Settings Application: 50px x 50px and 100px x 100px (optional) Step 2: 屏幕截图屏幕截图的作用不言而喻,你可以为每个app上传5张截图,虽然至少需要上传一张,可能很少有人会只上传一张图片。另外,你还需要分别为 iPhone/iPod Touch和iPad/iPad Mini准备不同的屏幕截图。这也是不小的工作量,但却能展示应用的另一面。Shiny Development开发的一款售价6.99美元的Mac软件 Status Magic可以为你节省不少时间。Status Magic可以帮你把状态栏放在截图的正确位置。 屏幕截图和icon是应用给用户的第一感觉,直接关系到用户会不会购买。不过,你所上传的屏幕截图也不一定非得是实际的截图,看看 Where’s My Water? 截图可以通过使用此策略,更具吸引力和说服力。当我们连上调试机以后。可以利用Xcode中Organizer中的New Screenshot轻松的截出标准大小的图片。Step 3: 元数据 在提交应用之前,要管理好app的元数据,包括1应用名称、2版本号、3主要类别,4简洁的描述,5关键词,6.支持URL。如果你需要更新应用,你还要提供新增加的版本内容。 如果你的应用需要注册【打开APP需要登录,比如飞信】,你还得向苹果提供一个测试账户或者demo账户,这样审核人员就能很快进入app,而不用再注册账号。3. 提交准备Xcode 4以后,开发者提交应用的过程就简单多了,可以直接使用Xcode进行提交。首先在 iTunes Connect中创建app,访问iTunes Connect,使用你的iOS开发者账号登陆,点击右边的“Manage Your Apps”,点击左上角的“Add New App”,选择“iOS App”,然后完成表格。
创新互联公司是一家朝气蓬勃的网站建设公司。公司专注于为企业提供信息化建设解决方案。从事网站开发,网站制作,网站设计,网站模板,微信公众号开发,软件开发,小程序设计,十载建站对成都纱窗等多个行业,拥有丰富的网站设计经验。
如果你入门了iOS开发并且有一定的英文功底,我是非常推荐你去看的,尤其官方文档,应该经常翻阅。但是我认为保持学习的热情是最重要的。本着这个理念,我推荐的学习方法难度非常低,希望你们能满意。 第一阶段: RayWenderlich网站中的 The iOS Apprentice教程 这个教程截止目前已经不更新OC语言的版本了,但是如果你是抱着求职为目的的学习还是请看OC版本的(两年前的版本)。The iOS Apprentice的教程针对完全没有编程经验的人设计。这个教程是外国人写的并且有免费试读版,感兴趣的人要看看。里面说的东西都非常非常基本,里面一个共讲解了4个不同类型app,强烈建议一步一步按照上面所写的步骤敲一遍代码。其中你会遇到很多复杂的语句和长的可怕的函数,你不用感到恐慌,照着敲,知道它干嘛用完全OK了,随着你编程时间以及经验的增加,你都会懂得。。如果看完了这个免费的教程觉得还挺想继续学的请参王寒老师也做了swift版本的The iOS Apprentice教程翻译,自己去找)
第二阶段:培训班的网络课程及入门书籍 经过第一个阶段你应该已经大致掌握IOS开发流程,能编写一个非常简单的应用了。这时候相信你的热情应该会很高涨,但接下来的学习可能会很枯燥,做好准备
建议首先要恶补基础知识。经过第一个阶段你可能觉得你懂不少了,但是只是表面,尤其是没学过编程的应该好好学习一下视频前面的课程,主要看看语法。等你看恶心了看烦了就去看视频里UI部分,这里相对于来说比较轻松,一定要把视频里写的语句打一遍,相信这样你理解会更深刻。里面说的不清楚的地方上网可以百度,可以查书(如果你有书的话)。
先来看看官方的文档,是这样写的:In a multithreaded application, notifications are always delivered in the thread in which the notification was posted, which may not be the same thread in which an observer registered itself.翻译过来是:在多线程应用中,Notification在哪个线程中post,就在哪个线程中被转发,而不一定是在注册观察者的那个线程中。也就是说,Notification的发送与接收处理都是在同一个线程中。为了说明这一点,我们先来看一个示例:代码清单1:Notification的发送与处理@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];NSLog(@"current thread = %@", [NSThread currentThread]);[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification:) name:TEST_NOTIFICATION object:nil];dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{[[NSNotificationCenter defaultCenter] postNotificationName:TEST_NOTIFICATION object:nil userInfo:nil];});}- (void)handleNotification:(NSNotification *)notification{NSLog(@"current thread = %@", [NSThread currentThread]);NSLog(@"test notification");}@end其输出结果如下:2015-03-11 22:05:12.856 test[865:45102] current thread = {number = 1, name = main}2015-03-11 22:05:12.857 test[865:45174] current thread = {number = 2, name = (null)}2015-03-11 22:05:12.857 test[865:45174] test notification可以看到,虽然我们在主线程中注册了通知的观察者,但在全局队列中post的Notification,并不是在主线程处理的。所以,这时候就需要注意,如果我们想在回调中处理与UI相关的操作,需要确保是在主线程中执行回调。这时,就有一个问题了,如果我们的Notification是在二级线程中post的,如何能在主线程中对这个Notification进行处理呢?或者换个提法,如果我们希望一个Notification的post线程与转发线程不是同一个线程,应该怎么办呢?我们看看官方文档是怎么说的:For example, if an object running in a background thread is listening for notifications from the user interface, such as a window closing, you would like to receive the notifications in the background thread instead of the main thread. In these cases, you must capture the notifications as they are delivered on the default thread and redirect them to the appropriate thread.这里讲到了“重定向”,就是我们在Notification所在的默认线程中捕获这些分发的通知,然后将其重定向到指定的线程中。一种重定向的实现思路是自定义一个通知队列(注意,不是NSNotificationQueue对象,而是一个数组),让这个队列去维护那些我们需要重定向的Notification。我们仍然是像平常一样去注册一个通知的观察者,当Notification来了时,先看看post这个Notification的线程是不是我们所期望的线程,如果不是,则将这个Notification存储到我们的队列中,并发送一个信号(signal)到期望的线程中,来告诉这个线程需要处理一个Notification。指定的线程在收到信号后,将Notification从队列中移除,并进行处理。官方文档已经给出了示例代码,在此借用一下,以测试实际结果:代码清单2:在不同线程中post和转发一个Notification@interface ViewController ()@property (nonatomic) NSMutableArray *notifications; // 通知队列@property (nonatomic) NSThread *notificationThread; // 期望线程@property (nonatomic) NSLock *notificationLock; // 用于对通知队列加锁的锁对象,避免线程冲突@property (nonatomic) NSMachPort *notificationPort; // 用于向期望线程发送信号的通信端口@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];NSLog(@"current thread = %@", [NSThread currentThread]);// 初始化self.notifications = [[NSMutableArray alloc] init];self.notificationLock = [[NSLock alloc] init];self.notificationThread = [NSThread currentThread];self.notificationPort = [[NSMachPort alloc] init];self.notificationPort.delegate = self;// 往当前线程的run loop添加端口源// 当Mach消息到达而接收线程的run loop没有运行时,则内核会保存这条消息,直到下一次进入run loop[[NSRunLoop currentRunLoop] addPort:self.notificationPortforMode:(__bridge NSString *)kCFRunLoopCommonModes];[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(processNotification:) name:@"TestNotification" object:nil];dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{[[NSNotificationCenter defaultCenter] postNotificationName:TEST_NOTIFICATION object:nil userInfo:nil];});}- (void)handleMachMessage:(void *)msg {[self.notificationLock lock];while ([self.notifications count]) {NSNotification *notification = [self.notifications objectAtIndex:0];[self.notifications removeObjectAtIndex:0];[self.notificationLock unlock];[self processNotification:notification];[self.notificationLock lock];};[self.notificationLock unlock];}- (void)processNotification:(NSNotification *)notification {if ([NSThread currentThread] != _notificationThread) {// Forward the notification to the correct thread.[self.notificationLock lock];[self.notifications addObject:notification];[self.notificationLock unlock];[self.notificationPort sendBeforeDate:[NSDate date]components:nilfrom:nilreserved:0];}else {// Process the notification here;NSLog(@"current thread = %@", [NSThread currentThread]);NSLog(@"process notification");}}@end运行后,其输出如下:2015-03-11 23:38:31.637 test[1474:92483] current thread = {number = 1, name = main}2015-03-11 23:38:31.663 test[1474:92483] current thread = {number = 1, name = main}2015-03-11 23:38:31.663 test[1474:92483] process notification可以看到,我们在全局dispatch队列中抛出的Notification,如愿地在主线程中接收到了。这种实现方式的具体解析及其局限性大家可以参考官方文档Delivering Notifications To Particular Threads,在此不多做解释。当然,更好的方法可能是我们自己去子类化一个NSNotificationCenter,或者单独写一个类来处理这种转发。NSNotificationCenter的线程安全性苹果之所以采取通知中心在同一个线程中post和转发同一消息这一策略,应该是出于线程安全的角度来考量的。官方文档告诉我们,NSNotificationCenter是一个线程安全类,我们可以在多线程环境下使用同一个NSNotificationCenter对象而不需要加锁。原文在Threading Programming Guide中,具体如下:The following classes and functions are generally considered to be thread-safe. You can use the same instance from multiple threads without first acquiring a lock.NSArray...NSNotificationNSNotificationCenter我们可以在任何线程中添加/删除通知的观察者,也可以在任何线程中post一个通知。NSNotificationCenter在线程安全性方面已经做了不少工作了,那是否意味着我们可以高枕无忧了呢?再回过头来看看第一个例子,我们稍微改造一下,一点一点来:代码清单3:NSNotificationCenter的通用模式@interface Observer : NSObject@end@implementation Observer- (instancetype)init{self = [super init];if (self){_poster = [[Poster alloc] init];[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification:) name:TEST_NOTIFICATION object:nil]}return self;}- (void)handleNotification:(NSNotification *)notification{NSLog(@"handle notification ");}- (void)dealloc{[[NSNotificationCenter defaultCenter] removeObserver:self];}@end// 其它地方[[NSNotificationCenter defaultCenter] postNotificationName:TEST_NOTIFICATION object:nil];上面的代码就是我们通常所做的事情:添加一个通知监听者,定义一个回调,并在所属对象释放时移除监听者;然后在程序的某个地方post一个通知。简单明了,如果这一切都是发生在一个线程里面,或者至少dealloc方法是在-postNotificationName:的线程中运行的(注意:NSNotification的post和转发是同步的),那么都OK,没有线程安全问题。但如果dealloc方法和-postNotificationName:方法不在同一个线程中运行时,会出现什么问题呢?我们再改造一下上面的代码:代码清单4:NSNotificationCenter引发的线程安全问题#pragma mark - Poster@interface Poster : NSObject@end@implementation Poster- (instancetype)init{self = [super init];if (self){[self performSelectorInBackground:@selector(postNotification) withObject:nil];}return self;}- (void)postNotification{[[NSNotificationCenter defaultCenter] postNotificationName:TEST_NOTIFICATION object:nil];}@end#pragma mark - Observer@interface Observer : NSObject{Poster *_poster;}@property (nonatomic, assign) NSInteger i;@end@implementation Observer- (instancetype)init{self = [super init];if (self){_poster = [[Poster alloc] init];[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification:) name:TEST_NOTIFICATION object:nil];}return self;}- (void)handleNotification:(NSNotification *)notification{NSLog(@"handle notification begin");sleep(1);NSLog(@"handle notification end");self.i = 10;}- (void)dealloc{[[NSNotificationCenter defaultCenter] removeObserver:self];NSLog(@"Observer dealloc");}@end#pragma mark - ViewController@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];__autoreleasing Observer *observer = [[Observer alloc] init];}@end这段代码是在主线程添加了一个TEST_NOTIFICATION通知的监听者,并在主线程中将其移除,而我们的NSNotification是在后台线程中post的。在通知处理函数中,我们让回调所在的线程睡眠1秒钟,然后再去设置属性i值。这时会发生什么呢?我们先来看看输出结果:2015-03-14 00:31:41.286 SKTest[932:88791] handle notification begin2015-03-14 00:31:41.291 SKTest[932:88713] Observer dealloc2015-03-14 00:31:42.361 SKTest[932:88791] handle notification end(lldb)// 程序在self.i = 10处抛出了"Thread 6: EXC_BAD_ACCESS(code=EXC_I386_GPFLT)"经典的内存错误,程序崩溃了。其实从输出结果中,我们就可以看到到底是发生了什么事。我们简要描述一下:当我们注册一个观察者是,通知中心会持有观察者的一个弱引用,来确保观察者是可用的。主线程调用dealloc操作会让Observer对象的引用计数减为0,这时对象会被释放掉。后台线程发送一个通知,如果此时Observer还未被释放,则会向其转发消息,并执行回调方法。而如果在回调执行的过程中对象被释放了,就会出现上面的问题。当然,上面这个例子是故意而为之,但不排除在实际编码中会遇到类似的问题。虽然NSNotificationCenter是线程安全的,但并不意味着我们在使用时就可以保证线程安全的,如果稍不注意,还是会出现线程问题。那我们该怎么做呢?这里有一些好的建议:尽量在一个线程中处理通知相关的操作,大部分情况下,这样做都能确保通知的正常工作。不过,我们无法确定到底会在哪个线程中调用dealloc方法,所以这一点还是比较困难。注册监听都时,使用基于block的API。这样我们在block还要继续调用self的属性或方法,就可以通过weak-strong的方式来处理。具体大家可以改造下上面的代码试试是什么效果。使用带有安全生命周期的对象,这一点对象单例对象来说再合适不过了,在应用的整个生命周期都不会被释放。使用代理。
:软件需求文档格式的标准写法 1.引言 1.1 编写目的 · 阐明开发本软件的目的; 1.2 项目背景 · 标识待开发软件产品的名称、代码; · 列出本项目的任务提出者、项目负责人、系统分析员、系统设计员、程序设计员、程序员、资料员以及与本项目开展
你下载xcode,xcode里面的帮助文档就是开发的光放文档,不需要花钱的,你也可以访问网址:
希望对你有所帮助。
一个完整的App开发需要哪些技术?在回答这个问题之前,我们首先要了解App都有哪些类型,不同的类型适用于哪些需求,用户可以根据自己的需求选择不同的App开发。
一、 App有哪些形式
WebApp:简单来说,Web App就是针对iOS/Android优化后的web站点,用户不需要下载安装即可访问。一般的web站点测重使用网页技术在移动端做展示,包括文字,视频,图片等,而Web App更侧重“功能”,是基于网页技术开发实现特定功能的应用,必须依赖手机浏览器运行。Web App开发成本低,维护更新简单,支持云修复,用户不用下载更新,但是App的用户体验不足,页面跳转迟钝甚至卡壳,页面交互动态效果不灵活,而且可能上不了AppStore,如果企业的核心功能不多,App需求侧重于信息查询,浏览等基础功能,可以选择Web App。
Native App(原生App):Native App是基于智能手机操作系统(现在主流的是ios和Android)用原生程序编写运营的App。Native App运行时是基于本地操作系统的,所以它的兼容能力和访问能力更好,拥有最佳的用户体验、最好的交互界面,但也是开发难度最大,开发成本和维护成本最高的App。
Hybrid App(混合App):是指半原生半web的混合类App,同时采用网页语言和程序语言进行开发,通过不同的应用商店进行打包分发,用户需要下载安装使用。Hybrid App兼具Native App良好的用户交互体验和web App跨平台开发的优势,因在开发过程中使用网页语言,所以开发成本和难度大大降低。Native App是现在的主流应用,大型的App如淘宝/掌上百度/微信都是走的Hybrid App路线。
二、开发不同类型的App需要用到哪些技术?
Web App:iOS/Android的内置浏览器是基于webkit内核的,所以在开发webApp时,多数使用html或html5、CSS3、JavaScript技术做UI布局,使其在网站页面上实现传统的C/S架构软件功能,服务端技术用java、php、ASP。现在也有很多一键生成webApp的平台,如百度siteApp/移动开发平台APICloud,APICloud平台提供基于腾讯x5浏览器引擎生成webApp,因为移动端的超级流量入口微信/手机qq等用的也是腾讯x5内置浏览器,所以用腾讯x5浏览器生成的App在移动页面展示时适配于微信的浏览体验,这样可以帮助webApp引流。
Native App:
开发Native App需要根据运行的手机系统采用不同的开发语言,开发Android App需要的开发语言是java,还需要熟悉Android环境和机制。主要知识点如下:
1. 开发环境,Android Studio、eclipse.如何搭建Android开发环境可以去百度。
2. 数据结构,App的某些功能涉及到做算法,所以要有一定的数学基础
3. Android SDK,会API接口开发,包括自行开发API的能力和调用第三发API的经验。
4. 熟悉tcp、IP,socket等网络协议
5. 如果涉及到服务器,你还需要了解webservice相关知识和相应的开发语言,常用有PHP、JSP、ASP.Net.
6. 除了这些功能基础,App开发还涉及到UI设计、框架、性能优化、调试适配等。
Objective-C是开发iOS系统App的主流编程语言,开发者一般用苹果公司的iOS SDK搭建开发环境,iOS SDK是开发iOS应用程序中不可少的软件开发包,提供了从创建程序,到编译、调试、运行、测试等多种开发过程中需要等工具。学习iOS开发可以去看苹果官方文档,这是最权威的ios教程。
Hybrid App:混合开发中主流的是以web为主体型的开发,即以网页语言编写,穿插Native功能的hybrid App开发类型,网页语言主要有html5、CSS3、JavaScript。Web主体型的App用户体验好坏,取决于底层中间件的交互与跨平台的能力。国内外有很多优秀的开发工具,如国外的AppmAkr、Appmobi,国内的APICloud,APICloud的底层引擎用Deep Engine,使用半翻译式原理,将运行中的web翻译成Native API,并且支持扩展API,开发时可调用用原生语言开发的功能模块,以此达到媲美原生App的用户体验,同时节省开发时间。
对企业来说,可以根据自己的需求选择不同的开发类型和开发工具,目前来看,Hybrid App已经成为移动开发趋势,一方面Hybrid App开发时不采用或者大部分不采用原生语言,却能拥有原生应用的特性,一方面随着web技术的发展,Hybrid App技术已经成熟,很多大型App淘宝、微信、携程都属于这种开发模式,Hybrid App给企业移动应用的开发、维护、更新都带来了极高的便捷性,从成本投入用户体验考虑,Hybrid App都是首选。