??先扯一點(diǎn)其他的東西。蘋果爸爸永遠(yuǎn)是你爸爸。公司的APP上周被蘋果審核拒絕了,條款是5.2.1。原文在這里。
The seller and company names associated with your app do not reflect the name of the health insurance provider in the app or its metadata, as required by Guideline 5.2.1 of the App Store Review Guidelines.
Next Steps
Your app must be published under a seller name and company name that reflects the health insurance provider name. If you have developed this app on behalf of a client, please advise your client to add you to the development team of their Apple Developer account. If your client does not yet have an Apple Developer account, they can enroll in the Apple Developer Program through the Apple Developer portal.
Note that submitting documentation showing permission to publish this app on behalf of the content owner or institution will not resolve this issue. This app must be submitted under the content owner’s own Apple Developer account.
To request a fee waiver for nonprofit organizations, accredited educational institutions, or U.S.-based government entities, follow the steps outlined on the Apple Developer Program Membership Fee Waivers page.
Once created, you cannot change your seller name or company name in iTunes Connect. For assistance with changing your company name or seller name, you will need to contact iTunes Connect through the Contact Us page. Select Getting Started from the first dropdown menu, then select General iTunes Connect Inquiry to contact the appropriate iTunes Connect team.
??最開始公司的開發(fā)賬號是個(gè)人級別賬號,APP是金融保險(xiǎn)類。個(gè)人賬號不能發(fā)布金融相關(guān)的APP,所以用科技信息公司的名義申請了公司級別的賬號。但是在上周提交APP的時(shí)候,卻被沒有金融保險(xiǎn)資質(zhì)的理由給打了回來?,F(xiàn)在要以保險(xiǎn)經(jīng)紀(jì)公司的名義(有保險(xiǎn)專業(yè)代理許可證 )去申請新的賬號,下午打電話咨詢蘋果,蘋果表示現(xiàn)在申請鄧白氏編碼需要5到7個(gè)工作日(以前需要14個(gè)工作日),然后蘋果還需要2個(gè)工作日,才能將鄧白氏編碼的信息同步到數(shù)據(jù)庫。還有申請賬號和提交審核新的APP都需要時(shí)間。要是放在平時(shí)沒有什么關(guān)系,但是年前原生開發(fā)最后一個(gè)版本,有個(gè)重要的功能是要實(shí)現(xiàn)紅包雨。這個(gè)時(shí)間和風(fēng)險(xiǎn)都擔(dān)不起,iOS是發(fā)不了版本了,所以上面最終決定用H5開發(fā)紅包雨功能。
??但是iOS已經(jīng)將功能開發(fā)的差不多了,參考文章iOS紅包雨實(shí)現(xiàn)總結(jié)。雖然沒有什么技術(shù)難點(diǎn),動畫平時(shí)用的非常少,還是把它記錄下來。先來看看效果。

