十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
APP的入门门槛并不高,但要想做的好,却并不容易。
创新互联公司是专业的海棠网站建设公司,海棠接单;提供网站制作、网站建设,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行海棠网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!
首先需要了解用户需求,这是APP开发的第一步,你的用户是谁,他们需要什么,最需要什么。思考好需求以后,就可以按不同的路线走了。
如下图所示:
第二步,进行产品的规格设计。可以是简单的框线图。一旦确定了产品规格,在APP未正式上线之前,都不会再改动了。除非下定决定推翻重来。
如下图所示:
第三部,进行产品的视觉设计,需要使用Photoshop、ai、FW等软件设计,现在一般都是平面化的设计,这种设计的好处就是用户对待平面化的审美比较统一,很少会说:“不好看”。
如下图所示:
第四步,进行产品构架,分为前端后后台,前端就是使用android\ios\等开发语言按照之前做好的产品规格进行开发,后台则是处理业务逻辑和为前端提供存储和查询的接口。
如下图所示:
第五步,测试。对APP的功能进行使用,测试是否存在明显的问题,如果有的话安排时间进行BUG修改。将APP上传至测试平台,测试他在上百款手机上的表现,并试图解决最严重的缺陷。
第六部,上线。在各大应用中心注册账户,上传APP资料,对外分发你的APP。
当然android的应用市场比较多了,苹果的只有一个AppStore。
做完这些,APP就开发完成了。随着使用的用户越来越多,根据用户反馈,对APP进行完善,还有很多工作要做。
一个APP从构思到开发、上线,要经历的过程还很长,要分析的问题也很多,这里也简单说一下吧,感兴趣可以了解一下:
构思APP产品,与每个人的经历、经验、智商、情商、人际网络不通,都不一样。所以也很难说谁对谁错,但有一点,就是要敢于尝试,我见过很多人,只知道想,却能拖了几年都不行动的。我想等到智能手机从市场上消失了,他可能还在构思。
其次,APP项目看似简单,但实际开发中的问题却不少,你需要一个很好的产品经理或者是项目经理,市场上有很多这种人才,但适合你的可能是百里挑一或千里挑一,如果你本人就是,那你就要做好跟技术人员的沟通,合理的安排他们的编码,让他们找到开发的乐趣。做项目管控是一门学问,简单的概括就是“执行力”。做好产品规格和产品开发计划,就能严格的按照计划完成,无论遇到什么问题,都可以跨越的能力。
第三,APP上线后,肯定会遇到一个问题,就是根本没人用你的APP。那么如何推广和营销,就成了那个阶段的问题。如果你是一个大牛,在社会上能够一呼百应,或者是含着金钥匙的,那可以跳过。如果是一个普通人,就建议从第一个用户开始。提供给你的用户,哪怕就一个人,最好的服务,你需要的是让你的用户成为你的广播,口碑相传。这样才有可能走的下去。
祝你早日成功。
最近购入了某米的一台安卓机,使用了一段时间安卓系统后,发现iOS系统的动画效果还是很好的。好吧进入正题
UIView Animation 实际上是对 Core Animation(核心动画) 的封装.使用UIView动画十分简单
UIViewAnimationOptions 动画效果枚举
动画效果相关
时间函数曲线相关
转场动画相关
增加关键帧的方法
UIViewKeyframeAnimationOptions 的枚举值
关键帧动画栗子????
单个视图的过渡效果
从旧视图转到新视图的动画效果
fromView 会从父视图中移除,并将toView 添加到父视图中
公司需要新上架的APP基本情况:
1.行业内使用的APP,是客户定制的产品。
2.App没有注册功能,由企业客户的超级管理员通过后台来创建管理员工账户。
总体来说经历了三轮被拒后成功上架。
第一轮, 新品上架被拒,苹果的邮件包含1.回答问题2.提供展示视频3.info.plist定位的描述不全。
苹果邮件内容:
解决方法:
这里我改了info.plist中的定位功能的描述,重新打包上传,选择新的构建版本,然后在备注里添加了展示视频的百度网盘链接及密码,然后重新提交审核。这里操作完后方案解决中心邮件回复的发送按钮消失,于是我没有回答2.1的问题。这里可能是因为选择了新的构建版本重新提交了审核,所以上个版本的问题就结束了。
第二轮 ,苹果给了新的邮件,元数据被拒,邮件回复即可,先是给了2.1(和第一轮一样) 然后又给了3.2,判定为内部app建议用apple企业账号进行分发,最后我给苹果的回复说app还没完善后续会加上注册功能,目前网页端可以注册(怕说平台超级管理员创建账户又被苹果判断为内部而拒审),结果苹果回复让提供网页注册链接。。。然后就没有然后了。
以下是与苹果的邮件来往回复内容:
这次感觉问题就坏在2.1时的回复,还怕人家没法理解中文,还用了他问题中的用户类型描述的英文原文,感觉他列举的常见用户类型前两个都不能写,如果是这两个中的一个就判定你是内部应用不能在App Store上架。
解决办法:
因为3.2后面的对话也进行不下去了,于是在APP Store Connect里删除APP,换一个BundleID重新上架,保险起见我还更换了APP名称和图标。然后等待审核团队回复。这里参考了 iOS审核被拒Guideline 3.2 - Business、1.2 - Safety
删除APP的方法:
点击左侧综合-App信息,页面最下方有移除App
第三轮 ,第二次新品上架,审核团队给了个2.1。
解决方法:
纯邮件回复即可,这次要注意避雷,千万不要说什么定制、指定客户等敏感词汇。这次我小心回复,说明了后台管理账户的情况,并截图了后台账户管理的界面,截图中标记了提供给审核团队的测试账户,以及标记了添加账户按钮。这次很顺利一次通过直接上架了。
以下为与苹果邮件来往回复内容:
解决流程总结:
第一轮 没有邮件回复2.1问题,修改了2.1指出的plist定位描述问题,5.1提供一个app操作录屏视频上传到百度网盘,在提审界面的备注中留百度网盘链接密码即可。
第二轮 对于2.1的app面向用户类型以及获取账户方式的回答错误,导致后面出现3.2,然后对于3.2的回复继续出错,才采取了删除app换bundleID上架的解决方法。
第三轮中对于2.1的回答才是正确的。
拒审问题总结:
1.2.1的问题如实回答,但切记如果你还想上架到App Store,就要避免定制、指定用户等词汇引导苹果认为你的app为内部使用。
2.关于用户如何获得账户,如果app没有注册功能,一定要证明你的app是可以通过其它途径创建账户的,并提供充分证明。(参考第三轮中的回复)
3.如果遇到3.2,也不必慌,证明自己的app是提供给普通用户的,无法通过分发来安装,如果你也是没有注册功能,解决方法同上2,如果还是被拒就只能删除app换个BundleID重新上架了。(参考第二轮中的解决方法)
4.关于要求提供展示视频,网上有说视频要上传到油管,我试了放到百度网盘也是可以通过的,关于视频内容,尽可能详尽的展示app的主要功能,一般要求你提供视频就说明你的app比较复杂或者涉及的不是通用领域,审核人员不知道如何下手,让审核人员免去费力理解你的app如何使用,以这个为目标自己斟酌如何录制操作视频。
1、统一收键盘的方法
[[[UIApplication sharedApplication] keyWindow] endEditing:YES];
2、提示框
BBAlertView *alert = [[BBAlertView alloc] initWithStyle:BBAlertViewStyleDefault
Title:@"删除订单"
message:@"是否删除订单,"
customView:nil
delegate:self
cancelButtonTitle:L(@"取消")
otherButtonTitles:L(@"确认")];
[alert setCancelBlock:^{
}];
[alert setConfirmBlock:^{
[self orderDidRemovePressDown:tempDic Index:index.section];
}];
[alert show];
3、图片的自适应功能
self.brandImage.contentMode = UIViewContentModeScaleAspectFit;
4、cocoaPods清除缓存问题
$ sudo rm -fr ~/.cocoapods/repos/master
$ pod setup
5、设置显示键盘的样式
textView.keyboardType =UIKeyboardTypeDefault;
//设置键盘右下角为完成(中文输入法下)
textView.returnKeyType=UIReturnKeyDone;
6、输出当前时间
NSDateFormatter * dateFormatter=[[NSDateFormatter alloc]init];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss.SSS"];
NSLog(@"当前毫秒时间1==%@",[dateFormatter stringFromDate:[NSDate date]]);
7、显示两秒然后消失
UILabel * lab=[[UILabel alloc]initWithFrame:CGRectMake(60,Main_Screen_Height-64-49-60, Main_Screen_Width-120, 50)];
lab.backgroundColor=[UIColor grayColor];
ViewRadius(lab, 20);
lab.textAlignment=NSTextAlignmentCenter;
lab.text=@"请先进行实名制验证";
[self.view addSubview:lab];
[UILabel animateWithDuration:2 animations:^{
lab.alpha=0;
}completion:^(BOOL finished) {
[lab removeFromSuperview];
}];
8、设置placeholder属性的大小和颜色
[_phoneFie setValue:[UIColor grayColor] forKeyPath:@"_placeholderLabel.textColor"];
[_phoneFie setValue:[UIFont boldSystemFontOfSize:15] forKeyPath:@"_placeholderLabel.font"];
_phoneFie.returnKeyType=UIReturnKeyDone;
9、设置cell的交互完全不可以使用
//[cellTwo setUserInteractionEnabled:NO];
//设置cell不可以点击,但是上面的子控件可以交互
cellTwo.selectionStyle=UITableViewCellSelectionStyleNone;
10、将textField的placeholder 属性的字体向右边移动5
_field.leftView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10*Width_375, _field.frame.size.height)];
_field.leftViewMode = UITextFieldViewModeAlways;
11、开新线程使按钮上的时间变化
-(void)startTime{
__block int timeout=60; //倒计时时间
UIButton * btn=(UIButton *)[self.view viewWithTag:1000];
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_source_t _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,queue);
dispatch_source_set_timer(_timer,dispatch_walltime(NULL, 0),1.0*NSEC_PER_SEC, 0); //每秒执行
dispatch_source_set_event_handler(_timer, ^{
if(timeout=0){
dispatch_source_cancel(_timer);
dispatch_async(dispatch_get_main_queue(), ^{
[btn setTitle:@"发送验证码" forState:UIControlStateNormal];
btn.enabled = YES;
});
}else{
// int minutes = timeout / 60;
int miao = timeout % 60;
if (miao==0) {
miao = 60;
}
NSString *strTime = [NSString stringWithFormat:@"%.2d", miao];
dispatch_async(dispatch_get_main_queue(), ^{
[btn setTitle:[NSString stringWithFormat:@"剩余%@秒",strTime] forState:UIControlStateNormal];
btn.enabled = NO;
});
timeout--;
}
});
dispatch_resume(_timer);
}
12、隐藏TableView 中多余的行
UIView * view=[[UIView alloc]initWithFrame:CGRectZero];
[_tabelView setTableFooterView:view];
13、UIView添加背景图片
UIImage * image=[UIImage imageNamed:@"friend750"];
headSeV.layer.contents=(id)image.CGImage;
14、UITableView取消选中状态
[tableView deselectRowAtIndexPath:indexPath animated:YES];// 取消选中
15、带属性的字符串
NSFontAttributeName 字体
NSParagraphStyleAttributeName 段落格式
NSForegroundColorAttributeName 字体颜色
NSBackgroundColorAttributeName 背景颜色
NSStrikethroughStyleAttributeName 删除线格式
NSUnderlineStyleAttributeName 下划线格式
NSStrokeColorAttributeName 删除线颜色
NSStrokeWidthAttributeName 删除线宽度
NSShadowAttributeName 阴影
1. 使用实例
UILabel *testLabel = [[UILabel alloc]initWithFrame:CGRectMake(0, 100, 320, 30)];
testLabel.backgroundColor = [UIColor lightGrayColor];
testLabel.textAlignment = NSTextAlignmentCenter;
NSMutableAttributedString *AttributedStr = [[NSMutableAttributedString alloc]initWithString:@"今天天气不错呀"];
[AttributedStr addAttribute:NSFontAttributeName
value:[UIFont systemFontOfSize:16.0]
range:NSMakeRange(2, 2)];
[AttributedStr addAttribute:NSForegroundColorAttributeName
value:[UIColor redColor]
range:NSMakeRange(2, 2)];
testLabel.attributedText = AttributedStr;
[self.view addSubview:testLabel];
16、加大按钮的点击范围
把UIButton的frame 设置的大一些,然后给UIButton设置一个小些的图片
[tmpBtn setImageEdgeInsets:UIEdgeInsetsMake(5, 5, 5, 5)];
// 注意这里不能用setBackgroundImage
[tmpBtn setImage:[UIImage imageNamed:@"testBtnImage"] forState:UIControlStateNormal];
17、//避免self的强引用
__weak ViewController *weakSelf = self;
18、//类别的创建
command +n ——Objective-C File———(File Type 选择是类别还是扩展)———(Class 选择为哪个控件写类别)
19、修改UITableview 滚动条颜色的方法
self.tableView.indicatorStyle=UIScrollViewIndicatorStyleWhite;
20、利用UIWebView显示pdf文件
webView = [[UIWebView alloc]initWithFrame:CGRectMake(0, 0, 320, 480)];
[webView setDelegate:self];
[webView setScalesPageToFit:YES];
[webViewsetAutoresizingMask:UIViewAutoresizingFlexibleWidth |UIViewAutoresizingFlexibleHeight];
[webView setAllowsInlineMediaPlayback:YES];
[self.view addSubview:webView];
NSString *pdfPath = [[NSBundle mainBundle]pathForResource:@"ojc" ofType:@"pdf"];
NSURL *url = [NSURLfileURLWithPath:pdfPath];
NSURLRequest *request = [NSURLRequestrequestWithURL:url
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:5];
[webView loadRequest:request];
21、将plist文件中的数据赋给数组
NSString *thePath = [[NSBundle mainBundle]pathForResource:@"States" ofType:@"plist"];
NSArray *array = [NSArrayarrayWithContentsOfFile:thePath];
22、隐藏状态栏
[[UIApplication shareApplication]setStatusBarHidden: YES animated:NO];
23、给navigation Bar 设置title颜色
UIColor *whiteColor = [UIColor whiteColor];
NSDictionary *dic = [NSDictionary dictionaryWithObject:whiteColor forKey:NSForegroundColorAttributeName];
[self.navigationController.navigationBar setTitleTextAttributes:dic];
24、使用AirDrop 进行分享
NSArray *array = @[@"test1", @"test2"];
UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:array applicationActivities:nil];
[self presentViewController:activityVC animated:YES
completion:^{
NSLog(@"Air");
}];
25、把tableview里面Cell的小对勾的颜色改成别的颜色
_mTableView.tintColor = [UIColor redColor];
26、UITableView去掉分割线
_tableView.separatorStyle = NO;
27、正则判断手机号码地址格式
- (BOOL)isMobileNumber:(NSString *)mobileNum {
// 电信号段:133/153/180/181/189/177
// 联通号段:130/131/132/155/156/185/186/145/176
// 移动号段:134/135/136/137/138/139/150/151/152/157/158/159/182/183/184/187/188/147/178
// 虚拟运营商:170
NSString *MOBILE = @"^1(3[0-9]|4[57]|5[0-35-9]|8[0-9]|7[06-8])\\d{8}$";
NSPredicate *regextestmobile = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", MOBILE];
return [regextestmobile evaluateWithObject:mobileNum];
}
28、控制交易密码位数
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
if (textField.text.length =6){
[MBProgressHUD showMessage:@"密码为6位" afterDelay:1.8];
return NO;
}
return YES;
}
29、判断是不是空
if ([real_name isKindOfClass:[NSNull class]] ) {
return NO;}
30、点击号码拨打电话
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://400966220"]];
31、控制UITabbar的选择哪一个
[self.tabBarController setSelectedIndex:1];
32、获取当前App的版本号
NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
CFShow(infoDictionary);
// app名称
NSString *app_Name = [infoDictionary objectForKey:@"CFBundleDisplayName"];
// app版本
NSString *app_Version = [infoDictionary objectForKey:@"CFBundleShortVersionString"];
// app build版本
NSString *app_build = [infoDictionary objectForKey:@"CFBundleVersion"];
33、苹果app权限NSPhotoLibraryUsageDescriptionApp需要您的同意,才能访问相册NSCameraUsageDescriptionApp需要您的同意,才能访问相机NSMicrophoneUsageDescriptionApp需要您的同意,才能访问麦克风NSLocationUsageDescriptionApp需要您的同意,才能访问位置NSLocationWhenInUseUsageDescriptionApp需要您的同意,才能在使用期间访问位置NSLocationAlwaysUsageDescriptionApp需要您的同意,才能始终访问位置NSCalendarsUsageDescriptionApp需要您的同意,才能访问日历NSRemindersUsageDescriptionApp需要您的同意,才能访问提醒事项NSMotionUsageDescriptionApp需要您的同意,才能访问运动与健身NSHealthUpdateUsageDescriptionApp需要您的同意,才能访问健康更新NSHealthShareUsageDescriptionApp需要您的同意,才能访问健康分享NSBluetoothPeripheralUsageDescriptionApp需要您的同意,才能访问蓝牙NSAppleMusicUsageDescriptionApp需要您的同意,才能访问媒体资料库
34、控件设置边框
_describText.layer.borderColor = [[UIColor colorWithRed:215.0 / 255.0 green:215.0 / 255.0 blue:215.0 / 255.0 alpha:1] CGColor];
_describText.layer.borderWidth = 1.0;
_describText.layer.cornerRadius = 4.0;
_describText.clipsToBounds = YES;
35、//隐藏电池条的方法
-(BOOL)prefersStatusBarHidden{
return YES;
}
36、延时操作
[NSThread sleepForTimeInterval:2];
方法二:
[self performSelector:@selector(delayMethod) withObject:nil afterDelay:1.5];
37、系统风火轮:
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO; //隐藏
38、//didSelectRowAtIndexPath:方法里面找到当前的Cell
AssessMentCell * cell = [tableView cellForRowAtIndexPath:indexPath];
39、navigation上返回按钮的颜色以及返回按钮后面文字去掉
//返回按钮后边文字去掉
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60)
forBarMetrics:UIBarMetricsDefault];
//设置左上角返回按钮的颜色
self.navigationController.navigationBar.tintColor = UIColorFromRGB(0x666666);
40、lineBreakMode //设置文字过长时的显示格式
label.lineBreakMode = NSLineBreakByCharWrapping;以字符为显示单位显
示,后面部分省略不显示。
label.lineBreakMode = NSLineBreakByClipping;剪切与文本宽度相同的内
容长度,后半部分被删除。
label.lineBreakMode = NSLineBreakByTruncatingHead;前面部分文字
以……方式省略,显示尾部文字内容。
label.lineBreakMode = NSLineBreakByTruncatingMiddle;中间的内容
以……方式省略,显示头尾的文字内容。
label.lineBreakMode = NSLineBreakByTruncatingTail;结尾部分的内容
以……方式省略,显示头的文字内容。
label.lineBreakMode = NSLineBreakByWordWrapping;以单词为显示单位显
示,后面部分省略不显示。