2012-02-28 69 views
1

希望有人可以帮助我解决这个奇怪的问题。如何从PHP脚本发布到朋友墙?

我有存储谁已经注册的所有用户的Facebook的ID数据库,这工作得很好。

用户可以发送邮件通过PHP脚本他们的Facebook朋友这是通过应用程序激活。

在我的脚本中,我有一个部分说如果你的一个朋友的ID不在数据库中(即他们不是注册用户),然后发送消息到他们的Facebook墙上,通知他们有人有试图用应用程序联系他们。

有那么存储,我们已通过FB通知人的ID,所以我们不给他们多次请求第二个数据库。

的问题是,该消息不会永远出现在他们的墙上。该消息被发送到PHP脚本像这样的字符串:

NSString *urlString = [@"myApp/myphp.php?"stringByAppendingString:@"task=send"]; 
    urlString = [urlString stringByAppendingString:@"&facebookID="]; 
    urlString = [urlString stringByAppendingString:[friendsToSendTo objectAtIndex:i]]; 
    urlString = [urlString stringByAppendingString:@"&message="]; 
    urlString = [urlString stringByAppendingString:message]; 
    urlString = [urlString stringByAppendingString:@"&sound="]; 
    urlString = [urlString stringByAppendingString:chosenSoundToSend]; 
    urlString = [urlString stringByAppendingString:@"&sendersName="]; 
    urlString = [urlString stringByAppendingString:myName]; 

在PHP脚本,任务=发送部分则开始将消息发送到收件人的过程。这部分工作非常好,信息没有问题。

如果没有找到自己的ID它然后移动到这一点:

$this->_postToFacebook($sendersName, $facebookID); 

的_postToFacebook功能如下:

private function _postToFacebook($sender, $receiver) 
    { 
    require_once "facebook.php"; 

    //registered with developers.facebook for this particular app 
    $app_id = "****************"; 
    $app_secret = "*****************"; 

    $facebook = new Facebook(array(
    'appId' => $app_id, 
    'secret' => $app_secret, 
    'cookie' => true 
    )); 

    // Get the url to redirect for login to facebook 
    // and request permission to write on the user's wall. 
    $login_url = $facebook->getLoginUrl(
     array('scope' => 'publish_stream') 
    ); 

    // If not authenticated, redirect to the facebook login dialog. 
    // The $login_url will take care of redirecting back to us 
    // after successful login. 
    if (! $facebook->getUser()) { 
     echo <<< EOT 
    <script type="text/javascript"> 
    top.location.href = "$login_url"; 
    </script>; 
    EOT; 

     exit; 
    } 
    // Do the wall post. 
    $facebook->api("/$receiver/feed", "post", array(
     message => "$sender sent you a message", 
     picture => "image.jpg", 
     link => "mywebsite.com", 
     name => "Visit iTunes to download and reply", 
     caption => "mycaption" 
    )); 

} 

这似乎是失败的部分,或者至少是我最初的假设。 不过,如果我手动输入生成的URL(....任务=发送& facebookID = 12345789 ...等)到浏览器并回车 - 消息DOES能张贴到墙上的用户。

所以现在我完全糊涂了。 当通过浏览器触发时,如果Facebook ID已注册,则在应用程序中收到消息,如果未注册,则将消息发布到FB。 从应用程序本身开始,当收件人注册时收到消息 - 但是发布到FB从不起作用。 大概我错过了某种地方的权限?

在此先感谢任何人谁可以帮助:-)

编辑:如果它是一个权限的事情,我要补充一点,我已经设置这些权限:

if (![facebook isSessionValid]){ 

    NSArray *permissions = [[NSArray alloc] initWithObjects: 
          @"user_relationships", @"friends_relationships", 
          @"user_relationship_details", @"friends_relationship_details", 
          @"read_friendlists",@"offline_access", @"publish_stream", 
          nil]; 
    [facebook authorize:permissions]; 
    [permissions release]; 
} 

而在Facebook的我必须将这些更改为否,否则它根本不连接,也许这也会导致问题?

- (void)authorize:(NSArray *)permissions { 
    self.permissions = permissions; 

    [self authorizeWithFBAppAuth:NO safariAuth:NO]; 
} 

回答

1

您可能需要编码您的URL字符串。如果字段(如名称,消息等)具有空格或其他特殊字符,则来自iOS的URL请求/连接将失败。网页浏览器通常会自动为您编码,但iOS不会。

一旦你有你的URL字符串,请尝试:

urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding] 

作为一个侧面说明,你可能想使用[NSString stringWithFormat:@"", ...]而不是多个stringByAppendingString电话。类似于:

urlString = [NSString stringWithFormat: 
      @"myApp/myphp.php?facebookID=%@&message=%@&sound=%@", 
      [friendsToSendTo objectAtIndex:i]], message, sound]; 
+0

好的我会仔细看看。正如我所说,如果我复制并粘贴到浏览器中,输出的字符串确实会触发我正在查找的消息 - 这让我认为它已正确编码了它?如果我让应用程序尝试它,它也会触发一半的代码,但它似乎不会触发第二部分。 – TheBestBigAl 2012-02-29 10:10:34

+0

在浏览器中工作是一个很好的迹象,PHP方面很好。正如我在答案中所说的那样,浏览器会自动在URL或查询字符串中对空格进行编码,而您必须告诉iOS使用'stringByAddingPercentEscapesUsingEncoding:'显式地执行它。 – gregheo 2012-02-29 14:48:41

+0

啊我明白你的意思了。 Hoever我仍然没有运气,甚至使用stringByAddingPercentEscapesUsingEncoding。正如你所说,我相当肯定PHP是好的。我甚至尝试过使用:NSString * messageString = [message stringByReplacingOccurrencesOfString:@“”withString:@“”];让字符串尽可能简单。最后一个字符串(我也改为使用stringWithFormat,就像你说过的)似乎没问题,但仍然不会从应用程序发布消息到FB墙。我仍然怀疑某处可能存在权限问题。 – TheBestBigAl 2012-03-01 14:53:18

相关问题