# Objective-CのコードでSDKを使用する
# 概要
LINE SDK for iOS SwiftはすべてSwiftで書かれていますが、Objective-Cのプロジェクトで使用できます。方法は2つあります。
# オプション1:言語混在プロジェクトを作成する
SwiftとSwift/Objective-Cの相互運用の経験がある場合は、LINE SDK for iOS SwiftをObjective-Cのプロジェクトに直接組み込み、Swift言語でLINE SDKのAPIを呼び出すことをお勧めします。
Objective-Cの既存のプロジェクトは、Objective-CとSwiftの言語混在プロジェクトに変換できます。言語混在プロジェクトに、LINE SDK for iOS Swiftと処理を受け渡しするSwiftのファイルを追加できます。
Swiftのファイル内で必要な宣言をObjective-Cから利用するには、宣言に@objc
属性または@objcMembers
属性を付与してください。これらの属性について詳しくは、Swift.orgの「Attributes (opens new window)」を参照してください。
Swiftのファイルをプロジェクトにインポートすると、Xcodeにより自動的にブリッジングヘッダーファイルが生成されます。これにより、それらのファイルをObjective-Cのコードでも利用できるようになります。ブリッジングヘッダーについて詳しくは、Appleの「Importing Swift into Objective-C (opens new window)」を参照してください。
SwiftのクラスをObjective-Cのプロジェクトで使えるようにするうえで、以下の記事も役に立ちます。
- Jen Sipila (opens new window)の「Setting up Swift and Objective-C Interoperability (opens new window)」。特に、「Make a Swift Class available to Objective-C Files」セクションが参考になります。
- Appleの「Migrating Your Objective-C Code to Swift (opens new window)」。プロセス全体を理解するのに役立ちます。
# オプション2:Objective-Cラッパーを使う
Objective-CのコードでLINE SDK for iOS Swiftと処理を受け渡しするには、LINE SDK for iOS Swiftに含まれるObjective-Cラッパーを使います。オプション1とは異なり、Objective-Cラッパーフレームワークをプロジェクトに追加する必要があります。ここでは、Objective-Cラッパーの基本概念、インストール、および一般的な使い方について説明します。
LINE SDK for iOS SwiftはSwiftのコードにのみ対応しています。SDKをObjective-Cのコードに対応させるため、Objective-CラッパーはコアSDK上に実装されています。LINE SDK for iOS Swiftの中核的な機能のほとんどを、ラッパーを介して利用できます。Swiftと完全な互換性がないObjective-Cの仕様の制限により、一部の機能はObjective-Cラッパーで利用できません。
本来のSDKと名前衝突を起こさないように、タイプとほとんどのSDKコンポーネントの名前に「LineSDK」というプリフィックスが付きます。ラッパーの設定には追加的な手順も伴います。
ラッパーはLINE SDK for iOS Swiftを使うための一時的な手段であることに留意してください。LINE SDK for iOS Swiftの機能をフル活用するには、プロジェクトをSwiftに移行する事を推奨します。
# インストール
# 前提条件
LINE SDK for iOSをビルドしてObjective-Cラッパーを介して使用するには、以下が必要です。
- デプロイメントターゲットとしてiOS 11.0以降
- Xcode 10以降
# CocoaPods
CocoaPodsについて詳しくない場合は、『CocoaPods Getting Started Guide (opens new window)』を参照してください。CocoaPodsを使ってLINE SDK for iOS Swiftをアプリに組み込む前に、作業環境にCocoaPodsのgemをインストールする必要があります。
Podfileを準備したら、ターゲットに以下のpodコマンドを追加します。
platform :ios, '11.0' use_frameworks! target '<Your App Target Name>' do pod 'LineSDKSwift/ObjC', '~> 5.0' end
以下のコマンドを実行します。
$ pod install
LINE SDK for iOS Swiftがダウンロードされ、Xcodeのワークスペースに組み込まれます。
# SDKをインポートする
LINE SDK for iOS SwiftをObjective-Cラッパーと共にObjective-Cのプロジェクトにインポートするには、以下のように@import LineSDK;
を追加します。
#import "ViewController.h"
@import LineSDK;
@implementation ViewController
// ...
@end
# Carthage
Carthage (opens new window)は分散型の依存性マネージャーで、ライブラリをビルドしてバイナリのフレームワークとして利用できます。
Carthageツールをインストールするには、Homebrew (opens new window)を使います。
$ brew update $ brew install carthage
Carthageを使ってLINE SDK for iOS SwiftをXcodeプロジェクトに組み込むには、CartfileにSDKのGitHubリポジトリを以下のように指定します。
github "line/line-sdk-ios-swift" ~> 5.0
以下のコマンドを実行してLINE SDK for iOS Swiftをビルドします。
$ carthage update line-sdk-ios-swift
以下のセクションに記載された手順に従って、ビルドされたLineSDK.framework
ファイルとLineSDKObjC.framework
ファイルをXcodeプロジェクトに追加できます。
# フレームワークファイルをXcodeプロジェクトにリンクする
Carthage/Build/iOS
フォルダーからLineSDK.framework
ファイルとLineSDKObjC.framework
ファイルをドラッグして、アプリのターゲットの[Build Phases]設定タブの[Link Binary With Libraries]セクションにドロップします。
# ビルドフェーズでフレームワークファイルをコピーする
アプリのターゲットの[Build Phases]設定タブで [+]アイコンをクリックして、[New Run Script Phase]を選択します。以下の内容で実行スクリプトを作成します。
/usr/local/bin/carthage copy-frameworks
フレームワークファイルのパスを[Input Files]セクションに追加します。
$(SRCROOT)/Carthage/Build/iOS/LineSDK.framework $(SRCROOT)/Carthage/Build/iOS/LineSDKObjC.framework
フレームワークファイルのパスを[Output Files]セクションに追加します。
$(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/LineSDK.framework $(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/LineSDKObjC.framework
[Build Phases]設定タブは以下のようになるはずです。
# [Always Embed Swift Standard Libraries]オプションを有効にする
[Build Settings]設定タブで[Always Embed Swift Standard Libraries](ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES
)オプションを[YES]に設定して、Swiftの標準ライブラリを最終的なアプリバンドルに含めます。
# SDKをインポートする
LINE SDK for iOS SwiftをObjective-Cラッパーと共にObjective-Cのプロジェクトにインポートするには、以下のように@import LineSDKObjC;
を追加します。
#import "ViewController.h"
@import LineSDKObjC;
@implementation ViewController
// ...
@end
# 命名規則
Objective-Cラッパーを使う場合、タイプとほとんどのSDKコンポーネントの名前に「LineSDK」というプリフィックスが付きます。以下のコードサンプルは、よく実行されるタスクのObjective-Cでの制御方法を示しています。
# 複数の権限を指定してユーザーをログインさせる
NSSet *permissions = [NSSet setWithObjects:
[LineSDKLoginPermission profile],
[LineSDKLoginPermission openID],
nil];
[[LineSDKLoginManager sharedManager]
loginWithPermissions:permissions
inViewController:self
parameters:nil
completionHandler:^(LineSDKLoginResult *result, NSError *error) {
if (result) {
NSLog(@"User Name: %@", result.userProfile.displayName);
} else {
NSLog(@"Error: %@", error);
}
}
];
# ユーザープロフィールを取得する
[LineSDKAPI getProfileWithCompletionHandler:
^(LineSDKUserProfile * _Nullable profile, NSError * _Nullable error)
{
if (profile) {
NSLog(@"User Name: %@", profile.displayName);
} else {
NSLog(@"Error: %@", error);
}
}];
# Objective-Cラッパーでエラーを制御する
Objective-Cの規則に対応するため、Objective-CラッパーはNSError
オブジェクトをスローします。以下のコードでは、エラーがLINE SDKに関係するのかどうかを確認しています。
NSError *error = // ... An error from LINE SDK ObjC Wrapper
if ([error.domain isEqualToString:[LineSDKErrorConstant errorDomain]]) {
// SDK Error
}
ラッパーからスローされるすべてのエラーは、本来のLINE SDK for iOS Swiftからスローされるのと同じcode
プロパティとuserInfo
プロパティを持ちます。それらを使ってエラーの原因を確認できます。
if (error.code == 2004) {
// invalidHTTPStatusAPIError
NSNumber *statusCode = error.userInfo[[LineSDKErrorConstant userInfoKeyStatusCode]];
if ([statusCode integerValue] == 403) {
// Permission granting issue. Ask for authorization with enough permission again.
}
}
エラーを特定して制御する方法については、「エラーを制御する」を参照してください。