iOS-এ স্ট্রাকচার API

iOS-এর হোম এপিআই-এর মাধ্যমে স্ট্রাকচার এপিআইগুলো অ্যাক্সেস করা যেতে পারে।

Structure API-গুলো ব্যবহার করার জন্য, প্রথমে আপনার অ্যাপে GoogleHomeSDK প্যাকেজটি ইম্পোর্ট করুন:

import GoogleHomeSDK

ত্রুটি পরিচালনা

Home API-এর কিছু মেথড HomeError থ্রো করে, তাই আমরা সুপারিশ করি যে আপনি ওই কলগুলোতে HomeError ধরার জন্য একটি do-catch ব্লক ব্যবহার করুন।

HomeError হ্যান্ডেল করার সময়, কী ভুল হয়েছে তা জানতে এর code এবং message ফিল্ডগুলো পরীক্ষা করুন।

যেকোনো অনিয়ন্ত্রিত ত্রুটির ফলে আপনার অ্যাপটি ক্র্যাশ করবে।

আরও তথ্যের জন্য, ত্রুটি পরিচালনা (Error handling ) দেখুন।

স্ট্রাকচার এপিআই

Home হলো Home গ্রাফের প্রতিনিধিত্বকারী এবং Structure API-এর প্রবেশদ্বার। এটি স্ট্রাকচার, রুম এবং ডিভাইসের রেফারেন্স প্রদান করে।

Structure আপনার হোম গ্রাফের একটি কাঠামোকে উপস্থাপন করে। এটি id এবং name মতো কাঠামোর মেটাডেটাতে অ্যাক্সেস প্রদান করে।

আপনার অ্যাকাউন্টের সমস্ত স্ট্রাকচার পেতে structures() ব্যবহার করুন। স্ট্রাকচারগুলো একটি Query আকারে ফেরত আসে, যা এর ডেটা ব্যবহারের জন্য বিভিন্ন উপায় প্রদান করে:

এপিআই বর্ণনা
stream() এমন একটি Publisher ফেরত দেয় যা পরিবর্তন ঘটার সাথে সাথে প্রতিটি অবজেক্টকে আলাদাভাবে নির্গত করে।
batched() এমন একটি Publisher ফেরত দেয় যা বর্তমান ফলাফলকে অবজেক্টের একটি Set হিসেবে নির্গত করে। প্রতিটি নির্গত Set অবজেক্ট গ্রাফের বর্তমান অবস্থাকে উপস্থাপন করে।
list() বর্তমান ফলাফলটি অবজেক্টের একটি Set হিসেবে ফেরত দেয়।

