使用 CloudKit/iCloud 时 Apple Store 构建被拒绝

     2023-02-23     34

关键词:

【中文标题】使用 CloudKit/iCloud 时 Apple Store 构建被拒绝【英文标题】:Apple Store build rejected while using CloudKit/iCloud 【发布时间】:2016-04-22 04:45:11 【问题描述】:

我刚刚将我的应用提交到 Apple Store,但由于以下问题而未能提交,我对如何解决它感到很困惑。

来自 Apple - 17.2 详细信息 - 我们注意到您的应用要求用户 使用个人信息注册以访问非基于帐户的 特征。应用程序在允许之前不能要求用户注册 访问未关联的应用内容和功能 专门针对用户的。

后续步骤 - 需要共享个人信息的用户注册 信息必须是可选的或与特定帐户相关联 功能。此外,所要求的信息必须是 与功能相关。

我的应用程序使用 CloudKit 来保存、检索和共享记录。但该应用程序本身不要求任何个人详细信息,也不共享任何个人详细信息,如电子邮件、姓名、出生日期……,它只是要求用户在设备上拥有一个活动的 iCloud 帐户。然后 CloudKit 使用 iCloud 凭据才能工作。

它变得令人困惑,因为:

1 - 我无法更改 CloudKit 的工作方式并停止要求用户登录 iCloud。每个使用 CloudKit 的应用都需要一个登录 iCloud 的用户。

2 - 与其他应用程序(例如 facebook)一样,如果您不登录,该应用程序将无法从根本上运行。因此,登录与特定功能无关,而是与应用程序的整个功能相关。

每次应用启动时都会在初始屏幕(进入应用功能区域之前)调用下面的代码示例,以确保用户使用 iCloud。如果用户有 iCloud,我会带他进入应用程序。如果不是,我会阻止他并要求他对 iCloud 进行排序。但我想这就是他们在这里抱怨的——“需要共享个人信息的用户注册必须是可选的,或者与特定于帐户的功能相关联。此外,所请求的信息必须与功能相关。”。

这让我自己陷入了一个相当混乱的境地。不知道如何解决这个问题。有人对 CloudKit/iCloud/AppStore 提交有类似的问题吗?有什么见解吗?

iCloud 校验码如下:

   func cloudKitCheckIfUserIsAuthenticated (result: (error: NSError?, tryAgain: Bool, takeUserToiCloud: Bool) -> Void)

        let container = CKContainer.defaultContainer()
        container.fetchUserRecordIDWithCompletionHandler
            (recordId: CKRecordID?, error: NSError?) in
            dispatch_async(dispatch_get_main_queue()) 
                if error != nil
                
                    if error!.code == CKErrorCode.NotAuthenticated.rawValue
                    
                        // user not on icloud, taki him there
                        print("-> cloudKitCheckIfUserIsAuthenticated - error fetching ID - not on icloud")
// ERROR, USER MUST LOGIN TO ICLOUD - LOCK HIM OUTSIDE THE APP
                        result(error: error, tryAgain: false, takeUserToiCloud: true)
                    
                    print("-> cloudKitCheckIfUserIsAuthenticated - error fetching ID - other error \(error?.description)")
// OTHER ERROR, TRY AGAIN
                    result(error: error, tryAgain: true, takeUserToiCloud: false)
                
                else
                
                    let publicDatabase = CKContainer.defaultContainer().publicCloudDatabase
                    publicDatabase.fetchRecordWithID(recordId!,
                        completionHandler: (record: CKRecord?, error: NSError?) in


                            if error != nil
                            
                                // error getting user ID, try again
                                print("-> cloudKitCheckIfUserIsAuthenticated - error fetching user record - Error \(error)")
// ERROR, TRY AGAIN
                                result(error: error, tryAgain: true, takeUserToiCloud: false)
                            
                            else
                            
                                if record!.recordType == CKRecordTypeUserRecord
                                
                                    // valid record
                                    print("-> cloudKitCheckIfUserIsAuthenticated - fetching user record - valid record found)")
                                    // TAKE USER INSIDE APP

                                    result(error: error, tryAgain: false, takeUserToiCloud: false)
                                
                                else
                                
                                    // not valid record
                                    print("-> cloudKitCheckIfUserIsAuthenticated - fetching user record - The record that came back is not a user record")
// ERROR, TRY AGAIN
                                    result(error: error, tryAgain: true, takeUserToiCloud: false)
                                
                            
                    )
                
            
        
    

