2016-04-22 79 views
2

我刚将应用程序提交给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) 
           } 
          } 
        }) 
       } 
      } 
     } 
    } 
+1

您应该考虑用户明确关闭iCloud的场景。她无法使用您的应用,也无法登录您的应用。在Facebook等应用中,未注册的用户可以选择注册。国际海事组织除了iCloud之外,还应该考虑添加其他机制(例如社交网络),在您的应用程序中添加1-2个功能(无需使用iCloud),以便该功能可用于该用户子集。 – Vin

+2

'每个使用CloudKit的应用程序都需要一位用户登录了iCloud。' - 对于容器的公共数据库端来说这不是真的。只有在开发和测试过程中,您才需要登录到iCloud才能访问公共数据库。您的应用程序应提供对公用数据库的访问权限,而无需登录。也许这是苹果17.2暗示的 - (只是一个推测性的想法。) – Bamsworld

+0

@Vin我遵循了你的建议,并且该应用程序被批准。无需使用其他机制登录。我让用户在应用程序的静态屏幕上导航,但为了保存或加载需要数据库用户必须使用iCloud签名的屏幕。基本上,用户进入应用程序,但可以做几乎没有什么,直到安装iCloud。看起来对他们来说很好。 – GuiSoySauce

回答

0

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

解决方案

让用户获取应用程序内,点击主要部分。事实上,该应用程序完全没用,但用户可以看到它是奇怪的空屏幕,没有保存或加载任何东西的能力。当他们试图加载或保存东西时,我会提示他们需要在iCloud上登录以使应用程序可用。

实际成果

我不认为苹果公司的变更请求增加值的UX东西。事实上,它增加了用户理解他能做什么和不能做什么的复杂性。

作为一个例子,如果用户没有提供他的个人信息,因为没有这些数据,这个应用程序绝对没有用处,这就是我的情况......你可以说,用户应该能够得到在里面,但他会看到或做什么?然后,您必须迎合UX构建的所有例外情况,并提醒用户在烦人的警告模式上随处解决帐户问题。

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

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