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には、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 "" UserInfo={NSLocalizedDescription= Callback URL not approved for this client application. Approved callback URLs can be adjusted in your application settings } 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.framework と TwitterCore.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.framework 、CoreMedia.framework を追加する。
ビルド時にエラーになった場合は、Accounts.framework、Social.framework、Photos.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
【Twitterの最新記事】
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追加済みなのに・・・
ご意見をいただけませんか?