【问题讨论】:

您应该考虑用户已明确关闭 iCloud 的场景。她将无法使用您的应用,并且没有其他替代方法可以登录您的应用。在 Facebook 等应用程序中,未注册用户可以选择注册。 IMO,您应该考虑使用社交网络等其他机制添加登录,除了 iCloud/在您的应用程序中添加 1-2 个无需 iCloud 的功能,以便它可用于该用户子集 '每个使用 CloudKit 的应用程序都需要一个登录 iCloud 的用户。' - 这不适用于容器的公共数据库端。只有在开发和测试过程中,您才需要登录 iCloud 访问公共数据库。您的应用程序应无需登录即可访问公共数据库。也许这就是 Apple 的 17.2 所暗示的——(只是一个推测性的想法。) @Vin 我听从了您的建议,该应用已获得批准。不必使用其他机制登录。我让用户在应用程序的静态屏幕上导航,但为了保存或加载所需数据库用户必须使用 iCloud 签名的屏幕。基本上,用户进入应用程序,但在设置 iCloud 之前几乎什么都做不了。似乎这对他们来说很好。 很高兴它成功了。你现在可以用你的经验自己回答这个问题了:) 【参考方案1】:

最初,我的应用程序会要求用户在启动屏幕上登录 iCloud。如果用户没有 iCloud 帐户功能,他们将无法进入应用程序。

解决方案

让用户进入应用程序并点击主要部分。事实上,该应用程序完全没用,但用户可以看到它是奇怪的空白屏幕,而无法保存或加载任何内容。当他们尝试加载或保存内容时,我会提示他们需要登录 iCloud 以使应用程序可用。

实际成果

我不认为苹果的变更请求为用户体验增加了任何价值。事实上,它只是增加了用户理解他能做什么和不能做什么的复杂性。

例如,如果用户不提供他的个人详细信息,Facebook 会将用户锁定在外面,因为没有这些数据,应用程序绝对没有用,这就是我的情况......你可以说用户应该能够进入内部,但他会看到什么或做什么?然后,您将不得不处理此 UX 构建的所有异常,并向用户发出警告,以便在令人讨厌的警告模式下到处解决帐户问题。

所以我不确定 Facebook“如何”获得批准,但我不能。

虽然我的应用获得了批准,但我不同意 Apple 的反馈以任何方式改进了应用。

【讨论】:

使用联合查询时出错

】使用联合查询时出错【英文标题】:Gettingerroronquerieswithunion【发布时间】:2018-04-1017:34:39【问题描述】:我在下面的两个查询中进行了联合,但得到了错误:ORA-00932:不一致的数据类型:预期-得到CLOBSQL看起来像这样:SELECTA.EMPLID... 查看详情

使用pymssql时如何传递连接参数“ApplicationIntent=ReadOnly”

】使用pymssql时如何传递连接参数“ApplicationIntent=ReadOnly”【英文标题】:Howtopassconnectionparameter"ApplicationIntent=ReadOnly"whenusingpymssql【发布时间】:2016-06-2916:31:36【问题描述】:我只有对SQLServer数据库的只读访问权限。使用py... 查看详情

uwsgi 和烧瓶 - 无法导入名称“appl”

】uwsgi和烧瓶-无法导入名称“appl”【英文标题】:uwsgiandflask-cannotimportname"appl"【发布时间】:2015-12-2403:06:24【问题描述】:我创建了几个服务器,没有任何问题,堆栈nginx-uwsgi-flaskusingvirtualenv。当前一个uwsgi抛出错误cannot... 查看详情

UIPickerView - 循环数据

...【发布时间】:2014-09-2615:26:00【问题描述】:我目前正在使用Swift开发一个应用程序,其中我使用UIPickerView,请参见下面的图片。目前UIPickerView在用户滚动到最后一个数据时停止,但我希望它永远不会停止。我希望可以从第一个... 查看详情

Pl Sql 过程在使用 oracle 调度程序进行调度时处理异常

】PlSql过程在使用oracle调度程序进行调度时处理异常【英文标题】:PlSqlProcedurehandleexceptionwhilescheduledusingoraclescheduler【发布时间】:2015-11-2008:57:29【问题描述】:我已经编写了一个将使用Oracle调度程序进行调度的过程,并且正在... 查看详情

call()和appl()的理解

每个函数都包含两个非继承而来的方法:apply()和call()1.这两个方法的用途:在特定的作用域中调用函数,实际上等于设置函数体内this对象的值(1)apply()方法接收两个参数:一个是在其中运行函数的作用域,里一个是参... 查看详情