` structures().list() কলটি তাৎক্ষণিকভাবে স্ট্রাকচারের একটি বৈধ সেট ফেরত নাও দিতে পারে। যদি আপনার অ্যাপটি রিঅ্যাক্টিভ হয় এবং UI চালনা করার জন্য সমস্ত স্ট্রাকচার পরিবর্তনে সাবস্ক্রাইব করতে stream() কল করে, তবে অবশেষে স্ট্রাকচারের একটি বৈধ তালিকা ফেরত আসা উচিত। আরও কিছু পরিস্থিতি আছে যেখানে একটি খালি স্ট্রাকচার তালিকা ফেরত আসতে পারে, যেমন যদি ব্যবহারকারীর ফোনের সংযোগ বিচ্ছিন্ন হয়ে যায় অথবা যদি ব্যবহারকারী আপনার অ্যাপের অনুমতি প্রত্যাহার করে নেয়। আপনার অ্যাপে এই পরিস্থিতিগুলো অবশ্যই সামাল দেওয়া উচিত।

@Published public private(set) var structures: [Structure] = []
private var structuresCancellable: AnyCancellable?

  self.structuresCancellable = home
    .structures()
    .batched()
    .receive(on: DispatchQueue.main)
    .map { Array($0) }
    .catch {
      // Failed to load structures
      return Just([Structure]())
    }
    .assign(to: \.structures, on: self)

নমুনা কাঠামো কল

এক সেট কাঠামো নিন

একটি Query<Structure> এর উপর list() কল করলে উপাদানগুলোর সর্বশেষ Set ফেরত আসে:

// Get a stream of all structures accessible to the user
let allStructuresChanges = self.home.structures()
let allStructures = try? await allStructuresChanges.list()

একটি রিঅ্যাক্টিভ অ্যাপ ডিজাইন করার সময়, আপনি list() এর পরিবর্তে batched() এবং stream() কল ব্যবহার করতে চাইবেন, কারণ হোম গ্রাফ পরিবর্তিত হলে এগুলি স্বয়ংক্রিয়ভাবে ডেটা তৈরি করে।

কাঠামোর বৈশিষ্ট্যগুলি পান

স্ট্রাকচারগুলোর তালিকা হাতে থাকলে, আপনি সেগুলোর প্রোপার্টিগুলো অ্যাক্সেস করতে পারবেন:

// Get a stream of changes taking place on a structure.
let structureChanges = try await home.structures().list().filter { $0.id == structureID }

// Get a snapshot of the structure.
let structure = structureChanges.first!

// Get structure properties
print("id \(structure.id) ")
print("name \(structure.name) ")

নাম দ্বারা একটি কাঠামো খুঁজুন

যদি আপনি কোনো স্ট্রাকচারের নাম জানেন, তাহলে আপনি name প্রপার্টি ব্যবহার করেও সেটি অ্যাক্সেস করতে পারেন:

do {
  structure1 = try await home.structures().list().first(where: { $0.name == "Main House" })
} catch let _ as HomeError {
  // Code for handling the exception
}

সেখান থেকে প্রতিটি কাঠামোর সম্পত্তি, কক্ষ এবং ডিভাইসগুলিতে প্রবেশ করা যায়।

একাধিক কাঠামোর সাথে কাজ করুন

একাধিক স্ট্রাকচার ব্যবহার করতে, প্রতিটি স্ট্রাকচারের জন্য একটি পৃথক রেফারেন্স নিন:

var structure1: Structure!
var structure2: Structure!
do {
  structure1 = try await home.structures().list().first(where: { $0.name == "Main House" })
} catch let _ as HomeError {
  // Code for handling the exception
}
do {
  structure2 = try await home.structures().list().first(where: { $0.name == "Guest Cottage" })
} catch let _ as HomeError {
  // Code for handling the exception
}

কক্ষ

একটি রুমে একাধিক ডিভাইস থাকে। একটি রুম সর্বদা একটি কাঠামোর অংশ এবং একটি কাঠামোতে একাধিক রুম থাকতে পারে। একটি কাঠামো থেকে কোনো রুম সরিয়ে ফেললে সেই রুমের ডিভাইসগুলো কাঠামো থেকে মুছে যায় না। তবে, রুমটি ডিলিট করা হলে, সেই রুমের ডিভাইসগুলো অনিয়োজিত হয়ে যায়।

অ্যাকাউন্টের সমস্ত রুম খুঁজে পেতে Home.rooms() ব্যবহার করুন, তারপর প্রতিটি রুমে সংশ্লিষ্ট ডিভাইসগুলো দেখতে roomID = device.roomID ব্যবহার করুন।

self.home.rooms().batched()
  .combineLatest(self.home.devices().batched())
  .receive(on: DispatchQueue.main)
  .catch { error in
    // Failed to load rooms and devices
    return Just((Set<Room>(), Set<HomeDevice>()))
  }
  .map { rooms, devices in
    var devicesByRoom = [Room: [HomeDevice]]()
    for room in rooms where room.structureID == currentStructureID {
      devicesByRoom[room] = devices.filter { $0.roomID == room.id }
    }
    return devicesByRoom
  }.assign(to: &self.$devicesByRoom)

নমুনা কক্ষের কল

রুমের তালিকা নিন

Home ক্লাস ব্যবহার করে, আপনি রুমগুলির একটি তালিকা পেতে এবং সেগুলির প্রোপার্টিগুলি অ্যাক্সেস করতে পারেন:

let allRoomsChanges = self.home.rooms()
let allRooms = try await allRoomsChanges.list()
let room = allRooms.first!
XCTAssertTrue(allRooms.contains(room))

print("id \(room.id) ")
print("name \(room.name) ")

একটি রুম তৈরি করুন

একটি Structure নতুন কক্ষ তৈরি করতে:

let testName = "Test Room Name"
var newRoom: Room!
do {
  newRoom = try await structure.createRoom(name: testName)
  XCTAssertNotNil(newRoom)
} catch let _ as HomeError {
  // Code for handling the exception
}

একটি রুম মুছে ফেলুন

অথবা, বিকল্পভাবে, আপনি একটি রুম মুছে ফেলতে পারেন:

val roomToDelete = structure.rooms().list().filter { it.name == "room_id1" }.firstOrNull()
    structure.deleteRoom(roomToDelete!!)

আপনি এর আইডি ব্যবহার করেও একটি রুম মুছে ফেলতে পারেন:

let roomToDelete = allRooms.first(where: { $0.id == room.id })
if let roomToDelete1 = roomToDelete {
  do {
    try await structure.deleteRoom(roomToDelete1)
  } catch let _ as HomeError {
    // Code for handling the exception
  }
}

ডিভাইসসহ কোনো রুম মুছে ফেলা হলে, ডিভাইসগুলো কাঠামোতে থেকে যাবে কিন্তু আর কোনো রুমের সাথে সংযুক্ত থাকবে না।

ডিভাইসগুলো অন্য ঘরে সরান

Structure আপনাকে একটি ডিভাইস অন্য ঘরে সরানোর সুযোগও দেয়:

do {
  try await structure.move(device: light, to: room)
} catch let _ as HomeError {
  // Code for handling the exception
}

একটি রুমের নাম পরিবর্তন করুন

রুমের নাম পরিবর্তন করতে setName(_:) মেথডটি কল করুন:

let updatedRoom = try await theRoom.setName("new room name")

কোনো রুমের নাম পরিবর্তন করার সময়, মূল Room স্ট্রাকচারটি অপরিবর্তিত থাকে এবং ফেরত আসা আপডেট করা Room অবজেক্টটিতে এই পরিবর্তন প্রতিফলিত হয়।

নাম ৬০ ইউনিকোড কোড পয়েন্ট (ক্যারেক্টার) সীমা অতিক্রম করলে তা সংক্ষিপ্ত করা হবে এবং কোনো ত্রুটি দেখানো হবে না। দীর্ঘ নাম পরিচালনার দায়িত্ব ডেভেলপারদের এবং উদাহরণস্বরূপ, তারা ব্যবহারকারীদের জানাতে চান কিনা যে নাম সংক্ষিপ্ত করা হবে, সেই সিদ্ধান্ত তারা নিতে পারেন।