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

Posted

技术标签:

【中文标题】使用 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 的反馈以任何方式改进了应用。

【讨论】:

以上是关于使用 CloudKit/iCloud 时 Apple Store 构建被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

使用联合查询时出错

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

Jsoup获取部分页面数据失败 org.jsoup.UnsupportedMimeTypeException: Unhandled content type. Must be text/*, appl

call()和appl()的理解

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

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