Copyright (C) iPhoneアプリ開発備忘録 All rights reserved.
ブログ内で記したコード、内容の正確性は保証いたしません。
記載内容を実装したことにより発生した不具合・損害等の責任は一切負いません。



2017年08月03日

Twitter Kit for iOSを導入する



iOS11でsocial.frameworkのServiceTypeにて、SLServiceTypeTwitter、SLServiceTypeFacebookがdeprecatedとなった。

Xcode9 betaでDeployment TargetをiOS11にして、SLComposeViewController isAvailableForServiceType:SLServiceTypeTwitterを実行すると、Falseが返ってくるため、Twitter投稿機能が有効ではないことがわかる。(iOS11 beta4にて確認)

つまり、deprecated(非推奨)なのに、iOS11ではいきなり動作しなくなるという、今までのdeprecatedのように非推奨だけどとりあえず動作するという状況とは異なる強烈な仕様変更となっている。
昨今のWebサービスのログインに関しては、認証方法について2ファクタ認証が導入されるなど、セキュリティを考慮した施策がなされているため、iOSレベルではなく他社サービス連携は他社が提供する連携手段を使うべしという方針に転換したということなのだろう。

Twitter公式アプリがインストールされていれば、social.frameworkのTweet機能が使えるという謎情報もあるようだが、先に述べたように、Twitter公式アプリをインストールし、設定アプリでTwitterアカウントを登録していても、SLComposeViewController isAvailableForServiceType:SLServiceTypeTwitterを実行すると、Falseが返ってくるため、iOSが提供するsocial.frameworkを今後も使用し続けるのは好ましくない。

iOS9から利用可能なTwitter公式のTwitter kit 3なるSDKの最新版が提供されているので、social.frameworkのTweet機能から移行するべきである。(iOS11 beta4での確認情報であり、今後変更される可能性もあるが、Twitter kitに早いうちに移行することを推奨する)

1. TwitterにDeveloper情報を登録する。
(1) Twitterにサインインし、Developer情報、Apps情報を登録する。
https://apps.twitter.com

(2) Apps情報の必要項目を入力する。
・Callback URLには、https://example.com をダミーで入力する。
・Permissionは、Read and Write にする。


2. Twitter Kit SDKをダウンロードする。
(1) cocoapodsを使うか、手動でダウンロードする。
https://github.com/twitter/twitter-kit-ios/wiki/Installation

3. Twitter Kit SDKを手動でダウンロードした場合
(1) 組み込むプロジェクトに、ダウンロードしたTwitter Kit SDKの
TwitterKit.frameworkTwitterCore.frameworkTwitterKitResources.bundle をドラッグ&ドロップでコピーする。
TwitterKitResources.bundleは、TwitterKit.frameworkのフォルダの中にある。

Ver3.3.0以降は下記の手順。
(1.1) Xcode上のプロジェクトの左ペインのトップレベルに、ダウンロードしたTwitter Kit for iOSをフォルダごとドラッグ&ドロップでコピーする。
(1.2) TARGETS -> General -> Embedded Binaries に、TwitterKit.framework を追加する。
(注) Ver3.3.0導入時の2018年2月25日現在、実機テスト時は(1.2)操作をしても問題はないが、Archive後にOrganizerでValidationやUploadするときに、エラーが表示される。
Found an unexpected Mach-O header code:
従って、(1.2)操作は行わず、(1.3)が実施されていることを確認する。

参考記事:
https://stackoverflow.com/questions/33076819/found-an-unexpected-mach-o-header-code-0x72613c21-in-xcode-7/33528841

(1.3) TARGETS -> Build Phases -> Link Binary With Libraries に、TwitterKit.frameworkTwitterCore.framework を追加する。
(1.4) TARGETS -> Build Settings -> Enable Bitcode をNOに設定する。(Ver3.3.0導入時の2018年2月25日現在。YES の場合、実機テスト時は出力されなかった大量の警告メッセージがArchive Build時に表示される。)

(注) ItemをCopyするかを尋ねる選択画面が表示された場合は、「Copyする」にチェックを入れること。
(注) (1.2)〜(1.3)は、(1.1)でコピーした自分のプロジェクト内のTwitter Kit for iOSから選択すること。

