Xcode4でShareKitを使う

twitter, facebook, Evernote, Flickrといった各種WebサービスへiOSアプリケーションからデータを流し込みたい場合、ShareKitを使うと便利だ。

Xcode4でShareKitを使うにあたって、日本語の解説があまりなかったようなので記事にした。結論を先に書くと、日本語のドキュメントを検索するより、公式ドキュメント(Installing sharekit)を参照した方が確実で早くて分かりやすい。

ちなみにググると出てくるhttp://getsharekit.com/のサイト上にリンクが貼られているShareKitはバージョンが0.2.1と極めて古い。最新の情報はすべてgithub上にあるのでそちらを参照するべき。

ShareKitの取得

アプリケーションのプロジェクトのディレクトリに移動して、もしgitのリポジトリが存在しないのであればgit initを実行後、以下をシェルに入力。

$ cd (プロジェクトのディレクトリ(.xcodeprojファイルの存在するディレクトリ))
$ git submodule add git://github.com/ShareKit/ShareKit.git Submodules/ShareKit
$ git commit -m 'ShareKit added as submodule'

Submodulesというディレクトリ内にShareKitというディレクトリ名でShareKitが追加されます。

$ cd Submodules/ShareKit
$ git submodule init
$ git submodule update

プロジェクトに追加

アプリケーションのプロジェクトにSubmodules/ShareKit/ShareKit.xcodeprojをドラッグ&ドロップする。

ShareKit.xcodeproj/Classes/ShareKitをドラッグ&ドロップしてアプリケーションのプロジェクト内にコピーする

「Create groups for any added folders」を選択してFinish

ShareKit.xcodeprojを削除する(Remove Referenceを選択)

フレームワークの追加

プロジェクトナビゲータ内の(プロジェクト名).xcodeprojの[Build Phases]タブの[Link Binary With Libraries]の[+]ボタンをクリックして以下のフレームワークを追加する。

  • SystemConfiguration.framework
  • Security.framework
  • MessageUI.framework
  • CFNetwork.framework (Flickr共有したい場合)
  • CoreLocation.framework (Foursquare共有したい場合)
  • Twitter.framework(iOS5以上の場合)

いらないWebサービスのクラスを削除する

プロジェクトナビゲータ内の「ShareKit/Sharers/Services/」の中に、各Webサービスに必要なクラスがフォルダ分けされているので、使わないWebサービスのフォルダは削除する(Remove Referencesを選択)。

ビルドできるか確認

試しにビルドしてみる。ビルドに失敗する場合は公式ドキュメントの「Step 3: Smoke Test」を参照する。

Configuratorの作成

DefaultSHKConfiguratorを継承したクラスを作る。

MyShareKitConfigurator.h

#import "DefaultSHKConfigurator.h"
@interface MyShareKitConfigurator : DefaultSHKConfigurator
@end

MyShareKitConfigurator.m

#import "MyShareKitConfigurator.h"

@implementation MyShareKitConfigurator
- (NSString*)appName {
	return @"アプリケーション名";
}
- (NSString*)appURL {
	return @"http://example.com/";
}
/*
 ここから先は使うアプリケーションごとに
 DefaultSHKConfigurator.mから設定をコピーして書き換える
 例えばtwitter APIを使う場合は以下のように設定する。
 */
- (NSNumber*)forcePreIOS5TwitterAccess {
	return [NSNumber numberWithBool:false];
}
- (NSString*)twitterConsumerKey {
	return @"abcdefghijklmnopqrstuv";
}
- (NSString*)twitterSecret {
	return @"abcdefghijklmnopqrstuvwxyz01234567890ABC";
}
- (NSString*)twitterCallbackUrl {
	return @"http://example.com/";
}
- (NSNumber*)twitterUseXAuth {
	return [NSNumber numberWithInt:0];
}
- (NSString*)twitterUsername {
	return @"";
}
@end

Configuratorの適用

アプリケーションのデリゲートのapplication:didFinishLaunchingWithOptions:メソッド内にSHKConfigurationを使って設定を読み込む処理を追加する。

// (前略)

#import "SHKConfiguration.h"
#import "MyShareKitConfigurator.h"

@implementation
// (中略)

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
	MyShareKitConfigurator *configurator = [[[MyShareKitConfigurator alloc] init] autorelease];
	[SHKConfiguration sharedInstanceWithConfigurator:configurator];
	// (中略)
}

// (中略)

@end

一覧を表示

これでShareKitの導入は完了しているので、後は必要なコードを随時挿入するだけ。

例えばテキスト共有したい場合は以下のように書く

#import "SHK.h" //ShareKitをimportする

- (void)showShareKitActionSheet {
	SHKItem *item = [SHKItem text:@"これはテストです。"];
	[[SHKActionSheet actionSheetForItem:item] showInView:[[UIApplication sharedApplication] keyWindow]];
}

まとめ

ググる前に公式ドキュメントを読むべきだった。

Pocket
LINEで送る
LinkedIn にシェア

「Xcode4でShareKitを使う」への4件のフィードバック

  1. sharekitライブラリを導入すべく色々しらべた結果、本サイトがわかりやすく参考にさせていただいたおります。

    いま私の方で進めているアプリにsharekitライブラリを導入仕様としているのですが、
    下記エラーがでているのですが、何か秋山ブログさんで対処された方法などあればご教授いただけますと幸いです。

    *** Assertion failure in NSString *SHKLocalizedStringFormat(NSString *)(), /Users/省略/myapp/ShareKit/Core/SHK.m:786
    sharedlibrary apply-load-rules all
    Current language: auto; currently objective-c
    (gdb)

    もし参考になるご情報などございましたら幸いです。
    開発環境は
    xcodeで、ios5.1、arc無効、nib等も利用していない、localizeはjapan、
    いくつかsharekit系の情報はほぼほぼ読んでみたのですが、
    どうしてもこのエラーが解決できずになっております、
    初めてにもかからず、こんなコメントで恐縮です。

    またちょくちょく参考にさせていただきます!

  2. 秋山ブログさん>
    こちらなんとか自己解決しました、submodulesを最新版にしなおしたら動きました。
    大変失礼しました!
    もろもろ参考になる情報ありがとうございます!

  3. 解決例も含めて、ご連絡いただきありがとうございます。
    今後ともよろしくお願いいたします。

コメントを残す