从 iOS 8 Today Widget 访问 PFIzer 当前用户

Posted

技术标签:

【中文标题】从 iOS 8 Today Widget 访问 PFIzer 当前用户【英文标题】:Accessing the PFUser currentUser from an iOS8 Today Widget 【发布时间】:2014-09-14 16:59:55 【问题描述】:

我在 Parse google 小组中提出了这个问题,但我想我会在 SO 上更广泛地打开它。关于在正式发布之前讨论与 ios8 相关的任何内容的规则,我仍然有点模糊,但是随着 GM 和扩展的讨论,我想我现在可以问这个问题了。如果没有,它可以等待。

我在后端使用 Parse。我想构建一个 Today 小部件,显示与特定 currentUser 相关的一些记录。加载和初始化 Parse 不是问题,框架已加载和初始化,这很好。但即使登录到容器应用程序,我似乎也没有引用 currentUser。

这是我创建的代码,只是为了确认我可以访问当前用户,但它不起作用。我试图将它保存在 NSUserDefault 中,无论如何这可能是一个 hack,但没有成功。

 PFUser *currentUser = [PFUser currentUser];
    if (currentUser)  
        nameTF.text = [NSString stringWithFormat:@"%@ %@", [currentUser objectForKey:@"firstName"], [currentUser objectForKey:@"lastName"]]; 
     else  
        nameTF.text = @"No freaking clue who you are."; 
    

但我看到的只是“没有任何线索......”的文字。

我的第一个问题是我是否可以访问当前用户?我认为我可以并且需要以某种方式在小组中获得它,而我错过了一些愚蠢的东西。如果是这样,有人可以指出我完成此任务的最佳方法的来源或信息吗?一旦我可以与当前用户进行查询,我会没事的。

再次感谢您提供的任何建议。

* 更新 *

在 Parse 的 Fosco Marotto 建议将 sessionToken 存储在 NSUserDefaults 中,然后在扩展中使用该令牌来调用 PFUser becomeInBackground 之后,我将以下代码放在一起来测试该建议,这很有效。它需要改进,因为它有点骇人听闻,所以我没有将其标记为答案。

NSUserDefaults *sharedDefaults = [[NSUserDefaults alloc]   initWithSuiteName:@"XXXXXXXXXXXXXXXXX"]; 
NSString *pfToken = [sharedDefaults valueForKey:@"PFUserSessionToken"]; 

[PFUser becomeInBackground:pfToken block:^(PFUser *currentUser, NSError *error)  
   if (error)  
      // The token could not be validated. 
      NSLog(@"error happened during becomeInBackground - token could not be validated"); 
      // Show the token just to make sure we got it
      nameTF.text = pfToken; 
    else  
      // The current user is now set to user. 
      // do stuff with the user 
      nameTF.text = [NSString stringWithFormat:@"%@ %@", [currentUser objectForKey:@"firstName"], [currentUser objectForKey:@"lastName"]]; 
    
];

// Now lets see if we can get PFUser outside of the block

// Not sure if we need this

PFUser *currentUser = [PFUser currentUser];

if (currentUser) 
     // We have a reference to currentUser
     nameTF.text = [NSString stringWithFormat:@"%@", [currentUser objectForKey:@"firstName"]];
 else 

    nameTF.text = @"Don't think you're getting the PFUser thing right here";

我可以获取 currentUser 并对其进行查询。感谢 Fosco 的指导,希望这越来越接近解决方案

【问题讨论】:

【参考方案1】:

现在 Parse 提供了在宿主应用程序和扩展程序之间共享数据的官方解决方案。更多信息请访问https://www.parse.com/docs/ios/guide#extensions

【讨论】:

【参考方案2】:

我成功地将当前用户用户名的 NSString 从我的应用程序保存到用户默认值。然后在小部件的视图控制器中,我使用该用户名查询用户。

【讨论】:

我不确定这个解决方案能否提供我们需要的完全访问权限。 Fosco @ Parse 在 Parse Google Group 中给出了这个未经测试的建议“Apple 在这里有一些指向解决方法的信息:developer.apple.com/library/prerelease/ios/documentation/… 还没有尝试过,但想法是将 PFUser sessionToken 存储在 NSUserDefaults 中,当扩展已激活,获取该 sessionToken 并使用 PFUser becomeInBackground 功能。”我已经测试过了,它可以工作。

以上是关于从 iOS 8 Today Widget 访问 PFIzer 当前用户的主要内容,如果未能解决你的问题,请参考以下文章

iOS 8 Today Widget 使用自动布局来适应 UITableView 的高度

如何从 Today Extensions(iOS 8) 访问核心数据详细信息?

将数据从 Core Data 加载到 Today Widget

将数据从Core Data加载到Today Widget

在 iOS 8 的 Today 扩展(小部件)中为按钮添加操作?

iOS开发------Widget(Today Extension)插件化开发