使用 CloudKit/iCloud 时 Apple Store 构建被拒绝
Apple Store build rejected while using CloudKit/iCloud
我刚刚将我的应用程序提交到 Apple Store,但由于以下问题导致提交失败,我对如何解决这个问题感到很困惑。
From Apple - 17.2 Details - We noticed that your app requires users to
register with personal information to access non account-based
features. Apps cannot require user registration prior to allowing
access to app content and features that are not associated
specifically to the user.
Next Steps - User registration that requires the sharing of personal
information must be optional or tied to account-specific
functionality. Additionally, the requested information must be
relevant to the features.
我的应用程序使用 CloudKit 来保存、检索和共享记录。但该应用程序本身不要求任何个人详细信息,也不共享任何个人详细信息,如电子邮件、姓名、出生日期……,它只是要求用户在设备上激活一个 iCloud 帐户。然后 CloudKit 使用 iCloud 凭据才能工作。
它变得混乱是因为:
1 - 我无法更改 CloudKit 的工作方式并停止要求用户登录 iCloud。每个使用 CloudKit 的应用都需要一个登录 iCloud 的用户。
2 - 与其他应用程序(例如facebook)一样,如果您不登录,该应用程序根本无法运行。因此,登录与特定功能无关,而是与应用程序的整体功能相关。
每次应用程序启动时,都会在初始屏幕(进入应用程序功能区域之前)调用下面的代码示例,以确保用户可以使用 iCloud。如果用户有 iCloud,我会带他进入应用程序。如果不是,我会阻止他并让他对 iCloud 进行排序。但我想这就是他们在这里抱怨的 - "User registration that requires the sharing of personal information must be optional or tied to account-specific functionality. Additionally, the requested information must be relevant to the features.".
这让我陷入了一个相当混乱的境地。不确定如何解决该问题。有人对 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。如果用户没有可用的 iCloud 帐户,他们将无法进入该应用程序。
解决方案
让用户进入应用程序并单击主要部分。事实上,该应用程序完全没用,但用户可以看到它奇怪的空白屏幕,无法保存或加载任何内容。当他们尝试加载或保存内容时,我会提示他们需要登录 iCloud 才能使用该应用程序。
实际效果
我认为 Apple 的更改请求没有为用户体验增加任何价值。事实上,它只是增加了用户理解他能做什么和不能做什么的复杂性。
例如,如果用户不提供他的个人详细信息,Facebook 会将用户锁定在外面,因为没有这些数据,应用程序绝对没有用,这就是我的情况......你可以说用户应该能够进去,但他会看到什么或做什么?然后,您将不得不迎合此 UX 构建的所有异常,并以烦人的警告模式向用户发出警告,以解决所有地方的帐户问题。
所以我不确定 "how" Facebook 能否获得批准,而我不能。
虽然我获得了应用程序的批准,但我不同意 Apple 反馈以任何方式改进了应用程序。
我刚刚将我的应用程序提交到 Apple Store,但由于以下问题导致提交失败,我对如何解决这个问题感到很困惑。
From Apple - 17.2 Details - We noticed that your app requires users to register with personal information to access non account-based features. Apps cannot require user registration prior to allowing access to app content and features that are not associated specifically to the user.
Next Steps - User registration that requires the sharing of personal information must be optional or tied to account-specific functionality. Additionally, the requested information must be relevant to the features.
我的应用程序使用 CloudKit 来保存、检索和共享记录。但该应用程序本身不要求任何个人详细信息,也不共享任何个人详细信息,如电子邮件、姓名、出生日期……,它只是要求用户在设备上激活一个 iCloud 帐户。然后 CloudKit 使用 iCloud 凭据才能工作。
它变得混乱是因为:
1 - 我无法更改 CloudKit 的工作方式并停止要求用户登录 iCloud。每个使用 CloudKit 的应用都需要一个登录 iCloud 的用户。
2 - 与其他应用程序(例如facebook)一样,如果您不登录,该应用程序根本无法运行。因此,登录与特定功能无关,而是与应用程序的整体功能相关。
每次应用程序启动时,都会在初始屏幕(进入应用程序功能区域之前)调用下面的代码示例,以确保用户可以使用 iCloud。如果用户有 iCloud,我会带他进入应用程序。如果不是,我会阻止他并让他对 iCloud 进行排序。但我想这就是他们在这里抱怨的 - "User registration that requires the sharing of personal information must be optional or tied to account-specific functionality. Additionally, the requested information must be relevant to the features.".
这让我陷入了一个相当混乱的境地。不确定如何解决该问题。有人对 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。如果用户没有可用的 iCloud 帐户,他们将无法进入该应用程序。
解决方案
让用户进入应用程序并单击主要部分。事实上,该应用程序完全没用,但用户可以看到它奇怪的空白屏幕,无法保存或加载任何内容。当他们尝试加载或保存内容时,我会提示他们需要登录 iCloud 才能使用该应用程序。
实际效果
我认为 Apple 的更改请求没有为用户体验增加任何价值。事实上,它只是增加了用户理解他能做什么和不能做什么的复杂性。
例如,如果用户不提供他的个人详细信息,Facebook 会将用户锁定在外面,因为没有这些数据,应用程序绝对没有用,这就是我的情况......你可以说用户应该能够进去,但他会看到什么或做什么?然后,您将不得不迎合此 UX 构建的所有异常,并以烦人的警告模式向用户发出警告,以解决所有地方的帐户问题。
所以我不确定 "how" Facebook 能否获得批准,而我不能。
虽然我获得了应用程序的批准,但我不同意 Apple 反馈以任何方式改进了应用程序。