Открыть ссылку на страницу Facebook из приложения iOS

Я хочу перенаправить пользователя на страницу приложения Facebook, поэтому у меня есть следующий код:

[[UIApplication sharedApplication] openURL:
    [NSURL URLWithString: @"https://facebook.com/myAppsPage"]];

это отлично работает, если на устройстве нет приложения Facebook. Затем ссылка открывается в Safari.

Если на устройстве установлено приложение Facebook, то после выполнения вышеприведенного кода открывается приложение Facebook, но на нем отображается временная шкала пользователей, а не страница моего приложения. Я попытался изменить ссылку на @"fb://pages/myAppsPage" и @"fb://profile/myAppsPage, но это снова открыло временную шкалу пользователей.

Итак, мой вопрос: как я могу открыть страницу приложений на сафари, если в приложении Facebook нет приложения Facebook или в приложении Facebook, если он установлен.

Ответ 1

Вам нужно использовать идентификатор facebook для данной страницы, а не URL тщеславия. Чтобы получить идентификатор страниц, введите имя тщеславия вашей страницы по следующему URL-адресу и скопируйте значение для "id":

https://graph.facebook.com/yourappspage

После того, как у вас есть идентификатор, вы можете настроить этот метод, чтобы проверить, установлен ли FB с помощью метода canOpenURL и обслуживать соответствующий контент для обоих состояний:

NSURL *facebookURL = [NSURL URLWithString:@"fb://profile/113810631976867"];
if ([[UIApplication sharedApplication] canOpenURL:facebookURL]) {
    [[UIApplication sharedApplication] openURL:facebookURL];
} else {
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://facebook.com"]];
}

Ответ 2

Я был рад найти skladek ответ, так что здесь мой вклад: Swift + другие социальные сети.

Я обнаружил, что мне нужно 3 косая черта для твиттера, и только 2 для Facebook и Google+, я не исследовал больше этого...

// Go to https://graph.facebook.com/PageName to get your page id
func openFacebookPage() {
    let facebookURL = NSURL(string: "fb://profile/PageId")!
    if UIApplication.sharedApplication().canOpenURL(facebookURL) {
        UIApplication.sharedApplication().openURL(facebookURL)
    } else {
        UIApplication.sharedApplication().openURL(NSURL(string: "https://www.facebook.com/PageName")!)
    }
}

func openTwitterProfile() {
    let twitterURL = NSURL(string: "twitter:///user?screen_name=USERNAME")!
    if UIApplication.sharedApplication().canOpenURL(twitterURL) {
        UIApplication.sharedApplication().openURL(twitterURL)
    } else {
        UIApplication.sharedApplication().openURL(NSURL(string: "https://twitter.com/USERNAME")!)
    }
}

func openGooglePlusPage() {
    let googlePlusURL = NSURL(string: "gplus://plus.google.com/u/0/PageId")!
    if UIApplication.sharedApplication().canOpenURL(googlePlusURL) {
        UIApplication.sharedApplication().openURL(googlePlusURL)
    } else {
        UIApplication.sharedApplication().openURL(NSURL(string: "https://plus.google.com/PageId")!)
    }
}

Попытка рефакторинга:

struct SocialNetworkUrl {
    let scheme: String
    let page: String

    func openPage() {
        let schemeUrl = NSURL(string: scheme)!
        if UIApplication.sharedApplication().canOpenURL(schemeUrl) {
            UIApplication.sharedApplication().openURL(schemeUrl)
        } else {
            UIApplication.sharedApplication().openURL(NSURL(string: page)!)
        } 
    }
}

enum SocialNetwork {
    case Facebook, GooglePlus, Twitter, Instagram
    func url() -> SocialNetworkUrl {
        switch self {
        case .Facebook: return SocialNetworkUrl(scheme: "fb://profile/PageId", page: "https://www.facebook.com/PageName")
        case .Twitter: return SocialNetworkUrl(scheme: "twitter:///user?screen_name=USERNAME", page: "https://twitter.com/USERNAME")
        case .GooglePlus: return SocialNetworkUrl(scheme: "gplus://plus.google.com/u/0/PageId", page: "https://plus.google.com/PageId")
        case .Instagram: return SocialNetworkUrl(scheme: "instagram://user?username=USERNAME", page:"https://www.instagram.com/USERNAME")
        }
    }
    func openPage() {
        self.url().openPage()
    }
}

Теперь вы можете позвонить:

SocialNetwork.Twitter.openPage()

Ответ 3

Похоже, что с момента последнего ответа Facebook изменили схему для страниц (профиль такой же, как и раньше)