??由兩個(gè)部分組成,第一部分是張圖片和一個(gè)倒計(jì)時(shí)。一會還有一個(gè)定時(shí)器下落紅包,用不同的方式實(shí)現(xiàn)。
- (void)startTime
{
__block int timeout = 5;
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(), ^{
[self startRedPackerts];
});
}
else
{
NSString * titleStr = [NSString stringWithFormat:@"%d",timeout];
dispatch_async(dispatch_get_main_queue(), ^{
self.countdownLab.text = titleStr;
});
timeout--;
}
});
dispatch_resume(_timer);
}
??倒計(jì)時(shí)結(jié)束后就開始下紅包雨,紅包雨的動畫用CALayer來實(shí)現(xiàn)。紅包CALayer的contents設(shè)置為紅包的圖片就行。1秒鐘下落4個(gè)紅包,動畫分為兩個(gè)部分,第一個(gè)部分是位移動畫,第二部分是旋轉(zhuǎn)動畫。
- (void)startRedPackerts
{
[self touchView];
self.timer = [NSTimer scheduledTimerWithTimeInterval:(1/4.0) target:self selector:@selector(showRain) userInfo:nil repeats:YES];
[self.timer invalidate];
}
- (void)showRain
{
UIImageView * imageV = [UIImageView new];
imageV.image = [UIImage imageNamed:@"rp_normal"];
imageV.frame = CGRectMake(0, 0, 44 , 62.5 );
self.moveLayer = [CALayer new];
self.moveLayer.bounds = imageV.frame;
self.moveLayer.anchorPoint = CGPointMake(0, 0);
self.moveLayer.position = CGPointMake(0, -62.5 );
self.moveLayer.contents = (id)imageV.image.CGImage;
[self.touchView.layer addSublayer:self.moveLayer];
[self addAnimation];
}
- (void)addAnimation
{
CAKeyframeAnimation * moveAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
NSValue * A = [NSValue valueWithCGPoint:CGPointMake(arc4random() % 414, 0)];
NSValue * B = [NSValue valueWithCGPoint:CGPointMake(arc4random() % 414, SCREEN_HEIGHT)];
moveAnimation.values = @[A,B];
moveAnimation.duration = arc4random() % 200 / 100.0 + 3.5;
moveAnimation.repeatCount = 1;
moveAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
[self.moveLayer addAnimation:moveAnimation forKey:nil];
CAKeyframeAnimation * tranAnimation = [CAKeyframeAnimation animationWithKeyPath:@"transform"];
CATransform3D r0 = CATransform3DMakeRotation(M_PI/180 * (arc4random() % 360 ) , 0, 0, -1);
CATransform3D r1 = CATransform3DMakeRotation(M_PI/180 * (arc4random() % 360 ) , 0, 0, -1);
tranAnimation.values = @[[NSValue valueWithCATransform3D:r0],[NSValue valueWithCATransform3D:r1]];
tranAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
tranAnimation.duration = arc4random() % 200 / 100.0 + 3.5;
//為了避免旋轉(zhuǎn)動畫完成后再次回到初始狀態(tài)。
[tranAnimation setFillMode:kCAFillModeForwards];
[tranAnimation setRemovedOnCompletion:NO];
[self.moveLayer addAnimation:tranAnimation forKey:nil];
}
??紅包下落完成后,關(guān)閉倒計(jì)時(shí),移除layer動畫
- (void)endAnimation
{
[self.timer invalidate];
for (NSInteger i = 0; i < self.touchView.layer.sublayers.count ; i ++)
{
CALayer * layer = self.touchView.layer.sublayers[i];
[layer removeAllAnimations];
}
}
??然后再看看紅包的點(diǎn)擊事件。UIView可以響應(yīng)事件,但是CALayer不行??梢越o背景視圖添加手勢,然后根據(jù)手勢的落點(diǎn),來判斷是第幾個(gè)紅包。后臺接口控制哪個(gè)紅包的類型,根據(jù)類型再展示不同的效果,后面的代碼根據(jù)不同的業(yè)務(wù)場景在來實(shí)現(xiàn)。
- (void)clickRed:(UITapGestureRecognizer *)sender
{
CGPoint point = [sender locationInView:self.touchView];
for (int i = 0 ; i < self.touchView.layer.sublayers.count ; i ++)
{
CALayer * layer = self.touchView.layer.sublayers[i];
if ([[layer presentationLayer] hitTest:point] != nil)
{
NSLog(@"%d",i);
BOOL hasRedPacketd = !(i % 3) ;
UIImageView * newPacketIV = [UIImageView new];
if (hasRedPacketd)
{
newPacketIV.image = [UIImage imageNamed:@"rp_yes"];
newPacketIV.frame = CGRectMake(0, 0, 63.5, 74);
}
else
{
newPacketIV.image = [UIImage imageNamed:@"rp_no"];
newPacketIV.frame = CGRectMake(0, 0, 45.5, 76.5);
}
layer.contents = (id)newPacketIV.image.CGImage;
UIView * alertView = [UIView new];
alertView.layer.cornerRadius = 5;
alertView.frame = CGRectMake(point.x - 50, point.y, 100, 30);
[self.touchView addSubview:alertView];
UILabel * label = [UILabel new];
label.font = [UIFont systemFontOfSize:17];
if (!hasRedPacketd)
{
label.text = @"旺旺年!人旺旺";
label.textColor = [UIColor whiteColor];
}
else
{
NSString * string = [NSString stringWithFormat:@"+%d金幣",i];
NSString * iString = [NSString stringWithFormat:@"%d",i];
NSMutableAttributedString * attributedStr = [[NSMutableAttributedString alloc]initWithString:string];
[attributedStr addAttribute:NSFontAttributeName
value:[UIFont systemFontOfSize:27]
range:NSMakeRange(0, 1)];
[attributedStr addAttribute:NSFontAttributeName
value:[UIFont fontWithName:@"PingFangTC-Semibold" size:32]
range:NSMakeRange(1, iString.length)];
[attributedStr addAttribute:NSFontAttributeName
value:[UIFont systemFontOfSize:17]
range:NSMakeRange(1 + iString.length, 2)];
label.attributedText = attributedStr;
label.textColor = RGBA(255,223,14, 1);
}
[alertView addSubview:label];
[label mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerX.equalTo(alertView.mas_centerX);
make.centerY.equalTo(alertView.mas_centerY);
}];
[UIView animateWithDuration:1 animations:^{
alertView.alpha = 0;
alertView.frame = CGRectMake(point.x- 50, point.y - 100, 100, 30);
} completion:^(BOOL finished) {
[alertView removeFromSuperview];
}];
}
}
}