我刚将应用程序提交给Apple Store,由于以下问题而无法提交,因此我对如何解决此问题感到十分困惑。使用CloudKit/iCloud时Apple Store构建被拒绝
从苹果 - 17.2细节 - 我们注意到,您的应用要求用户 登记的个人信息访问非基于帐户的 功能。应用程序在允许 访问应用程序内容之前不需要用户注册,并且不会将 专用于用户。
后续步骤 - 需要共享个人信息 的用户注册信息必须是可选的或与帐户特定的 功能绑定。此外,请求的信息必须是 与功能相关。
我的应用使用CloudKit保存,检索和共享记录。但该应用程序本身不会要求提供任何个人信息,也不会分享任何个人信息,例如电子邮件,姓名,出生日期等等,它只是要求用户在设备上启用iCloud帐户。然后,CloudKit使用iCloud凭据来工作。
它变得扑朔迷离,因为:
1 - 我不能改变的方式CloudKit作品和停止要求用户登录在iCloud上。每个使用CloudKit的应用都需要用户登录iCloud。
2 - 如果您没有登录应用程序,其他应用程序(facebookas示例)无法从根本上发挥作用。所以登录不是绑定到特定的功能,而是绑定到应用程序的整个功能。
每次应用程序启动时都会在初始屏幕(在进入应用程序功能区域之前)调用代码示例bellow,以确保用户使用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等应用中,未注册的用户可以选择注册。国际海事组织除了iCloud之外,还应该考虑添加其他机制(例如社交网络),在您的应用程序中添加1-2个功能(无需使用iCloud),以便该功能可用于该用户子集。 – Vin
'每个使用CloudKit的应用程序都需要一位用户登录了iCloud。' - 对于容器的公共数据库端来说这不是真的。只有在开发和测试过程中,您才需要登录到iCloud才能访问公共数据库。您的应用程序应提供对公用数据库的访问权限,而无需登录。也许这是苹果17.2暗示的 - (只是一个推测性的想法。) – Bamsworld
@Vin我遵循了你的建议,并且该应用程序被批准。无需使用其他机制登录。我让用户在应用程序的静态屏幕上导航,但为了保存或加载需要数据库用户必须使用iCloud签名的屏幕。基本上,用户进入应用程序,但可以做几乎没有什么,直到安装iCloud。看起来对他们来说很好。 – GuiSoySauce