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情報の必要項目を入力する。
・Permissionは、Read and Write にする。
Callback URLには、https://example.com をダミーで入力する。
・Callback URLには、twitterkit-{yourConsumerKey}:// を入力する。
注:Callback URLを https://example.comにしていた場合、Xcode11でiOS13向けのビルドを実施したバイナリで実行したときに、下記のメッセージがコンソールログに表示されて、Twitter連携が失敗する。
[TwitterKit] did encounter error with message "Error obtaining user auth token.": Error Domain=TWTRLogInErrorDomain Code=-1 "Callback URL not approved for this client application. Approved callback URLs can be adjusted in your application settings" UserInfo={NSLocalizedDescription=Callback URL not approved for this client application. Approved callback URLs can be adjusted in your application settings}

参考記事:
https://qiita.com/nwatabou/items/6a0c891ff3f206cdb8e9
https://developer.twitter.com/en/docs/basics/apps/guides/callback-urls


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

3. Twitter Kit SDKを手動でダウンロードした場合
(1) Xcode上のプロジェクトの左ペインのトップレベルに、ダウンロードしたTwitter Kit for iOSをフォルダごとドラッグ&ドロップでコピーする。
(1.1) TARGETS -> Build Phases -> Link Binary With Libraries に、TwitterKit.frameworkTwitterCore.framework を追加されていることを確認する。
(1.2) TARGETS -> Build Settings -> Enable Bitcode をNOに設定する。(Ver3.3.0導入時の2018年2月25日現在。YES の場合、実機テスト時は出力されなかった大量の警告メッセージがArchive Build時に表示される。)
(2018年2月28日現在、Projectによっては Bitcode=YESでも警告メッセージが表示されないことが判明。Build Settingの設定内容によって、BitcodeをYES/NOとする必要がある模様。設定の違いは未調査。)

(注) ItemをCopyするかを尋ねる選択画面が表示された場合は、「Copyする」にチェックを入れること。

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

ビルド時にエラーになった場合は、Accounts.frameworkSocial.frameworkPhotos.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
posted by mobileDeveloper at 20:22 | Comment(1) | Twitter はてなブックマーク - Twitter Kit for iOSを導入する | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
Demoの時問題なく実装できましたが、本アプリ(Object C iPadアプリ)に入れると、以下のエラーが出ました。
Undefined symbols for architecture arm64:
"_OBJC_CLASS_$_AVAssetImageGenerator", referenced from:
objc-class-ref in TwitterKit(TWTRSharedComposerWrapper.o)
"_OBJC_CLASS_$_AVAsset", referenced from:
objc-class-ref in TwitterKit(TWTRSharedComposerWrapper.o)
"_CMTimeMake", referenced from:
_videoThumbnail in TwitterKit(TWTRSharedComposerWrapper.o)
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

SafariServices framework追加済みなのに・・・
ご意見をいただけませんか?
Posted by HuongTTL at 2017年09月08日 14:04
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

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


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