Как разместить на стене друзей из PHP-скрипта? - PullRequest
1 голос
/ 28 февраля 2012

надеюсь, кто-то может помочь мне с этой странной проблемой.

У меня есть база данных, в которой хранятся идентификаторы Facebook всех зарегистрированных пользователей, и это прекрасно работает.

Пользователи могут отправлять сообщения своим друзьям в Facebook через PHP-скрипт, который активируется через приложение.

В моем сценарии есть раздел, в котором говорится, что если идентификатор одного из ваших друзей НЕ находится в базе данных (то есть они не являются зарегистрированными пользователями), то опубликуйте сообщение на их стене в Facebook, уведомив его о том, что кто-то пытался связаться с ними с помощью приложения.

Затем существует вторая база данных, в которой хранятся идентификаторы людей, которых мы уведомили через FB, чтобы мы не отправляли им несколько запросов.

Проблема в том, что сообщение никогда не появляется на их стене. Сообщение отправляется в скрипт 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 часть task = send затем запускает процесс отправки сообщения получателю. Эта часть работает абсолютно нормально, сообщение получено без проблем.

Если их идентификатор не найден, он переходит к этому:

    $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 (.... task = send & facebookID = 12345789 ... и т. Д.) В браузер и нажму Enter - сообщение ДОЛЖНО быть опубликовано на стене пользователя.

Так что теперь я полностью сбит с толку. При запуске через браузер, сообщение принимается в приложении, если идентификатор Facebook зарегистрирован, и публикуется в 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 Ответ

1 голос
/ 29 февраля 2012

Возможно, вам потребуется закодировать строку URL. Если в полях (например, имя, сообщение и т. Д.) Есть пробелы или другие специальные символы, запрос / подключение URL-адреса из iOS не будет выполнен. Веб-браузеры обычно делают эту кодировку автоматически, а iOS - нет.

Получив строку URL, попробуйте:

urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]

В качестве примечания вы можете использовать [NSString stringWithFormat:@"", ...] вместо нескольких stringByAppendingString вызовов. Что-то вроде:

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