Maccle

Xcode 4.6にShareKitモジュールを追加して各種ソーシャルサービスとアプリ連携する方法

約 22 分
Xcode 4.6にShareKitモジュールを追加して各種ソーシャルサービスとアプリ連携する方法

Objective-Cであれば、iOSアプリでTwitter、Facebook、Evernoteなどの各種ソーシャルサービスと連携が行える、「ShareKit」という便利なモジュールが公開されています。

例えば、ニュースアプリであれば読んでいるページの情報をユーザーのコメントと共にアプリからツイートしたりFacebookに投稿したり。

通常はそれぞれのAPIにコールして認証、POSTするコードとビューを用意しなくちゃいけないんですが、これだけソーシャルサービスが乱立すると、アプリのメイン機能でもないのに連携のために膨大なコーディングが必要となり、とっても苦痛…

でもこのShareKitモジュールを組み込めば、すべてはたった3行であらゆるSNSへの投稿ができる、というあま〜い謳い文句に誘われてすぐに利用してみることに。

しかし、いざ実装してみると、なんだかんだ「ShareKit」をXcode 4.6 でプロジェクトに組み込むには、ちょっと手順が必要だったのでメモ。

前提環境例

ShareKit導入ステップ

  1. CocoaPods のインストール
  2. ShareKitモジュールのインストール
  3. 動作環境を整える
  4. ShareKitを表示するための準備

1. CocoaPods のインストール

CocoaPodsとは、Objective-C用のライブラリ管理ツール。

Xcode/Objective-Cでアプリを開発する際に、要件を満たしてくれる便利なライブラリが公開されていれば、プロジェクトに組み込んで工数を大幅に削減できますが、その際にライブラリを直接ダウンロードして開発中のプロジェクトに手動でソースを追加しなくても、CocoaPodsのコマンドだけでリポジトリから利用したい便利なライブラリをプロジェクトに追加できます。

ターミナルを起動し、OSX 標準の ruby にて、gem コマンドで CocoaPods をインストールします。

~ sudo gem install cocoapods

CocoaPodsのインストールが失敗する場合

Building native extensions. This could take a while…
ERROR: Error installing cocoapods:
ERROR: Failed to build gem native extension.

/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby extconf.rb
mkmf.rb can’t find header files for ruby at /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/ruby.h

上記のようなエラーが発生して gemネイティブ拡張のビルドに失敗する場合は、[Xcode] → [Preferences]から [Download]メニューを開き、”Command Line Tools” をまずはインストールしてから、gem コマンドで再び CocoaPods をインストールしてみてください。
clt

インストールが完了したら、早速 pod コマンドで CocoaPods のセットアップをします。

~ pod setup

RubyGemsのバージョンが古い場合

Your RubyGems version (*.*.*) is too old, please update with: ‘gem update –system’

システムのRubyGemsが古くてインストール出来ない場合は、上記のコマンドをスーパーユーザーで実行。

~ sudo gem update --system

2. ShareKitモジュールのインストール

CocoaPods のセットアップまで完了したら、いよいよ ShareKit を CocoaPods で 既存のXcodeプロジェクトにインストールします。

testApp プロジェクトを開いている場合は、一旦Xcodeを終了します。

プロジェクトのルートディレクトリに移動しておきます。
ここでは、”testApp” という名前のXcodeプロジェクトが “/Users/username/Documents/xcodews” にある場合を例にします。

~ cd /Users/username/Documents/xcodews/testApp

testApp プロジェクトのルートディレクトリに、プロジェクトにて ShareKit ライブラリを CocoaPods が認識するための “Podfile” という名前のファイルを作成します。
ここでは、Facebook, Twitter, Evernote, Google Reader を対象に含めています。

Podfileの内容

platform :ios, '5.1'
pod 'ShareKit/Facebook'
pod 'ShareKit/Twitter'
pod 'ShareKit/Evernote'
pod 'ShareKit/GoogleReader'

※Facebook は iOS4.3 ではインストールできないため、プラットフォームは iOS 5.1 以上とします。

作成した Podfile を元に、ライブラリをインストール。

