2012-02-28 106 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

相關問題