0

私のアプリはiOS5以降をサポートしています。フェイスブックとツイッターを追加したいと思います。オプションとしてsocial.frameworkを追加し、facebookbtnでチェックします

if([SLComposeViewController isAvailableForServiceType:SLServiceTypeFacebook]) {
        NSLog(@"Facebook iOS 6 avaliable");
}
else
{
 NSLog(@"Feature not supported"); // for iOS 5 users
}

ツイッターも同じです。ただし、iOS 6シミュレーターは正常に動作しますが、iOS5シミュレーターではエラーが発生します。iOS5とiOS6の両方でFacebookとTwitterの共有を追加するためのヘルプまたはチュートリアル。

EXC_BAD_ACCESS (code=2, address=0x0) isAvailableForServiceType:SLServiceTypeFacebook
isAvailableForServiceType:SLServiceTypeTwitter

回答1のプロジェクトを更新した後、このエラーが発生します。

ここに画像の説明を入力してください こちらがプレフィックスファイルです ここに画像の説明を入力してください

4

2 に答える 2

4

Socialフレームワーク ( )はSLComposeViewControlleriOS 6 でのみ導入されました。iOS 5 では、ソーシャル ネットワークへの唯一のネイティブ接続は Twitter とTWTweetComposeViewControllerクラスでした。iOS 6 では、Social既存の Twitter サポートと新しい Facebook および Sina Weibo の統合を備えたフレームワークが導入されました。

したがって、iOS 5 では、実際には への参照や呼び出しを行うことはできませんSLComposeViewController。条件を使用して、ユーザーのデバイスが実行されているバージョン (iOS 5 または 6) を確認してから、操作/条件を作成する必要があります。

このコードif ([SLComposeViewController isAvailableForServiceType:SLServiceTypeFacebook])は、ユーザーが設定アプリケーションで Facebook アカウントをセットアップしているかどうかを確認するために使用されます。

はい、TwitteriOS 5 との互換性のためにフレームワークを追加しSocialます。ところで、フレームワークがオプションに設定されていることを確認してください。

デバイスが実行しているバージョンを確認するには、これをMyApp-Prefix.pchファイルに追加します。

#define SYSTEM_VERSION_EQUAL_TO(v)         ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedSame)
#define SYSTEM_VERSION_GREATER_THAN(v)       ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending)
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN(v)         ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v)   ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedDescending)

次に、プレフィックス ファイルがすべてのクラスに自動的にインポートされるため、任意のクラスで使用できます。

if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"5.0") && SYSTEM_VERSION_LESS_THAN(@"6.0")) {

       NSLog(@"This is called when device is running iOS 5, 5.0.1, 5.1 etc.");
}
else if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"6.0")) {

       NSLog(@"iOS 6.0, 6.0.1, 6.0.2, 6.1 etc.");
}
于 2013-01-19T14:52:23.660 に答える
4
EXC_BAD_ACCESS (code=2, address=0x0)

Social フレームワークは iOS6 専用のフレームワークであるため、このエラーは「セグメンテーション違反」です。弱いリンケージを使用したため(フレームワークを「オプション」として追加することは意味します)、SLComposeViewControllerクラスはNil(つまり、実際には無効なメモリアドレスを指します0x0)、呼び出しようとする関数はおそらくセグメンテーションになりますフォルト (このアドレスを間接参照することはできないため)。

あなたがしなければならないことは、このクラスが有効なポインタであることを確認することです:

if (NSClassFromString(@"SLComposeViewController") != Nil) {
    // iOS 6
} else {
    // iOS 5, Social.framework unavailable, use Twitter.framework instead
}
于 2013-01-19T15:05:01.853 に答える