~ pod install

無事にインストールが完了すると、testApp プロジェクトのルートディレクトリに「Pods」フォルダが作成され、中にライブラリのプロジェクトファイルと、”testApp.xcworkspace” が作成されています。

3. 動作環境を整える

3-1. 必要なフレームワークの追加

ShareKitを利用するには、以下のフレームワークをプロジェクトに追加しておく必要があります。

まず、先ほど作成されたワークスペース “testApp.xcworkspace” をXcodeで開きます。capture_2013-02-27_11.14.00

プロジェクトを選択し、[TARGETS]をからアプリを選び、[Build Phases]の “Link Binary With Libraries” にて、[+]ボタンで以下のフレームワークから必要なものを追加します。add-framework追加モジュール:

  • SystemConfiguration.framework
  • Security.framework
  • MessageUI.framework
  • CFNetwork.framework (Flickrと連携する場合)
  • CoreLocation.framework (Foursquareと連携する場合)
  • Twitter.framework (iOS 5以降)
  • CoreFoundation.framework (オプション。issue #394対策)
  • UIKit.framework (iOS 4.2以下をサポートする場合のみ。)
  • AdSupport.framework (オプション。iOS 6以降)
  • Accounts.framework (オプション。iOS 5)
  • libsqlite3.dylib (Facebookと連携する場合)
  • Social.framework (オプション。iOS 6以降)

3-2. Facebookのアプリ登録

facebookappFacebook Developers でアプリを登録していない場合は、以下のムービーを参考に、アプリを事前に登録してアプリIDを取得しておきます。

Facebook SDK のインストールは不要です

Facebook アプリの登録

3-3. Twitterのアプリ登録

twitterappTwitter Developers でアプリを登録していない場合は、以下からアプリを登録してコンシューマーキー、コンシューマーシークレットを発行します。
Twitter アプリの登録

4. ShareKitを表示するための準備

4-1. ShareKit設定ファイルを用意する

プロジェクトに、ShareKit の設定用クラスを追加します。

ここでは、「MySHKConfigurator」という名前でクラスを追加します。継承するサブクラスは “DefaultSHKConfigurator” を指定します。shk_class

ヘッダとソースファイルが追加されます。capture 2013-02-27 22.03.35

ヘッダとソースは以下を例に作成。

MySHKConfigurator.h

#import "DefaultSHKConfigurator.h"

@interface MySHKConfigurator : DefaultSHKConfigurator

@end

MySHKConfigurator.m

#import "MySHKConfigurator.h"

@implementation MySHKConfigurator
- (NSString*)appName {
	return [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleDisplayName"];
}
// アプリケーションのURL
- (NSString*)appURL {
	return @"http://example.com/";
}

/*------------------------------------------------------------
 * 各サービスのAPIに接続するための設定
 *
 *   必要な定義は、以下のソースファイルから適宜コピーする。
 *   /Pods/ShareKit/DefaultSHKConfigurator.m
 *----------------------------------------------------------*/
// Twitter - http://dev.twitter.com/apps/new
/*
 Important Twitter settings to get right:
 
 Differences between OAuth and xAuth
 --
 There are two types of authentication provided for Twitter, OAuth and xAuth.  OAuth is the default and will
 present a web view to log the user in.  xAuth presents a native entry form but requires Twitter to add xAuth to your app (you have to request it from them).
 If your app has been approved for xAuth, set SHKTwitterUseXAuth to 1.
 
 Callback URL (important to get right for OAuth users)
 --
 1. Open your application settings at http://dev.twitter.com/apps/
 2. 'Application Type' should be set to BROWSER (not client)
 3. 'Callback URL' should match whatever you enter in SHKTwitterCallbackUrl.  The callback url doesn't have to be an actual existing url.  The user will never get to it because ShareKit intercepts it before the user is redirected.  It just needs to match.
 */

/*
 If you want to force use of old-style, pre-IOS5 twitter framework, for example to ensure
 twitter accounts don't end up in the devices account store, set this to true.
 */
- (NSNumber*)forcePreIOS5TwitterAccess {
	return [NSNumber numberWithBool:false];
}
// Consumer key
- (NSString*)twitterConsumerKey {
	return @"";
}
// Consumer secret
- (NSString*)twitterSecret {
	return @"";
}
// コールバックURL(xAuth認証の場合は不要)
- (NSString*)twitterCallbackUrl {
	return @"";
}
// xAuth認証の場合は 1 にする
- (NSNumber*)twitterUseXAuth {
	return [NSNumber numberWithInt:0];
}
// アプリの認証時にアプリのTwitterアカウントのフォローをユーザーに尋ねる場合は以下にアカウント名を指定(xAuthの場合のみ)
- (NSString*)twitterUsername {
	return @"";
}

// Facebook - https://developers.facebook.com/apps
/* SHKFacebookAppID is the Application ID provided by Facebook
   SHKFacebookLocalAppID is used if you need to differentiate between several iOS apps running against a single Facebook app. Useful, if you have full and lite versions of the same app,
 and wish sharing from both will appear on facebook as sharing from one main app. 
   You have to add different suffix to each version. Do not forget to fill both suffixes on facebook developer ("URL Scheme Suffix").
   Leave it blank unless you are sure of what you are doing.
   The CFBundleURLSchemes in your App-Info.plist should be "fb" + the concatenation of these two IDs.
 Example:
    SHKFacebookAppID = 555
    SHKFacebookLocalAppID = lite

    Your CFBundleURLSchemes entry: fb555lite
*/
// App ID
- (NSString*)facebookAppId {
	return @"";
}
- (NSString*)facebookLocalAppId {
	return @"";
}

// Evernote - http://www.evernote.com/about/developer/api/
/*	You need to set to sandbox until you get approved by evernote. If you use sandbox, you can use it with special sandbox user account only. You can create it here: https://sandbox.evernote.com/Registration.action
 If you already have a consumer-key and secret which have been created with the old username/password authentication system
 (created before May 2012) you have to get a new consumer-key and secret, as the old one is not accepted by the new authentication
 system.
 // Sandbox
 #define SHKEvernoteHost    @"sandbox.evernote.com"
 
 // Or production
 #define SHKEvernoteHost    @"www.evernote.com"
 */
- (NSString*)evernoteHost {
	return @"";
}
- (NSString*)evernoteConsumerKey {
    return @"";
}
- (NSString*)evernoteSecret {
    return @"";
}

// Flickr - http://www.flickr.com/services/apps/create/
/*
 1 - This requires the CFNetwork.framework
 2 - One needs to setup the flickr app as a "web service" on the flickr authentication flow settings, and enter in your app's custom callback URL scheme.
 3 - make sure you define and create the same URL scheme in your apps info.plist. It can be as simple as yourapp://flickr */
- (NSString*)flickrConsumerKey {
    return @"";
}

- (NSString*)flickrSecretKey {
    return @"";
}
// The user defined callback url
- (NSString*)flickrCallbackUrl{
    return @"app://flickr";
}
@end

4-2. アプリケーションのデリゲートにShareKitをインポート

最終的な AppDelegate.hAppDelegate.m の内容は以下。

AppDelegate.h

#import <UIKit/UIKit.h>
#import "RootViewController.h"
#import "SHKConfiguration.h"
#import "MySHKConfigurator.h"

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) RootViewController *rootViewController;

@end

AppDelegate.m の didFinishLaunchingWithOptions

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // ShareKitのインスタンス化
    DefaultSHKConfigurator *configurator = [[[MySHKConfigurator alloc] init] autorelease];
    [SHKConfiguration sharedInstanceWithConfigurator:configurator];
    
    // メインウインドウ
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    
    // フレームをデバイスのスクリーンサイズにセット
    self.window.frame = CGRectMake(0, 0, [[UIScreen mainScreen]bounds].size.width, [[UIScreen mainScreen]bounds].size.height-20);
    
    // ルートビューコントローラを生成
    _rootViewController= [[RootViewController alloc] init];
    
    // メインウインドウのrootViewControllerをセット
    self.window.rootViewController = _rootViewController;
    
    // レンダリング
    [self.window makeKeyAndVisible];
    
    return YES;
}

