2018-11-30 15:29:46 qq_31810357 阅读数 6665
  • iOS开发-全面解析iOS蓝牙BLE4.0开发

    只要你会OC基础,会写HelloWorld,你就可以实现iOS的蓝牙通信功能,实现蓝牙小项目也不在话下,作者会带领大家详细分析BLE4.0原理,通过分析xcode使用的蓝牙API,让学者能够得心应手的实现蓝牙BLE4.0的开发

    3672 人正在学习 去看看 许英俊

Guideline 4.2.2 - Design - Minimum Functionality

We noticed that your app only includes links, images, or content aggregated from the Internet with limited or no native iOS functionality. Although this content may be curated from the web specifically for your users, since it does not sufficiently differ from a mobile web browsing experience, it is not appropriate for the App Store.

Next Steps

We encourage you to review your app concept and work towards creating an app that offers customers an engaging and lasting experience that also meets the App Store’s high expectations for quality and functionality.

Apple Developer includes a variety of design and development resources. Download iOS templates from Apple UI Design Resources, learn more about crafting intuitive, well-designed apps with the Design Video collection, and review the iOS Human Interface Guidelines for best practices to follow when designing apps for the App Store.

准则4.2.2 - 设计 - 最小功能

我们注意到您的应用仅包含从互联网汇总的链接,图片或内容,具有有限或无本机iOS功能。虽然此内容可能是专门为您的用户从网站上提取的,但由于它与移动网络浏览体验没有太大区别,因此它不适合App Store。

下一步

我们鼓励您检查您的应用程序概念,并努力创建一个应用程序,为客户提供引人入胜的持久体验,同时满足App Store对质量和功能的高期望。

Apple Developer包含各种设计和开发资源。从Apple UI Design Resources下载iOS模板,了解有关使用Design Video集合制作直观,精心设计的应用程序的更多信息,并查看iOS人机界面指南,了解在为App Store设计应用程序时要遵循的最佳实践。

分析原因及解决方案:

注意1:苹果官方查看这个问题,不是用苹果手机查看,而是用 ipad 进行查看!所以我们在查看的时候要用ipad而不要用iphone进行测试!

注意2:另外,ipad现在都不更新了,问题挺多,最好用 ipad mini , ipad air , ipad pro 这三个系列的本进行操作!

我们知道纯H5+的App早在2017年下半年就开始不允许上架了, 所以建议修改部分界面, 添加原生代码, 如:添加: 原生关于我们, 隐私协议, 免责声明, 部分app使用教程诸如此类原生界面;

如果本身就是原生的, 建议邮件沟通, 建立沟通比一味的修改更有效!

如果有问题可加文章头部qq群咨询!

关注小专栏: https://xiaozhuanlan.com/iOSDeveloper 彻底解决上架问题

2017-12-04 23:57:53 YCM1101743158 阅读数 1193
  • iOS开发-全面解析iOS蓝牙BLE4.0开发

    只要你会OC基础,会写HelloWorld,你就可以实现iOS的蓝牙通信功能,实现蓝牙小项目也不在话下,作者会带领大家详细分析BLE4.0原理,通过分析xcode使用的蓝牙API,让学者能够得心应手的实现蓝牙BLE4.0的开发

    3672 人正在学习 去看看 许英俊

编者:这么多人还在为PLA1.2(Apple Developer Program License Agreement)/Guideline5.2.1(App Store Review Guidelines)烦恼(实在看不下去了~),特为大家奉上此篇,不用凭运气过的官方解决通道

注:编者在某次上架时,先被PLA1.2拒了,在和审核人员沟通的过程中,她又发了一个Guideline5.2.1作为拒绝的理由。原来,苹果审核人员认为上架账号所属公司是第三方开发者的时候出现金融资质问题,会拒绝并返回PLA1.2;苹果审核人员认为上架账号所属公司是App开发者公司、并且出现知识产权问题的,会拒绝上架并返回Guideline5.2.1。所以PLA1.2和Guideline5.2.1本质是一致的,以下以PLA1.2来讲解。