page_id теперь является частью запроса URL. Таким образом, чтобы перенаправить в приложение fb, URL должен быть в формате:

fb://page/?id=your_page_numeric_id

Также убедитесь, что белый список схем fb в ваших приложениях Info.plist

<key>LSApplicationQueriesSchemes</key>
<array>
    <string>fb</string>
</array>

В случае, если будут какие-либо дальнейшие изменения или вы не знаете свою страницу Facebook page_id, вы можете извлечь точный URL fb iOS из источника вашей веб-страницы Facebook.

  1. Откройте свою страницу Facebook в Safari
  2. Щелкните правой кнопкой мыши → Проверить элемент
  3. Искать al:ios:url

Вы должны быть в состоянии найти:

<meta property="al:ios:url" content="fb://page/?id='your_page_numeric_id'">

Скопируйте этот URL в ваше приложение и затем позвоните:

guard let facebookURL = NSURL(string: "fb://page/?id=your_page_numeric_id") else {
    return
}

if (UIApplication.sharedApplication().canOpenURL(facebookURL)) {
    UIApplication.sharedApplication().openURL(facebookURL)
} else {

    guard let webpageURL = NSURL(string: "http://facebook.com/yourPage/") else {
        return
    }

    UIApplication.sharedApplication().openURL(webpageURL)
}

должен сделать работу...

Ответ 4

Для iOS 9 вы должны присвоить белый список URL-адресу, которое ваше приложение вызовет, используя ключ LSApplicationQueriesSchemes в вашем Info.plist.

Проверьте здесь.

<key>LSApplicationQueriesSchemes</key>
    <array>
     <string>fb</string>
     <string>fbapi</string>
     <string>fbauth2</string>
     <string>fbshareextension</string>
     <string>fb-messenger-api</string>
     <string>twitter</string>
     <string>whatsapp</string>
     <string>wechat</string>
     <string>line</string>
     <string>instagram</string>
     <string>kakaotalk</string>
     <string>mqq</string>
     <string>vk</string>
     <string>comgooglemaps</string>
    </array>

Ответ 5

После долгих испытаний я нашел одно из наиболее эффективных решений:

NSString *facebookID = @"XXXXXXXXXX";
NSString *facebookURL = @"www.facebook.com/XXXXXXXX";
NSURL *urlModal = [NSURL URLWithString:[NSString stringWithFormat:@"fb://facewebmodal/f?href=%@", facebookURL]];
NSURL *urlWithID = [NSURL URLWithString:[NSString stringWithFormat:@"fb://page/%@", facebookID]]; // or "fb://profile/%@" or another type of ID
NSURL *url = [NSURL URLWithString:facebook_url];


if(facebookID && !facebookID.isEmpty && [[UIApplication sharedApplication] canOpenURL:urlWithID]) {
    // open facebook app with facebookID
    [[UIApplication sharedApplication] openURL:urlWithID];
} else if (facebookURL && !facebookURL.isEmpty && [[UIApplication sharedApplication] canOpenURL:urlModal]) {
    // open facebook app with facebookUrl
    [[UIApplication sharedApplication] openURL:urlModal];
} else if (![[UIApplication sharedApplication] openURL:url]) {
    // somehow open
    NSLog(@"%@%@",@"Failed to open url:",[url description]);
}

Порядок предложений "если еще" зависит от вас...

Наслаждайтесь!: -)

Ответ 6

Swift 2.3

Для кода вы можете использовать этот пример:

Примечание. Если вы не можете найти идентификатор профиля в Facebook, вы можете воспользоваться следующим сайтом (https://findmyfbid.com/).

func goFacebook() {
    let profileID = "" //Here put profile id Example:'62260589592'
    let facebookURL = NSURL(string: "fb://profile/\(profileID)")!

    if UIApplication.sharedApplication().canOpenURL(facebookURL) {
        UIApplication.sharedApplication().openURL(facebookURL)
    } else {
        UIApplication.sharedApplication().openURL(NSURL(string: "https://www.facebook.com/PageName")!)
    }
}

Для Info.plist необходимо установить следующие параметры:

Примечание: для открытия Info.plist в режиме источника

-Go в файл Info.plist и щелкните правой кнопкой мыши

-Select "Открыть как"

-Select "Исходный код"

-Put код выше другого

<key>LSApplicationQueriesSchemes</key>
<array>
 <string>fb</string>
 <string>fbapi</string>
 <string>fbauth2</string>
 <string>fbshareextension</string>
 <string>fb-messenger-api</string>
</array>