その後のその後

iOSエンジニア 堤 修一のブログ github.com/shu223

Twitter や Facebook への投稿ライブラリ ShareKit の Tips

iOSアプリにソーシャルサイトでのシェア機能を3行で簡単実装できる」という謳い文句で有名な ShareKit を初めて使ってみたのですが、ひっかかった部分や、ドキュメントに書いてなくてソースから汲み取った部分などあったので、諸々メモしておきます。

ソース入手先に注意!

ググるとここがトップに出てきて、このページ内にリンクが張られているソースのダウンロード先はここということになっていますが、最終更新が1年以上前とえらく古いものなので要注意です。


現在の本家はこちらのようです。
https://github.com/ShareKit/ShareKit


ドキュメントはこちら。
https://github.com/ShareKit/ShareKit/wiki


iOS 5 から追加された Twitter フレームワークにも対応済み

作っているアプリのビルドターゲットが iOS 5.0 以上なので、Twitter は TWTweetComposeViewController を使い、Facebook は ShareKit を使うつもりでいたのですが、ShareKit ライブラリ内に SHKiOS5Twitter なるクラスを発見!ソースを見てみると内部で TWTweetComposeViewController を使用しているようです。


iOS5用の方を使う方法ですが、SHKTwitter クラスに次のような判定処理が入っており、

if ([self twitterFrameworkAvailable]) {
	
	[SHKiOS5Twitter shareItem:self.item];
	[SHKTwitter logout];//to clean credentials - we will not need them anymore
	return;
}

特に iOS5 用にコードを書かなくても Twitter フレームワークをプロジェクトに追加しておけば、自動的に Twitter フレームワークの方(SHKiOS5Twitter)を使ってくれます。


Twitter 画像投稿

ShareKit/Sharers/Services/ 配下に Facebook と Twitter だけを残し、下記のようなコードでアクションシートを呼び出したときに、

SHKItem *item = [SHKItem image:[UIImage imageNamed:@"hoge.png"] title:@"Title"];

SHKActionSheet *actionSheet = [SHKActionSheet actionSheetForItem:item];
[actionSheet showInView:self.view];

デフォルトだと「Facebook」「コピー」「その他」がアクションシートの選択肢として出てきます。


ここに、「Twitter」という選択肢を登場させたい場合は、DefaultSHKConfigurator.m の defaultFavoriteImageSharers を下記のようにカスタマイズします。

- (NSArray*)defaultFavoriteImageSharers {
//    return [NSArray arrayWithObjects:@"SHKMail",@"SHKFacebook", @"SHKCopy",@"SHKVkontakte", nil];
    return [NSArray arrayWithObjects:@"SHKFacebook", @"SHKTwitter", nil];
}

アクションシートの「その他」をなくす

英語では "more"、日本語では「その他」という選択肢が出てきますが、上と同様に DefaultSHKConfigurator.m の showActionSheetMoreButton をカスタマイズすることで消すことができます。

- (NSNumber*)showActionSheetMoreButton {
//	return [NSNumber numberWithBool:true];
    return [NSNumber numberWithBool:false];
}

Facebookでの画像投稿時に編集画面を出す

結論から言って、画像つき投稿用の編集画面は用意されてなさそうです。UIフォルダ配下のクラスの定義を見ても、UIImageView をメンバに持っているクラスは見当たらなかったので・・・


間違っていたらすいません。


投稿前に確認を挟む

上記の通り画像付き投稿時には編集画面を経由できないっぽいので、一旦確認用アラートを出すことにしました。


アラートを出したいクラスで SHKShareItemDelegate への準拠を宣言し、shareDelegate を設定します。

SHKActionSheet *actionSheet = [SHKActionSheet actionSheetForItem:item];
actionSheet.shareDelegate = self;


aboutToShareItem:withSharer: デリゲートメソッドを実装します。
これは SHKActionSheet でいずれかの投稿先が選択されると呼ばれるメソッドで、戻り値に NO を返すと、ShareKit による投稿を止めることができます。
下記サンプルコードでは Facebook が選択されたときにすぐに投稿せず一旦確認アラートを出すようにしています。

- (BOOL)aboutToShareItem:(SHKItem*)item withSharer:(SHKSharer*)sharer {

    if ([sharer isKindOfClass:[SHKFacebook class]]) {

        self.pendingSharer = sharer;

        // 確認用アラートを出す

        return NO;
    }

    return YES;
}