PLA1.2官方拒绝(又见Apple常用拒绝模板~扎心)

回复并添加附件进行相关说明(老套提示:附件名必须是英文,否则上传不上哦),App Store审核妹纸打电话过来(普通话说得比我还飘~准~~),明确告诉我说,App Store官方审核人员贷款/理财类APP上架,必须有两个条件:

(1)App上架账号所属公司,必须是放贷/理财公司本身,不能是第三方;

(2)App上的放贷/理财产品,必须是上架账号所属放贷/理财公司的。

然后明确告诉我,换个有金融资质的账号就可以秒上了。既然有审核妹纸的指引,那解决问题就是分分钟的事了:

(1)把公司账号换成有金融资质的(幸好我有~~);

(2)没有资质的:

①本身不做贷款服务、属于用户与贷款方之间的中介方公司(即市面上大多贷款超市类App制作商),可以用与自己合作的贷款公司的名义注册Apple账号,然后通过这个账号上架。不过上架的时候需要通过后台控制相关参数。

②通过有资质账号的朋友上架,或者花钱找第三方上架。不过更新风险较大,编者不推荐这种方式。

③编者猜想的一个方法,可以试试:将App里的公司名全部改为上架账号所属公司,App名和公司一致(不一致请看第四点),然后上传审核(不用传营业执照)。审核通过后通过后台控制切换公司名。

(3)产品必须是上架账号所属放贷/理财公司的(幸好也是自己的~~)。注:贷款超市类App里的第三方产品此处需要注意。

当然,期间也向她反映过:为啥App Store里有网络科技有限公司上了App,明显没有金融资质的嘛。然后审核妹纸回复:你是对的,的确存在这样的漏网之鱼,但这不能成为你上架的理由~~~

好吧,这很Apple,谁叫你美呢~~~
参考http://www.jianshu.com/p/9d8723740ecd

(4)App名字和开发账号(公司账号)所属公司名不一致,这个时候上传软著。如果没有软著,就写个保证(承诺)函 ,盖上公司大印,上传苹果,同时说明“xxxApp隶属于xxx公司,保函见附件”即可。

(5)如果App中有其他公司名,把App里所有出现的公司和本公司的合作合同/协议,上传合作合同/协议首页和末页(盖章的),并说明关系,即可避免PLA1.2问题。

(6)如果你们公司不存在竞争对手举报这种情况的话,可以尝试A/B面:隐藏敏感词汇,苹果审核过了之后再在后台放开。不过app更新版本的时候,用户也会看到屏蔽掉的假数据,这里需要处理一下。

当然,如果你读完上面两点审核条件、六个解决方案之后,还有疑问的,可在下方留言。

注:

①金融资质,通俗地讲就是App发布账号所属公司可以放款;

②没有资质的童鞋,请参照解决方案第二点的三个解决方法;

③Apple审核提速了,在没有其它问题的情况下,一晚上便可以通过审核。如果你想体验十几分钟通过审核,可以尝试在晚上9:00~早上6:00这个时间段提交审核。当然,为了保险,你也可以把加急审核申请单提交上去。

④换了有资质账号上架遇到4.3被拒的,请更换BundleID重新提交即可。































                                
2019-01-21 10:30:19 heqiang2015 阅读数 3837
  • iOS开发-全面解析iOS蓝牙BLE4.0开发

    只要你会OC基础,会写HelloWorld,你就可以实现iOS的蓝牙通信功能,实现蓝牙小项目也不在话下,作者会带领大家详细分析BLE4.0原理,通过分析xcode使用的蓝牙API,让学者能够得心应手的实现蓝牙BLE4.0的开发

    3672 人正在学习 去看看 许英俊

App Store审核被拒问题,及其解决方案
1、Guideline 2.1 - Information Needed
2、Guideline 2.5.13 - Performance - Software Requirements
3、Guideline 3.2.1 - Business - Other Business Model Issues - Acceptable
4、Guideline 4.1 - Design - Copycats
5、Guideline 4.2.3 - Design - Minimum Functionality
6、Guideline 5.1.1 - Legal - Privacy - Data Collection and Storage
7、Guideline 5.1.2 - Legal - Privacy - Data Use and Sharing
8、Guideline 5.2.1 - Legal - Intellectual Property


