使用 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 构建被拒绝的主要内容,如果未能解决你的问题,请参考以下文章
Jsoup获取部分页面数据失败 org.jsoup.UnsupportedMimeTypeException: Unhandled content type. Must be text/*, appl
问题编程环境fatal error: security/pam_appl.h
下面的查询在 10g (10.2.0.4) 中不起作用,显示 ORA-00904: "A","TEMP_APPL_ID" : invalid identifie