重要: PebbleKit iOS は廃止されました。 Apple は、サードパーティのスマートウォッチが iOS で競争力のある体験を提供することをますます困難にしています。長年にわたり、Apple は Pebble の機能に不可欠であった機能を体系的に制限してきました。これには、通知への返信、メッセージの送信、アプリ間通信の有効化、コンパニオンアプリがバックグラウンドにあるときの適切な機能などが含まれます。これらの制限により、Android で利用可能な機能に匹敵するスマートウォッチ体験を iOS 上で構築することはほぼ不可能になりました。開発者の皆様には、人為的なプラットフォーム制限なしに Pebble が完全な可能性を発揮できる Android 開発に注力することをお勧めします。Apple の制限とサードパーティウェアラブルへの影響について詳しくは、このブログ投稿 をご覧ください。
訳者注(2025/12/21): EU による Apple への規制強化により、通知への返信などが可能となるようです(Eric の X 上でのポスト)。どこの地域まで、またどの範囲で機能制限が解除されるかなどは、訳者が把握しておらず、また PebbleKit iOS が復活するかどうかは、CoreDevices 社の方針や余力によります。
このセクションでは、読者が Objective-C、IDE としての Xcode、デリゲートパターンとブロックパターンの基本的な知識を持っていることを前提としています。
アプリが Swift を使用している場合、PebbleKit iOS は互換性があるはずです。フレームワーク自体は Objective-C で記述されており、純粋な Objective-C アプリで Swift ランタイムの要件を回避し、下位互換性と上位互換性を向上させています。
プロジェクトが CocoaPods(推奨されるアプローチ)を使用している場合は、Podfile に pod 'PebbleKit' を追加して、pod install を実行するだけです。
プロジェクトに PebbleKit iOS をインストールした後、次の最終ステップを実行します:
bluetooth-peripheral(「App shares data using CoreBluetooth」)と bluetooth-central(「App communicates using CoreBluetooth」)がターゲットの Info.plist ファイルに追加されます。NSBluetoothPeripheralUsageDescription(「Privacy - Bluetooth Peripheral Usage Description」)を Info.plist に追加する必要があります。PebbleKit iOS を手動で追加する場合、または他の代替手段については、リポジトリ の手順に従ってください。ドキュメントには、有用な追加情報が含まれている場合があります。注意深くお読みください。
iOS コンパニオンアプリが Pebble 上のウォッチアプリと通信またはメッセージ交換を開始する前に、PebbleKit にウォッチアプリを識別する方法を提供する必要があります。ウォッチアプリの UUID がこの目的に使用されます。
PBPebbleCentral インスタンスに関連付けられたアプリ UUID を設定します。標準表現の UUID を NSUUID に作成する簡単な方法を以下に示します:
// Set UUID of watchapp
NSUUID *myAppUUID =
[[NSUUID alloc] initWithUUIDString:@"226834ae-786e-4302-a52f-6e7efc9f990b"];
[PBPebbleCentral defaultCentral].appUUID = myAppUUID;
組み込みの Sports または Golf アプリと通信しようとしている場合、それらの UUID は PBSportsUUID および PBGolfUUID として PebbleKit の一部として利用可能です。これらのアプリと通信する場合は、これらの UUID を登録する必要があります。
Pebble ウォッチと通信するには、クラスは PBPebbleCentralDelegate を実装する必要があります:
@interface ViewController () <PBPebbleCentralDelegate>
PBPebbleCentral クラスは直接インスタンス化しないでください。代わりに、常に [PBPebbleCentral defaultCentral] によって提供されるシングルトンを使用してください。以下に Golf アプリ UUID を使用した例を示します:
central = [PBPebbleCentral defaultCentral];
central.appUUID = myAppUUID;
[central run];
これが完了したら、クラスをデリゲートに設定します:
[PBPebbleCentral defaultCentral].delegate = self;
このデリゲートは、Pebble が接続または切断されるたびに 2 つのコールバック(pebbleCentral:watchDidConnect:isNew: と pebbleCentral:watchDidDisconnect:)を受け取ります。デリゲートが設定されたときに Pebble がすでに接続されている場合、アプリは接続コールバックを受け取りません。
関連する接続/切断イベントを受信するには、これらを実装します:
- (void)pebbleCentral:(PBPebbleCentral *)central watchDidConnect:(PBWatch *)watch isNew:(BOOL)isNew {
NSLog(@"Pebble connected: %@", watch.name);
// Keep a reference to this watch
self.connectedWatch = watch;
}
- (void)pebbleCentral:(PBPebbleCentral *)central watchDidDisconnect:(PBWatch *)watch {
NSLog(@"Pebble disconnected: %@", watch.name);
// If this was the recently connected watch, forget it
if ([watch isEqual:self.connectedWatch]) {
self.connectedWatch = nil;
}
}
iOS アプリが Pebble と通信するように正しく設定されたら、最後のステップは実際に通信を開始することです。以下が呼び出されるまで、通信は行われません:
[[PBPebbleCentral defaultCentral] run];
これが発生すると、ユーザーはアプリが通信することを望むかどうかの確認を求めるダイアログが表示される場合があります。これは、アプリが UI の適切な瞬間まで
run:を呼び出すべきではないことを意味します。
iOS アプリはコンパニオン Pebble アプリとは別にビルドされるため、ビルドシステムが一致するアプリメッセージキーを自動的に作成する方法はありません。したがって、package.json で手動で指定する必要があります:
{
"Temperature": 0,
"WindSpeed": 1,
"WindDirection": 2,
"RequestData": 3,
"LocationName": 4
}
これらの数値は、iOS アプリでアプリメッセージキーとして使用できます。
メッセージは NSDictionary クラスで構築され、appMessagesPushUpdate: 関数が呼び出されたときに PBPebbleCentralDelegate によって C ウォッチアプリまたはウォッチフェイスに送信されます。
メッセージを送信するには、C ウォッチアプリに送信するデータを含む NSDictionary オブジェクトを準備します。データ項目は、標準データ型のキーと値のペアを使用して NSDictionary に追加されます。以下に、文字列と整数を含む例を示します:
NSDictionary *update = @{ @(0):[NSNumber pb_numberWithUint8:42],
@(1):@"a string" };
appMessagesPushUpdate: を使用して、この辞書をウォッチアプリに送信します。最初の引数は送信する更新辞書で、2 番目の引数は、データがウォッチによって確認されたとき(またはエラーが発生したとき)に呼び出されるコールバックブロックです。
[self.connectedWatch appMessagesPushUpdate:update onSent:^(PBWatch *watch, NSDictionary *update, NSError *error) {
if (!error) {
NSLog(@"Successfully sent message.");
} else {
NSLog(@"Error sending message: %@", error);
}
}];
配信されると、この辞書は、Sending and Receiving Data で詳述されているように、AppMessageInboxReceived コールバック経由で C アプリで利用可能になります。
ウォッチアプリからメッセージを受信するには、appMessagesAddReceiveUpdateHandler: を使用して受信ハンドラー(ブロック)を登録します。このブロックは、2 つのパラメータ(メッセージを送信した Pebble を記述する PBWatch オブジェクトへのポインタと、受信したメッセージを含む NSDictionary)で呼び出されます。
[self.connectedWatch appMessagesAddReceiveUpdateHandler:^BOOL(PBWatch *watch, NSDictionary *update) {
NSLog(@"Received message: %@", update);
// Send Ack to Pebble
return YES;
}];
ハンドラーでは常に
YESを返してください。これにより、PebbleKit は自動的に Pebble に ACK を送信し、メッセージのタイムアウトを回避します。
データは、!= nil チェックを使用して各キーの存在をまずテストし、存在する場合は値を読み取ることで、NSDictionary から読み取ることができます:
NSNumber *key = @1;
// If the key is present in the received dictionary
if (update[key]) {
// Read the integer value
int value = [update[key] intValue];
}
メッセージの送受信に加えて、PebbleKit iOS では、Pebble とのより複雑な対話も可能になります。詳細については、PebbleKit iOS Documentation を参照してください。以下に、可能なことのいくつかの例を示します:
PBWatch の connected プロパティを使用してウォッチが接続されているかどうかを確認します。 BOOL isConnected = self.watch.connected;
PBDataloggingServiceDelegate になることで watchDidConnect および watchDidDisconnect イベントを受信します。iOS プラットフォームは、アプリがアクセサリで実行できることにいくつかの制限を課しています。また、バックグラウンドにあるアプリの機能も制限します。PebbleKit iOS に依存するアプリを開発する際には、これらの制限を理解することが重要です。
iOS では、モバイルアプリと Pebble 間のすべての通信は、通信セッションを介して管理されます。この通信セッションは iOS 固有のプロトコルであり、Pebble 用の iOS コンパニオンアプリを開発する際に、読者が知っておくべき顕著な制限があります。
BLE モードで Pebble と通信する Pebble アプリの場合、それを必要とする各アプリに対してセッションを作成できます。これにより、「1 つのセッションのみ」という制限が削除されますが、これらの BLE アプリに限定されます。現在、Pebble Time Round や Pebble 2 など、いくつかの BLE 専用デバイスがありますが、ファームウェア 3.8 以降を使用しているすべてのデバイスは、BLE を使用して PebbleKit と通信できます。
BLE アプリの場合、「電話を起動する必要がある」という制限が削除されます。ユーザーが iOS アプリを強制終了したり、クラッシュしたりして動作が停止した場合、iOS コンパニオンアプリはウォッチアプリによって再起動できます。ただし、iOS デバイスを再起動した後はアプリが動作しないため、起動後に iPhone ユーザーが一度起動する必要があることに注意してください。
PebbleKit iOS 3.1.1 は、3.0 より古いファームウェアとの通信をサポートする最後の PebbleKit です。PebbleKit iOS 4.0.0 は、ファームウェア 3.0 より新しい Pebble デバイスとのみ通信できます。
Pebble Time、Pebble Time Steel、Pebble Time Round、Pebble 2 などの新しいデバイスには問題はありません。Pebble や Pebble Steel などの以前の世代のデバイスの場合、ユーザーは新しいアプリを使用して、デバイスで利用可能な最新のファームウェアにファームウェアをアップグレードする必要があることを意味します。
この変更により、サードパーティによってより良い互換性と新機能を開発できるようになります。