Guideline 2.1 - Information Needed
准则2.1 -所需资料 (2.1大礼包)

1.1.6 - Include false information, features, or misleading metadata.
1.1.6 -包含错误信息、特性或误导性元数据。
2.3.0 - Undergo significant concept changes after approval
2.3.0 -批准后进行重大概念变更
2.3.1 - Have hidden or undocumented features, including hidden “switches” that redirect to a gambling or lottery website
2.3.1 -具有隐藏或未文档化的特性,包括可重定向到赌博或彩票网站的隐藏“开关”
3.1.1 - Use payment mechanisms other than in-app purchase to unlock features or functionality in the app
3.1.1 -使用app内购买以外的支付机制解锁app内的功能
4.3.0 - Are a duplicate of another app or are conspicuously similar to another app
4.3.0 -是另一款应用的复制品或与另一款应用明显相似
5.2.1 - Were not submitted by the legal entity that owns and is responsible for offering any services provided by the app
5.2.1 - app提供的任何服务并非由拥有并负责提供服务的法人实体提交
5.3.4 - Do not have the necessary licensing and permissions for all the locations where the app is used
5.3.4 -不具备使用本应用程序的所有地点的必要许可和权限

解决方法:
1、如果有上述7中问题,一定要检查清楚去做出修改,哪怕随便修改一下,如果原封不动的邮件申述+提交,直接会回复你的应用和上次提交的应用一样。
2、如果没有问题,那就放心大胆的去申述,先说明没有上述7中问题,再说让他们指明到底是哪里错了。模板如下:
尊敬的苹果审核团队:
感谢您的耐心审核, 对于您提到的7个审核条款, 我们做了仔细的排查, 我们现在对此回复如下:
1.1.6:我们并没有包含虚假信息,和误导用户的功能,全都是真实的。
2.3.0:我们没有在通过后修改任何概念和功能。
2.3.1:我们没有切换到任何赌博或彩票的网站,我们是原生App
3.1.1:我们游戏内都是使用的苹果支付,并没有使用任何第三方支付。
4.3.0:我们的游戏内容都是我们自己开发的, 并不存在抄袭或者大量相似。
5.2.1:我们的App并没有法人实体和版权的风险。
5.3.4:我们的App也并没有使用任何定位相关功能和权限。
如有问题,请明确指出问题所在,方便我们后续解决,因此应用后续大量推广工作,请尽快回复我们,邮箱:XXX 电话:XXX ,谢谢。


Guideline 2.5.13 - Performance - Software Requirements

We noticed that your app includes facial recognition for account authentication but uses a facial recognition technology other than LocalAuthentication.
Next Steps
To resolve this issue, please revise your app to use LocalAuthentication for any account authentication based on facial recognition.
Resources
Visit Apple Developer for resources on using LocalAuthentication to request authentication from users.
我们注意到您的应用程序包含用于帐户身份验证的面部识别,但使用的是与本地身份验证不同的面部识别技术。
下一个步骤
为了解决这个问题,请修改您的应用程序,使用LocalAuthentication进行基于面部识别的任何帐户身份验证。
资源
访问Apple Developer获取关于使用LocalAuthentication请求用户进行身份验证的资源。

因为我们项目里用到了第三方人脸识别face++,但是苹果条款里:2.5.13 使用人脸识别进行帐户验证的 app 必须使用 LocalAuthentication (而非 ARKit 或其他人脸识别技术),且必须对未满 13 岁的用户使用备用身份验证方式。
解决方案
把他们提到的人脸识别给隐藏了(当审核通过之后,再展示出来)。


Guideline 3.2.1 - Business - Other Business Model Issues - Acceptable
准则3.2.1 -业务-其他业务模型问题-可接受

理财或者借贷金融资质的问题。说明这个已经不存在App里公司名字与账号所属公司名字不一致的问题。
解决方法:
请使用有对应资质的账号上传App


Guideline 4.1 - Design - Copycats
准则4.1 -设计-模仿者