iOS 5から搭載されたARC(Automatic Reference Counting)が有効になっていると、ShareKitの初期化の際、autoreleaseをつけると以下のエラーが発生します。

‘autorelease’ is unavailable: not available in automatic reference counting mode

この場合は、autoreleaseをなくすか、ARCを無効化します。

ARCを無効化するには、プロジェクトの xcodeproj を選択し、[Build Settings] で “All”を選び、[Apple LLVM Compiler 4.x – language]の “objective-C Automatic Reference Counting”値を「NO」に変更します。

4-3. ShareKitを表示する設定

ShareKit を表示したいビューコントローラ(ここではRootViewController)に、ShareKit を組み込みます。

ここでは、アプリ起動(RootViewController表示)時に、ShareKit を表示させてみます。

まずは、ShareKitのアクションシートを表示するための関数を作成しましょう。

以下はその例。

// ShareKit を表示する関数
- (void)showShareKitActionSheet
{
    // シェアするURL
    NSURL *url = [NSURL URLWithString:@"http://getsharekit.com"];
    SHKItem *item = [SHKItem URL:url title:@"ShareKit is Awsome!" contentType:SHKURLContentTypeWebpage];
    
    // ShareKit用のアクションシート
    SHKActionSheet *actionSheet = [SHKActionSheet actionSheetForItem:item];
    
    // ShareKit を表示するルートビューコントローラ
    // ※ 通常はShareKitが自動的にビューコントローラを検出するが、表示されないこともあるため、確実性のために明示。
    [SHK setRootViewController:self];
    
    // ShareKit用アクションシートを表示
    [actionSheet showInView:self.view];
    
    // ツールバーから表示する場合
    //[actionSheet showFromToolbar:self.parentViewController.navigationController.toolbar];
}