(2) 組み込むプロジェクトのTARGETS -> Build Phases -> Link Binary With Librariesの項に、
SafariServices.framework AVFoundation.frameworkCoreMedia.framework を追加する。


4. 組み込むプロジェクトのTAEGETS -> info.plistにURLスキームなどの情報を追加する。
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes
<array>
<string>twitterkit-{yourConsumerKey}
</array>
</dict>
</array>
<key>LSApplicationQueriesSchemes</key>
<array>
<string>twitter</string>
<string>twitterauth</string>
</array>


CFBundleURLSchemesには、上記1で登録された時にTwitterにて自動的に設定されるConsumer Keyを、
"twitterkit-"の後に付加して設定する。


5. ソースコードの編集 (Objective-cのみ、Swiftについては、Twitter公式ページ参照)
(1) AppDelegete.m
#import <TwitterKit/TwitterKit.h>
#import <TwitterKit/TWTRKit.h> // TwitterKitのVer3.3.0以降はこちらを使用

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

// Twitter kit初期設定
[[Twitter sharedInstance] startWithConsumerKey:@"hoge" consumerSecret:@"fuga"];

}

// Twittr KitのリダイレクトURL設定
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary *)options
{
return [[Twitter sharedInstance] application:app openURL:url options:options];
}


・application:(UIApplication *)application didFinishLaunchingWithOptionsで定義する、startWithConsumerKey には、上記1で登録された時にTwitterにて自動的に設定されるConsumer Keyを設定する。

・application:(UIApplication *)application didFinishLaunchingWithOptionsで定義する、consumerSecretには、上記1で登録された時にTwitterにて自動的に設定されるConsumer Secretを設定する。

・application:(UIApplication *)app openURLは、Twitterにログインした後にこのメソッドが呼び出され、Twitterに認証トークンがデバイス内のディスクに保存される。


(2) Twitter投稿部分
- (void)tweetMain
{
// Twitter 認証トークンのチェック
if ([[Twitter sharedInstance].sessionStore hasLoggedInUsers]) { // 認証トークンあり
[self tweet];

} else { // 認証トークンなし
// Twitterログイン
[[Twitter sharedInstance] logInWithCompletion:^(TWTRSession *session, NSError *error) {
if (session) { // ログイン OK
NSLog(@"signed in as %@", [session userName]);

[self tweet];

} else { // ログイン キャンセル
NSLog(@"error: %@", [error localizedDescription]);
}
}];
}
}

- (void)tweet
{
// Twitter投稿データ編集
TWTRComposer *composer = [[TWTRComposer alloc] init];
[composer setText:@"hoge"];
[composer setImage:[UIImage imageNamed:@"twitterkit"]];
[composer setURL:[NSURL URLWithString:@"http://yahoo.co.jp"]];

// Twitter投稿画面表示
[composer showFromViewController:self completion:^(TWTRComposerResult result) {
if (result == TWTRComposerResultCancelled) { // キャンセル
NSLog(@"Tweet composition cancelled");
}
else {
NSLog(@"Sending Tweet!");
}
}];
}


・既にログイン済でTwitter 認証トークンが取得されている場合は、Twitterのログインは不要なので、認証トークンが存在するかチェックを行い、認証トークンが存在しない場合はログイン画面を表示し、ログイン成功時にTweet画面を表示するようにする。認証トークンが存在する場合は、Tweet画面を表示する。


参考記事:
https://dev.twitter.com/twitterkit/ios/migrate-social-framework
http://qiita.com/Takumi_Mori/items/1b27c46114cc839e01e5
タグ:Mac apple iPAD IOS iPhone
【Twitterの最新記事】
posted by mobileDeveloper at 20:22 | Comment(0) | Twitter はてなブックマーク - Twitter Kit for iOSを導入する | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。
Apple、Appleのロゴ、App Store、iPodのロゴ、iTunesは、米国および他国のApple Inc.の登録商標です。
iPhone、iPod touch、iPadはApple Inc.の商標です。
iPhone商標は、アイホン株式会社のライセンスに基づき使用されています。
その他、本ブログに記載されている製品名、会社名は、それぞれ各社の商標または登録商標です。