This app or its metadata appears to be attempting to misrepresent itself as another popular app or game already available on the App Store or a third-party platform.
Apps submitted to the App Store should be unique and should not attempt to deceive users into thinking they are downloading something they are not.
The next submission of this app may require a longer review time, and this app will not be eligible for an expedited review until this issue is resolved.
这款应用或其元数据似乎试图将自己伪装成app Store或第三方平台上已有的另一款流行应用或游戏。
提交到App Store的应用程序应该是独一无二的,不应该试图欺骗用户,让他们以为自己下载的是不存在的东西。
此应用程序的下一次提交可能需要较长的审核时间,在此问题解决之前,此应用程序将不符合加急审核的条件。

解决方法:
1.准备APP的相关运营授权、音频文件使用授权–证明APP的合法授权
2.准备游戏角色、UI、音视频等素材截图–证明原创素材
3.向Apple官方申诉具体的违规部分还请明示,并明确说明以上合法授权、原创素材等信息。
加急、申述地址:https://developer.apple.com/contact/app-store/


Guideline 4.2.3 - Design - Minimum Functionality
准则4.2.3 -设计-最小功能

这个被拒原因是由于APP有QQ及微信第三方登录功能,但苹果审核团队未安装QQ或者微信客户端导致的。
解决方法:
判断手机是否安装QQ和微信,从而显示隐藏QQ、微信第三方登录按钮。具体如下:
在这里插入图片描述


Guideline 5.1.1 - Legal - Privacy - Data Collection and Storage
准则5.1.1 -法律-隐私-数据收集和存储

解决方法:
使用友好语句说明为什么要使用这些权限,通用格式是“需要(干什么)是否允许此App获取你的(对应权限)”,例如:
1、请求定位权限(Privacy - Photo Library Usage Description)- 需要获取个人位置进行天气预报是否允许此App获取你的定位?
2、请求相机权限(Privacy - Location Always Usage Description):“需要获取个人照片进行编辑是否允许此App获取相册权限?”


Guideline 5.1.2 - Legal - Privacy - Data Use and Sharing
准则5.1.2 -法律-隐私-数据使用和共享

要使用您的应用收集个人数据,您必须向用户明确其个人数据将上传至您的服务器,并且您必须获得用户的同意才能上传数据。您还必须拥有隐私政策URL,并确保您提供的URL将用户引导至您的隐私政策。
解决方法:
添加隐私政策跳转链接


Guideline 5.2.1 - Legal - Intellectual Property
准则5.2.1 -法律-知识产权

App里展示的公司跟发布App的账号所属公司不一致,或者App里面没有体现发布App的账号所属公司
解决:请排查你的App是否有没处理掉的细节点(icon,名字等等)

2019-07-31 14:53:58 wang1018960145 阅读数 171
  • iOS开发-全面解析iOS蓝牙BLE4.0开发

    只要你会OC基础,会写HelloWorld,你就可以实现iOS的蓝牙通信功能,实现蓝牙小项目也不在话下,作者会带领大家详细分析BLE4.0原理,通过分析xcode使用的蓝牙API,让学者能够得心应手的实现蓝牙BLE4.0的开发

    3672 人正在学习 去看看 许英俊

上一篇后台播放静音音频,在生产上还是有点用处的,如果不是客户自己手动杀掉APP 一般还是能在后台保存很久的。下面这个是根据之前的稍作修改主要是针对swift4.2以后使用

创建

AudioManager.swift

import Foundation
import AVFoundation
import UIKit
class AudioManager: NSObject {
    
    static let shared = AudioManager()
    fileprivate let audioSession = AVAudioSession.sharedInstance()
    fileprivate var backgroundAudioPlayer: AVAudioPlayer?
    fileprivate var backgroundTimeLength = 0
    fileprivate var timer: Timer?
    