RootViewControllerのヘッダに SHK.h をインポートしておきます。

最終的な RootViewController は以下のようになります。

RootViewController.h

#import <UIKit/UIKit.h>
#import "SHK.h"

@interface RootViewController : UIViewController

@end

RootViewController.m

#import "RootViewController.h"

@interface RootViewController ()

@end

@implementation RootViewController

// ShareKit を表示する関数
- (void)showShareKitActionSheet
{
    // シェアするURL
    NSURL *url = [NSURL URLWithString:@"http://getsharekit.com"];
    SHKItem *item = [SHKItem URL:url title:@"ShareKit is Awsome!" contentType:SHKURLContentTypeWebpage];
    
    // ShareKit用のアクションシート
    SHKActionSheet *actionSheet = [SHKActionSheet actionSheetForItem:item];
    
    // ShareKit を表示するルートビューコントローラ
    // ※ 通常はShareKitが自動的にビューコントローラを検出するが、表示されないこともあるため、確実性のために明示。
    [SHK setRootViewController:self];
    
    // ShareKit用アクションシートを表示
    [actionSheet showInView:self.view];
    
    // ツールバーから表示する場合
    //[actionSheet showFromToolbar:self.parentViewController.navigationController.toolbar];
}


- (void)viewDidLoad
{
    [super viewDidLoad];
    
    // ShareKit表示
    [self performSelector:@selector(showShareKitActionSheet)];
}

実行結果

ここまで準備できたら、プロジェクトをビルドしてちゃんと ShareKit が表示されるかチェックしてみましょう。

アプリ起動時。capture 2013-02-28 9.06.52

Facebookに投稿する場合。capture 2013-02-28 9.17.05

Twitterに投稿する場合。capture 2013-02-28 9.17.22

その他の共有オプション。capture 2013-02-28 9.19.15

About The Author

某IT系なんちゃってエンジニアヨーダ
Apple好きだけど盲目マカーは気持ち悪いと思ってる中道だと思い込んでるしがないダメダメエンジニア。

今もってるApple製品↓
Macbook Pro 15 inch, iMac 27 inch (Late 2009), iPhone 6 Plus, iPad (初代! いらない!)
Follow :

Leave A Reply

*

Comment On Facebook