使用本地系统应用程序池标识时,进程仅适用于 Web 应用程序

】使用本地系统应用程序池标识时,进程仅适用于Web应用程序【英文标题】:ProcessonlyworksfromWebApplicationwhenusingLocalSystemApplicationPoolIdentity【发布时间】:2013-05-0508:10:37【问题描述】:我有一个试图从我的ASP.NetWeb应用程序运行的命... 查看详情

在播放 1.2.5 时遇到路由问题

...配置了我的路由文件-以下是相关的路由文件部分和正在使用的URL:网址:GET/application/autoComplete?term=mac路线:GET/autoComplete/termcontrollers.Appl 查看详情

问题编程环境fatalerror:security/pam_appl.h

【问题】今天在docker中基于centos镜像的容器编译gogs遇到错误似乎缺少库文件【解决】yum-yinstallpam-devel 查看详情

springboot配置文件application.yml注意事项(failedtoloadpropertysourcefromlocation'classpath:/appl

这种加载yml文件失败的原因多是配置文件的格式出现了错误 参考:https://blog.csdn.net/linjy520/article/details/79455842springboot配置文件application.yml注意事项(Failedtoloadpropertysourcefromlocation‘classpath:/applica)  查看详情

绘制数据帧时,x轴不显示[重复](代码片段)

...嗨我有一个数据框,日期作为索引作为共享作为列我想要使用日期作为x轴绘制特定共享。我要绘制的系列是:df['APPL']=Date2018-10-2924.9033472018-10-3025.1653842018-10-3125.0877442018-11-0124.777180...2018-12-0625.709999但是当我用df['APPL'].plot(use_index=T... 查看详情

使用 ngrok 和 MAMP Pro 对我的 php 项目进行隧道传输时,如何获得正确的文档根目录?

】使用ngrok和MAMPPro对我的php项目进行隧道传输时,如何获得正确的文档根目录?【英文标题】:HowtoIgetthecorrectdocumentrootwhentunnelingmyphpprojectusingngrokandMAMPPro?【发布时间】:2017-06-0409:49:28【问题描述】:我正在尝试使用ngrok来隧道... 查看详情

Xcode:运行 XC 单元测试时,模块名称“”不是有效标识符

...Cunittest【发布时间】:2017-07-2420:49:07【问题描述】:尝试使用SDWebImage设置我的CocoaPods运行XCTest,我只能看到如下错误。有什么建议吗?:0:错误:模块名称“”不是有效的标识符命令/Appl 查看详情

使用 Pan Gesture 将 UIView 拖到 UIBezierPath 上

】使用PanGesture将UIView拖到UIBezierPath上【英文标题】:DragUIViewoverUIBezierPathwithPanGesture【发布时间】:2020-07-2705:50:13【问题描述】:我使用UIBezierPath创建了一个图表。它基本上是一段时间内的货币换算图。因此用户可以拖动手指来... 查看详情

显示按字母顺序排列的搜索结果时如何修改行数

...esults【发布时间】:2015-11-0311:06:24【问题描述】:我正在使用DataTables创建一个能够动态过滤上下文的表。我正在遵循基本示例,here。但是,我想做一个自定义:在我的表格中显示按字母顺序排列的结果,每个字母都有一个“标... 查看详情

在类路径资源 + Springboot 中创建名称为“dataSource”的 bean 时出错

...描述】:我正在创建一个Springboot应用程序,但将通过REST使用外部MongoDB。我的应用程序属性文件非常简单:appl 查看详情

在开发方法中导出ipa时出错(代码片段)

...导出时,我得到所有项目的同样错误,我没有在任何地方使用python,所以为什么我收到此错误。请帮我解决这个错误。我正在使用Xcode9.2ipatoolfailedwithanexception:#<RuntimeError:Couldn'tlocatepythonin/Applications/Xcode.app/Contents/Developer/Toolchain... 查看详情

下面的查询在 10g (10.2.0.4) 中不起作用,显示 ORA-00904: "A","TEMP_APPL_ID" : invalid identifie

】下面的查询在10g(10.2.0.4)中不起作用,显示ORA-00904:"A","TEMP_APPL_ID":invalididentifier【英文标题】:Belowqueryisnotworkingin10g(10.2.0.4)showingORA-00904:"A","TEMP_APPL_ID":invalididentifier【发布时间】:20 查看详情