    // 是否开启后台自动播放无声音乐
    var openBackgroundAudioAutoPlay = false {
        didSet {
            if self.openBackgroundAudioAutoPlay {
                self.setupAudioSession()
                self.setupBackgroundAudioPlayer()
            } else {
                if let player = self.backgroundAudioPlayer {
                    if player.isPlaying {
                        player.stop()
                    }
                }
                self.backgroundAudioPlayer = nil
                try? self.audioSession.setActive(false, options:  AVAudioSession.SetActiveOptions.notifyOthersOnDeactivation)
            }
        }
    }
    
    override init() {
        super.init()
        self.setupListener()
    }
    deinit {
        NotificationCenter.default.removeObserver(self)
    }
    private func setupAudioSession() {
        do {
            try self.audioSession.setCategory(AVAudioSession.Category.playback, options: AVAudioSession.CategoryOptions.mixWithOthers)
            try self.audioSession.setActive(false)
        } catch let error {
            debugPrint("\(type(of:self)):\(error)")
        }
    }
    private func setupBackgroundAudioPlayer() {
        do {
            self.backgroundAudioPlayer = try AVAudioPlayer(contentsOf: URL(fileURLWithPath: Bundle.main.path(forResource: "WhatYouWant", ofType: "mp3")!))
            debugPrint(Bundle.main.path(forResource: "WhatYouWant", ofType: "mp3")!)
        } catch let error {
            debugPrint("\(type(of:self)):\(error)")
        }
        self.backgroundAudioPlayer?.numberOfLoops = -1
        self.backgroundAudioPlayer?.volume = 1
        self.backgroundAudioPlayer?.delegate = self
    }
    
//主要修改了这里
    private func setupListener() {
        
        NotificationCenter.default.addObserver(self, selector: #selector(didEnterBackground), name: UIApplication.didEnterBackgroundNotification, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(didBecomeActive), name: UIApplication.didBecomeActiveNotification, object: nil)
        
        NotificationCenter.default.addObserver(self, selector: #selector(audioSessionInterruption(notification:)), name: AVAudioSession.interruptionNotification, object: nil)
        
       
    }
    
}

// MARK: - 扩展 监听通知
extension AudioManager {
    /// 进入后台 播放无声音乐
    @objc public func didEnterBackground() {
        self.setupTimer()
        guard self.openBackgroundAudioAutoPlay else {return}
        
        do {
            try self.audioSession.setActive(true)
        } catch let error {
            debugPrint("\(type(of:self)):\(error))")
        }
        self.backgroundAudioPlayer?.prepareToPlay()
        self.backgroundAudioPlayer?.play()
    }
    
    /// 进入前台,暂停播放音乐
    @objc public func didBecomeActive() {
        self.removeTimer()
        self.hintBackgroundTimeLength()
        self.backgroundTimeLength = 0
        guard self.openBackgroundAudioAutoPlay else {return}
        
        self.backgroundAudioPlayer?.pause()
        do {
            try self.audioSession.setActive(false, options:  AVAudioSession.SetActiveOptions.notifyOthersOnDeactivation)
        } catch let error {
            debugPrint("\(type(of:self)):\(error))")
        }
        
        
    }
    
    /// 音乐中断处理
    @objc fileprivate func audioSessionInterruption(notification: NSNotification) {
        guard self.openBackgroundAudioAutoPlay else {return}
        guard let userinfo = notification.userInfo else {return}
        guard let interruptionType: UInt = userinfo[AVAudioSessionInterruptionTypeKey] as! UInt?  else {return}
        if interruptionType == AVAudioSession.InterruptionType.began.rawValue {
            // 中断开始,音乐被暂停
            debugPrint("\(type(of:self)): 中断开始 userinfo:\(userinfo)")
        } else if interruptionType == AVAudioSession.InterruptionType.ended.rawValue {
            // 中断结束,恢复播放
            debugPrint("\(type(of:self)): 中断结束 userinfo:\(userinfo)")
            guard let player = self.backgroundAudioPlayer else {return}
            if player.isPlaying == false {
                debugPrint("\(type(of:self)): 音乐未播放,准备开始播放")
                do {
                    try self.audioSession.setActive(true)
                } catch let error {
                    debugPrint("\(type(of:self)):\(error)")
                }
                player.prepareToPlay()
                player.play()
            } else {
                debugPrint("\(type(of:self)): 音乐正在播放")
            }
        }
    }
}
// MARK: - 扩展 定时器任务
extension AudioManager {
    fileprivate func setupTimer() {
        self.removeTimer()
        self.timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(timerTask), userInfo: nil, repeats: true)
        RunLoop.main.add(self.timer!, forMode: RunLoop.Mode.common)
//         RunLoop.main.add(self.timer!, forMode: RunLoop.Mode.init(rawValue: ""))
    }
    fileprivate func removeTimer() {
        self.timer?.invalidate()
        self.timer = nil;
    }
    @objc func timerTask() {
        self.backgroundTimeLength += 1
    }
    fileprivate func hintBackgroundTimeLength() {
        let message = "本次后台持续时间:\(self.backgroundTimeLength)s"
        HintTool.hint(message)
    }
}

// MARK: - 扩展 播放代理
extension AudioManager: AVAudioPlayerDelegate {
    func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
        
    }
    func audioPlayerDecodeErrorDidOccur(_ player: AVAudioPlayer, error: Error?) {
        debugPrint("\(type(of:self))" + error.debugDescription)
    }
}

