Bu yazıda, react-native ile geliştirdiğimiz basit bir uygulamaya Apple Watch extension geliştireceğiz ve iki cihaz arasında veri alışverişini sağlayacağız.
İçindekiler
React-native-cli kullanarak yeni bir react native projesi yaratıyoruz. ( CLI kurulumu için buraya )
react-native init RNwatchApp
Sorunsuz olarak yaratıldığından emin olmak için simulatör üzerinde çalıştırıyoruz.
cd RNwatchApp && react-native run-ios
Her şey yolunda ise iphone simulatörü içerisinde uygulamamızın çalıştığını görmüş olacağız.
App.js içerisinde gelmiş olan şablonu sildikten sonra;
Bu düzenlemelerden sonra aşağıdakine benzer bir app.js dosyasına sahip olacağız.
import React, { useState } from 'react'; import { Button, SafeAreaView, StyleSheet, Text, TextInput } from 'react-native'; const App = () => { const [textInputValue, setTextInputValue] = useState("") const [receivedValue, setReceivedValue] = useState("Saatten gelen veri burada yer alacak") const send2Watch = () => { console.warn(textInputValue) } return ( <SafeAreaView style={styles.container}> <TextInput placeholder="Veri Girişi" value={textInputValue} onChangeText={text => setTextInputValue(text)} style={styles.textInput} /> <Button title="Saate Gönder" onPress={() => send2Watch()} /> <Text style={styles.text}>{receivedValue}</Text> </SafeAreaView> ); }; const styles = StyleSheet.create({ container: { flex: 1, alignItems: "center", justifyContent: "center", flexDirection: "column", }, textInput: { width: "80%", height: 30, borderBottomWidth: 1, }, text: { marginTop: 20, } }); export default App;
Tekrar çalıştırdığımızda simülatör görüntüsü şu şekilde olacak;
JavaScript kullanarak Apple Watch Extension’ı geliştirmemiz şimdilik mümkün olmadığı için, projemizi XCode ile açıyoruz. Bunun için XCode ‘u çalıştırıp Open diyerek ProjeDizini/ios/watchTestApp.xcodeworkspace dosyasını seçiyoruz.
Projeyi açtığımızda sol tarafta, Project Navigator alanında ( 1 numaralı alan ) uygulamamızı tıklıyoruz. Sağ tarafta projede varsayılan olarak bulunan, projeyle aynı isimdeki target ‘ı ( 2 numaralı alan ) göreceğiz.
3 numaralı alanda yer alan ( + ) butonuna tıklayarak watchOS için, watchOS sekmesi altından “Watch App for iOS App” seçerek yeni bir target ekliyoruz.
Projemize bir isim verip Finish diyoruz.
XCoode, finish dedikten sonra scheme etkinleştirmesi için bir soru sorabilir. Bu soruyu Active diyerek geçiyoruz.
Bu adımları tamamladıktan sonra Project Navigator alanında WatchExtension dosyalarını görebiliriz. ( Proje isminde de extension kelimesini kullandığım için biraz kafa karışıklığı yaratıyordu. Bu sebeple projenin devamında isim değişikliği yaptım. 😊 )
Targets kısmından “WatchExtension” ‘ı çalıştırarak test edebilirsiniz.
Bu aşamada “undefined” içerikli 40 civarı hata alabilirsiniz. Bunun çözümü için ufak bir düzenleme yapmanız yeterli olacak;
Düzenlemeyi yaptıktan sonra projeyi tekrar build edip çalıştırdığımızda WatchOS simülatörüne de uygulama yüklenmiş olacak.
Apple Watch üzerinden veri alma ve saate gelen verinin gösterilmesi için bir ekran yapacağız. Watch uygulamasını, XCode projemize ekledikten sonra gelen watchApp Extension isimli klasöründe yer alan ContentView.swift dosyasını aşağıdaki şekilde düzenliyoruz;
import SwiftUI struct ContentView: View { var receivedData : String = "" var body: some View { VStack { Text("Gelen Data : ") Text(self.receivedData) .padding() } } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }
Gelen datayı basacağımız bir Text alanı ve string bir değişken tanımladık.
Şimdi saat ile telefon arasında bağlantıyı kuracağımız bir model dosyası yaratacağız ve bu dosya içerisine WatchConnectivity kütüphanesi import edeceğiz. Bu kütüphane vasıtasıyla iki cihaz arasındaki iletişimi yöneteceğiz.
import Foundation import WatchConnectivity class WatchModel : NSObject, WCSessionDelegate, ObservableObject{ var session: WCSession @Published var message = "" init(session: WCSession = .default){ self.session = session super.init() self.session.delegate = self session.activate() } func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) { } func session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Void) { DispatchQueue.main.async { self.message = message["message"] as? String ?? "Veri yok" } } }
Watch Connectivity kütüphanesi hakkında daha detaylı bilgi edinmek için bu ve bu bağlantıları kullanabilirsiniz.
Şimdi modelimizi ContentView içerisinden çağırabilir ve gelen datayı göstermek için yarattığımız Text alanına basıyoruz. ContentView içerisine aşağıdaki kodu ekliyoruz ve Text 'in değerini tutan değişkeni değiştiriyoruz;
ObservedObject var model=WatchModel()
Bu düzenleme sonrasında ContentView.swift dosyamızın son hali aşağıdaki gibi oluyor;
import SwiftUI struct ContentView: View { var receivedData : String = "" @ObservedObject var model = WatchModel() var body: some View { VStack { Text("Gelen Data : ") Text(self.model.message) .padding() } } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }
React native ile geliştirdiğimiz uygulamamızın, bir Apple Watch ile iletişime geçmesi için Watch Connectivity API kullanmamız gerekiyor. Bunu yapabilmek için de React Native Watch Connectivity paketini kullanacağız.
npm install react-native-watch-connectivity --save # ya da yarn add react-native-watch-connectivity
React Native 0.60 ve sonrası sürümlerde otomatik linkleme çalışıyor fakat 0.60 öncesi sürümler için aşağıdaki komutla linkleme işlemini yapabiliriz. Ayrıca auto linkleme işlemi sonucunda pod dosyaları yüklenmemiş ise manuel kurulum bağlantısına göz atarak PodFile 'a ekleme yaparak yükleme yapmalısınız.
react-native link
Manuel olarak linklemek için ise bu bağlantıya göz atabilirsiniz. React Native Watch Connectivity hakkında detaylar için dokümantasyonuna göz atabilirsiniz.
Cihazlar arası veri transferine geçmeden önce, saatin erişilebilir ve eşlenmiş olup olmadığını kontrol edilmelidir. Bunun için de React Native Watch Connectivity içerisinde yer alan getReachtability ve getIsPaired fonksiyonlarını kullanacağız.
Eğer cihaz açık ve eşleştirilmiş durumda ise sendMessage fonksiyonu ile datalarımızı, saate göndereceğiz.
import React, { useState } from 'react'; import { Alert, Button, SafeAreaView, StyleSheet, Text, TextInput } from 'react-native'; import { getIsPaired, getReachability, sendMessage } from "react-native-watch-connectivity"; const App = () => { const [textInputValue, setTextInputValue] = useState("") const [receivedValue, setReceivedValue] = useState("Saatten gelen veri burada yer alacak") const [isReachable, setIsReachable] = useState(false) const [isPaired, setIsPaired] = useState(false) const [deviceOk, setDeviceOk] = useState(false) // Cihazın açık ve eşleştirilmiş olma durumu kontrol edilir const checkWatch = () => { getReachability() .then((reachable) => { setIsReachable(reachable) if (reachable) getIsPaired() .then((paired) => { setIsPaired(paired) if (paired) setDeviceOk(true) }) .catch(err => console.warn(err)) }) .catch(err => console.warn(err)) } // Data cihaza gönderilir const send2Watch = () => { if (deviceOk) { const message = { "message": textInputValue, } sendMessage(message, replyHandler, errorHandler); } else Alert.alert("Cihaza erişilemiyor ya da eşleştirilmemiş!") } // Opsiyonel yanıt handler const replyHandler = response => { console.warn("Saatten gelen yanıt : ", response); } // Opsiyonel hata handler const errorHandler = error => { console.warn(error) } return ( <SafeAreaView style={styles.container}> <TextInput placeholder="Veri Girişi" a value={textInputValue} onChangeText={text => setTextInputValue(text)} style={styles.textInput} /> <Button disabled={!deviceOk} title="Saate Gönder" onPress={() => send2Watch()} /> <Button title="Erişimi Kontrol Et" onPress={() => checkWatch()} /> <Text style={[styles.text, { fontWeight: "bold", marginTop: 30 }]}>Durum :</Text> <Text style={styles.text}>{isReachable ? "Cihaz ulaşılabilir" : "Cihaza ulaşılamıyor"}</Text> <Text style={styles.text}>{isPaired ? "Cihaz eşleştirilmiş" : "Cihaz eşleştirilmemiş"}</Text> <Text style={[styles.text, { fontWeight: "bold", marginTop: 30 }]}>Gelen Veri :</Text> <Text style={styles.text}>{receivedValue}</Text> </SafeAreaView> ); }; const styles = StyleSheet.create({ container: { flex: 1, alignItems: "center", justifyContent: "center", flexDirection: "column", }, textInput: { width: "80%", height: 30, borderBottomWidth: 1, }, text: { marginTop: 20, } }); export default App;
Kodumuzda bu güncellemeleri de yaptıktan sonra eğer simülatör telefon ve simülatör saatimiz arasında erişim var ise direkt test edebiliriz.
Eğer dataların gönderiminde ya da cihaza erişim veya eşleşme problemi yaşıyorsanız da her iki cihazdan da uygulamarı silip tekrar run etmeyi deneyebilirsiniz. Sorun devam etmesi halinde cihazlardaki uygulamaları kapat / aç yapmayı deneyebilirsiniz.
Eğer bu denemelere rağmen erişim problemi yaşıyorsanız, simülatörler arası erişimi XCode üzerinden kontrol edebilirsiniz. Bunun için aşağıdaki görselde yer alan menüye girin. Ardından kullandığınız iPhone simülatörüne bağlı bir Apple Watch cihazı olup olmadığını kontrol etmelisiniz. Eğer eşleştirilmiş bir cihaz yok ise (+) butonuna tıklayarak yeni bir tane ekleyebilirsiniz.
React native uygulamaları için temel düzeyde Apple Watch uygulaması geliştirmesi bu kadar basit. Projenin kaynak kodlarına erişmek için buraya tıklayabilirsiniz. Ayrıca sorularınız olursa bu bağlantıya tıklayarak bize ulaşabilirsiniz.
Web & Mobil Geliştirme Takım Lideri
e-Arşiv Fatura Sorgulama Nasıl Gerçekleştirilir?
Dijital dönüşüme ister gönüllü ister zorunlu olarak geçmiş olun, alıcılarınız manuel yöntemleri kullanmakta ısrarcıysa süreciniz...
E-Fatura Durum Kodları Nedir? GİB Detaylı Açıklamlar
Gelir İdaresi Başkanlığı (GİB), e-Fatura sürecinde ortak bir standart oluşturmak amacıyla her faturaya bir durum kodu atar. Bu kodlar,...
Ürün Takip Sistemi Nedir?
ÜTS Nedir? ÜTS Bildirimi Ne İşe Yarar?Ürün takip sistemi (ÜTS), ihraç veya ithal edilen tüm tıbbi cihazların ve kozmetik ürünlerinin...
5 Adımda SAP Envanter Takip Çözümü
Şirketlerin envanter yönetimi konusundaki başarısı, kazancını ve büyüme hızını doğrudan etkilemektedir. Üretimin sistematik ve düzenli...
SAP Analytics Cloud (SAC) Nedir?
Günümüzde gelişen teknoloji sonucu artan veriler ile yönetimi zorlaşan veri yığınları oluşmaya başladı. Bu verileri anlamlı hale...
Neden SAP Integration Suite Kullanmalısınız?
Başarılı bir şirketin temeli olan entegrasyon, şirketler için en önemli stratejik önceliğe sahiptir. Bunun nedeni ise, şirketlerin sahip...
SAP Kullanıcı Deneyimi (UX) Nedir?
Dijitalleşmenin hızlı temposu, şirketlerin hızla artan verimliliğe, yüksek müşteri sadakatine ve artan rekabet gücüne ihtiyaç duymasına...
SAP Signavio Faydaları Nelerdir?
Teknolojinin hızla geliştiği, sürekli değişimin ve dönüşümün olduğu bir dünyada yaşamaktayız. Bu değişimler, şirketlerin iş...
SAP SIGNAVIO PROCESS MANAGER NEDİR?
Signavio Process Manager, sezgisel, bulut tabanlı, profesyonel süreç modellemesi sunan bir SAP Signavio modülüdür. SAP Signavio Process...
Mailiniz başarıyla gönderilmiştir en kısa sürede sizinle iletişime geçilecektir.
Mesajınız ulaştırılamadı! Lütfen daha sonra tekrar deneyin.