再写个提示工具

HintTool.swift

import UIKit


class HintTool {
    
    private var hintView: UIView?
    
    static let shared = HintTool()
    
    static func hint(_ message: String) {
        self.shared.showHintView(hintView: self.hintView(with: message))
    }
    
    private func showHintView(hintView: UIView) {
        guard let window = UIApplication.shared.delegate?.window else {return}
        guard self.hintView == nil else {return}
        
        window!.addSubview(hintView)
        window!.bringSubviewToFront(hintView)
        self.hintView = hintView
        
        // 消失
        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 2) {
            [weak self] in
            UIView.animate(withDuration: 0.5, animations: {
                [weak self] in
                self?.hintView?.alpha = 0.5
                }, completion: { (finished) in
                    self?.hintView?.removeFromSuperview()
                    self?.hintView = nil
            })
        }
    }
    
    private static func hintView(with message: String) -> UIView {
        let minWidth = 180.0
        let maxWidth = 260.0
        let padding = 10.0
        let font = UIFont.systemFont(ofSize: 14)
        
        let messageSize = message.ext_size(withBoundingSize: CGSize(width: maxWidth-2*padding, height: 0) , font: font)
        
        let labelFrame = CGRect(x: 0, y: 0, width: CGFloat(ceilf(Float(messageSize.width))), height: CGFloat(ceilf(Float(messageSize.height))))
        let viewFrame = CGRect(x: 0, y: 0, width: max(minWidth, Double(messageSize.width) + padding*2), height: Double(messageSize.height) + padding*2)
        
        let hintView = UIView()
        hintView.isUserInteractionEnabled = false
        hintView.backgroundColor = UIColor(white: 0, alpha: 0.7)
        hintView.layer.cornerRadius = 8
        hintView.layer.masksToBounds = true
        hintView.frame = viewFrame
        hintView.center = CGPoint(x: CGFloat(ceilf(Float(UIScreen.main.bounds.size.width*0.5))), y: CGFloat(ceilf(Float(UIScreen.main.bounds.size.height-100.0))))
        
        let hintLabel = UILabel()
        hintView.addSubview(hintLabel)
        hintView.isUserInteractionEnabled = false
        hintLabel.text = message
        hintLabel.textColor = UIColor.white
        hintLabel.textAlignment = .center
        hintLabel.font = font
        hintLabel.preferredMaxLayoutWidth = messageSize.width
        hintLabel.numberOfLines = 0
        hintLabel.frame = labelFrame
        hintLabel.center = CGPoint(x: CGFloat(ceilf(Float(hintView.bounds.size.width*0.5))), y: CGFloat(ceilf(Float(hintView.bounds.size.height*0.5))))
        
        return hintView
    }
}

extension String {
    func ext_size(withBoundingSize boundingSize: CGSize, font: UIFont) -> CGSize {
        let option = NSStringDrawingOptions.usesLineFragmentOrigin
        let attributes = [NSAttributedString.Key.font : font]
        let contentSize = self.boundingRect(with: boundingSize, options: option, attributes: attributes, context: nil).size
        return contentSize
    }
}

 

在viewcontroller里使用 

import UIKit
import AVFoundation

let kBackgroundAudioAutoPlayOpenString = "后台自动播放音乐 - 开启"
let kBackgroundAudioAutoPlayCloseString = "后台自动播放音乐 - 关闭"

class ViewController: UIViewController {
    
    let backgroundModeBtn = UIButton()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.backgroundModeBtn.setTitle(kBackgroundAudioAutoPlayOpenString, for: .normal)
        self.backgroundModeBtn.setTitleColor(UIColor.black, for: .normal)
        self.backgroundModeBtn.addTarget(self, action: #selector(backgroundModeBtnDidClick), for: .touchUpInside)
        self.backgroundModeBtn.backgroundColor = UIColor.cyan
        self.view.addSubview(self.backgroundModeBtn)
        
        AudioManager.shared.openBackgroundAudioAutoPlay = false
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        self.backgroundModeBtn.sizeToFit()
        self.backgroundModeBtn.center = self.view.center
    }
    @objc func backgroundModeBtnDidClick() {
        guard let title = self.backgroundModeBtn.title(for: .normal) else {return}
        
        if title == kBackgroundAudioAutoPlayOpenString {
            AudioManager.shared.openBackgroundAudioAutoPlay = true
            self.backgroundModeBtn.setTitle(kBackgroundAudioAutoPlayCloseString, for: .normal)
        } else {
            AudioManager.shared.openBackgroundAudioAutoPlay = false
            self.backgroundModeBtn.setTitle(kBackgroundAudioAutoPlayOpenString, for: .normal)
        }
    }
    
    func didBecomeActive() {
        debugPrint("\(type(of:self)): 11111")
    }
    
}

在applegate里初始化

  private func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        
        AudioManager.shared.openBackgroundAudioAutoPlay = true
        return true
    }

最后代码在此 传送门

2017-05-25 14:13:47 DaMing_XiaoZhi 阅读数 944
  • iOS开发-全面解析iOS蓝牙BLE4.0开发

    只要你会OC基础,会写HelloWorld,你就可以实现iOS的蓝牙通信功能,实现蓝牙小项目也不在话下,作者会带领大家详细分析BLE4.0原理,通过分析xcode使用的蓝牙API,让学者能够得心应手的实现蓝牙BLE4.0的开发

    3672 人正在学习 去看看 许英俊
Guideline 5.2.4 - Legal

Your app includes a contest that provides Apple products as prizes. The offer can be found at 首页.

Apps that include such offerings create a misleading association with Apple Inc.

Please see attached screenshots for details.

To resolve this issue, please revise the contest, and its rules, to remove Apple products as the prizes. This will eliminate the association with Apple Inc. and the suggestion that Apple sponsors, or is otherwise involved, in the contest.


相信公司在搞活动的时候, 比如抽奖, 有时候会已iPhone手机作为奖品赠送,   但是往往这样的提交appstore审核的时候,. 会被苹果拒绝.....  主要原因是:   苹果很注重自己公司的产品所有权,  已经产品的名誉问题....

 看到有很多帖子, 给出的解决方案, 就是在活动开始页面, 或者活动的规则页面, 发布一下声明信息, 就是本次活动所有涉及到的奖品均和苹果公司无关....

但是我们尝试过还是没有通过审核.... 也尝试过其他的方案, 同样没有解决此问题,  最后一样都是被苹果拒绝... 

经过协商交流后, 大致是知道,  苹果不允许iPhone手机作为奖品, 不管是否声明和苹果无关, 都不可以上线的

所以.....很头疼, 真想iphone手机作为礼品赠送, 且上线的话,    可以通过服务端一个动态的接口, 控制一个活动入口, 是否隐藏, 来逃过苹果的审核, 上线以后再放出活动的入口.


朋友....你有更好的方案, 请告知我, 甚是感激

没有更多推荐了,返回首页