Good afternoon guys, I want to create an app that's detects common bluetooth based credit card skimmers predominantly found in gas pumps. The app scans for available bluetooth connections looking for a device with title HC-05. If found, the app will attempt to connect using the default password of 1234. Once connected, the letter 'P' will be sent. If a response of 'M' then there is a very high likelihood there is a skimmer in the bluetooth range of your phone (5 to 15 feet).
I can show you the code I already have:
class ScanViewController: UIViewController, CBPeripheralDelegate, CBCentralManagerDelegate {
// Properties Back-End
private var centralManager: CBCentralManager!
private var peripherals: [CBPeripheral] = []
private var peripheral: CBPeripheral!
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .systemGroupedBackground
centralManager = CBCentralManager(delegate: self, queue: nil)
}
//MARK: - Back-End
// If we're powered on, start scanning
func centralManagerDidUpdateState(_ central: CBCentralManager) {
print("Central state update")
if central.state != .poweredOn {
print("Central is not powered on")
} else {
print("Central scanning for", ParticlePeripheral.skimmerDeviceUUID);
centralManager.scanForPeripherals(withServices: [ParticlePeripheral.skimmerDeviceUUID],
options: [CBCentralManagerScanOptionAllowDuplicatesKey : true])
}
}
// Handles the result of the scan
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
// We've found it so stop scan
self.centralManager.stopScan()
print("Stopped to scan")
// Copy the peripheral instance
self.peripheral = peripheral
self.peripheral.delegate = self
// Connect!
self.centralManager.connect(self.peripheral, options: nil)
}
// The handler if we do connect succesfully
func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
if peripheral == self.peripheral {
print("Connected to Skimmer Scammer")
peripheral.discoverServices([ParticlePeripheral.skimmerDeviceUUID])
}
}
// Handles discovery event
func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
if let services = peripheral.services {
for service in services {
if service.uuid == ParticlePeripheral.skimmerDeviceUUID {
print("Skimmer Scanner service found")
//Now kick off discovery of characteristics
peripheral.discoverCharacteristics([...], for: service)
return
}
}
}
}
class ParticlePeripheral: NSObject {
// I think thats the uuid for HC-05
public static let skimmerDeviceUUID = CBUUID.init(string: "00001101-0000-1000-8000-00805F9B34FB")
}
I googled around for hours but I wasn't able to find a solution and I have never worked with Bluetooth connections before, that makes it really difficult but I tried.
My questions:
is the code I already have valid?
How to can I connect via pin code? "1234"
I would be so helpful if someone here has some advices for me, thanks in advance!
Selecting any option will automatically load the page
Post
Replies
Boosts
Views
Activity
Hey guys, when I run my project the error: 'UICollectionView must be initialized with a non-nil layout parameter', appears. I don't know why because I already used the same code in another project and it worked.
This is my code:
var myCollectionView : UICollectionView?
func setUpContactsCollectionView() {
let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
layout.sectionInset = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
layout.itemSize = CGSize(width: 100, height: 100)
layout.scrollDirection = .horizontal
myCollectionView = UICollectionView(frame: CGRect.zero, collectionViewLayout: layout)
myCollectionView?.showsHorizontalScrollIndicator = false
myCollectionView?.register(InserateCollectionCell.self, forCellWithReuseIdentifier: "InserateCollectionCell")
myCollectionView?.backgroundColor = UIColor.white
myCollectionView?.dataSource = self
myCollectionView?.delegate = self
myCollectionView?.translatesAutoresizingMaskIntoConstraints = false
myCollectionView?.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true
myCollectionView?.topAnchor.constraint(equalTo: topAnchor, constant: 50).isActive = true
myCollectionView?.widthAnchor.constraint(equalTo: widthAnchor).isActive = true
myCollectionView?.heightAnchor.constraint(equalTo: heightAnchor).isActive = true
}
Thanks in advance!
Hey guys, I want to connect my Xcode Project with Firebase to load my Userdata into the database. Although I already used the same code in another project, it doesn't work and throws me the following offer: Thread 1: "Failed to get FirebaseDatabase instance: Specify DatabaseURL within FIRApp or from your databaseForApp:URL: call."
Here is my Code:
@objc func registerButtonTapped() {
if acceptTermsOfUseSwitch.isOn == true && emailTextField.text?.isEmpty == false && passwordTextField.text?.isEmpty == false {
print("Register...")
//Authentification
Auth.auth().createUser(withEmail: emailTextField.text!, password: passwordTextField.text!) { (data, error) in
if let err = error {
print(err.localizedDescription)
return
}
guard let newUser = data?.user else { return }
let uid = newUser.uid
print("User: \(String(describing: newUser.email)) wurde erstellt, ID: \(String(describing: newUser.uid))")
//Database
self.uploadUserData(uid: uid, email: self.emailTextField.text!)
}
} else {
print("No valid data")
}
}
func uploadUserData(uid: String, email: String) {
var ref = DatabaseReference()
ref = Database.database().reference().child("users").child(uid)
print("Datenbank ID: \(ref)")
ref.setValue(["email" : email, "userID" : uid])
print("User data uploaded")
//Change VC:
let vc = TabBarController()
self.dismiss(animated: true, completion: {
UIApplication.shared.windows.first?.rootViewController = vc
})
}
I hope someone can help me, thanks in advance!
Hey guys, my problem:
I have to different VC's with textFields, and I need their text on the third ViewController, I use a two protocols to push the textfield text as data to the third VC.
Here are the two Protocols:
protocol RegisterNameProtocol {
var name: String? { get set }
}
protocol RegisterNumberProtocol {
var phoneNumber: String? { get set }
}
I implemented the variables in the two vc's and afterwards I tested the functionality with print statements, it worked! Now I need them in the third VC, this is my code yet but it throws the following error: force unwrapped a nil value
The third VC:
weak var nameDelegate: RegisterNameProtocol?
weak var phoneDelegate: RegisterNumberProtocol?
var phoneNumber = ""
var name = ""
func xyzzy() {
phoneNumber = (phoneDelegate?.phoneNumber)!
name = (nameDelegate?.name)!
}
I hope someone can help me! Thanks in advance
Hey guys, I saw a lot of tutorials about how to enable Push Notifications, but the point is that I don't have the Push-Notification Capabilities and I don't know where they are :(
Can someone please tell me where the problem is?
Hey guys, I want to create a expandable Cell in my tableView but there are a few things which don't work. This is my Code:
// In TableView Cell
var bottomViewIsVisible = false
func setUpArrowButton() {
arrowButton.tintColor = .lightGray
arrowButton.setImage(downImage, for: .normal)
if bottomViewIsVisible == false {
arrowButton.addTarget(self, action: #selector(expandView), for: .touchUpInside)
}
if bottomViewIsVisible == true {
arrowButton.addTarget(self, action: #selector(self.shrinkView), for: .touchUpInside)
}
//Constraints
arrowButton.translatesAutoresizingMaskIntoConstraints = false
arrowButton.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true
arrowButton.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -15).isActive = true
arrowButton.widthAnchor.constraint(equalToConstant: 40).isActive = true
arrowButton.heightAnchor.constraint(equalToConstant: 40).isActive = true
}
@objc func expandView() {
bottomViewIsVisible = true
UIButton.animate(withDuration: 0.3) {
self.bottomView.isHidden = false
self.arrowButton.setImage(self.upImage, for: .normal)
}
}
@objc func shrinkView() {
bottomViewIsVisible = false
UIButton.animate(withDuration: 0.3) {
self.bottomView.isHidden = true
self.arrowButton.setImage(self.downImage, for: .normal)
}
}
func setUpBottomView() {
bottomView.backgroundColor = .systemPink
bottomView.translatesAutoresizingMaskIntoConstraints = false
bottomView.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true
bottomView.topAnchor.constraint(equalTo: Label.bottomAnchor, constant: 5).isActive = true
bottomView.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 10).isActive = true
bottomView.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -10).isActive = true
bottomView.heightAnchor.constraint(equalToConstant: 60).isActive = true
}
In TableView:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) - UITableViewCell {
if indexPath.row == 2 {
let priceSliderCell = tableView.dequeueReusableCell(withIdentifier: "PriceSlider", for: indexPath) as! PriceRangeCell
priceSliderCell.setUpTitleLabel(text: "Price")
priceSliderCell.setUpArrowButton()
priceSliderCell.setUpBottomView()
tableView.beginUpdates()
tableView.endUpdates()
tableView.deselectRow(at: indexPath, animated: true)
priceSliderCell.delegate = self
priceSliderCell.selectionStyle = .none
return priceSliderCell
}
}
The first and biggest problem is that the cell height in the tableView doesn't fit to the height it should have after the cell expands. How can I do that?
The second problem is that the shrink functions doesn't work.
I hope someone can help me, thanks in advance!
Hey guys, on Stackoverflow I read a bit about the differences between UISearchBar and UISearchController. I already created the GUI of my Project and I'm absolutely in love with it, the problem is that I am using a Searchbar and of course I could change that to a SearchController but I don't want it to be in the navigation bar. So what and HOW I have to implement to make my Searchbar behave and usable like a SearchController? Thanks in advance
Hey guys, I wrote a function which creates an UIView with UIImageView and some Label in it.
This is my Code:
func setUpInserateWindows(images: [UIImage], priceText: String, descriptionText: String, streetAddress: String, cityAddress: String) {
var inserates = [UIView]()
for image in images {
let inserateView = UIView()
let imageView = UIImageView()
let price = UILabel()
let description = UILabel()
let address = UILabel()
let city = UILabel()
inserateView.addSubview(imageView)
inserateView.addSubview(price)
inserateView.addSubview(description)
//InserateView
inserateView.sizeToFit()
inserateView.backgroundColor = .clear
inserateView.translatesAutoresizingMaskIntoConstraints = false
inserateView.widthAnchor.constraint(equalToConstant: 190).isActive = true
inserateView.heightAnchor.constraint(equalToConstant: 100).isActive = true
//ImageView
imageView.backgroundColor = .systemBlue
imageView.image = image
imageView.contentMode = .scaleAspectFill
imageView.layer.cornerRadius = 20
imageView.layer.masksToBounds = true
imageView.translatesAutoresizingMaskIntoConstraints = false
imageView.centerXAnchor.constraint(equalTo: inserateView.centerXAnchor).isActive = true
imageView.topAnchor.constraint(equalTo: inserateView.topAnchor, constant: 5).isActive = true
imageView.widthAnchor.constraint(equalToConstant: 260).isActive = true
imageView.heightAnchor.constraint(equalToConstant: 130).isActive = true
//Pricetag
price.text = priceText
price.textAlignment = .left
price.textColor = .black
price.font = UIFont.boldSystemFont(ofSize: 20)
price.translatesAutoresizingMaskIntoConstraints = false
price.topAnchor.constraint(equalTo: imageView.bottomAnchor, constant: 5).isActive = true
price.leadingAnchor.constraint(equalTo: imageView.leadingAnchor).isActive = true
price.widthAnchor.constraint(equalToConstant: 150).isActive = true
price.heightAnchor.constraint(equalToConstant: 30).isActive = true
//Description
description.text = descriptionText
description.numberOfLines = 1
description.textColor = .systemGray
description.textAlignment = .left
description.font = UIFont.boldSystemFont(ofSize: 15)
description.translatesAutoresizingMaskIntoConstraints = false
description.topAnchor.constraint(equalTo: price.bottomAnchor).isActive = true
description.leadingAnchor.constraint(equalTo: imageView.leadingAnchor).isActive = true
description.widthAnchor.constraint(equalToConstant: 250).isActive = true
description.heightAnchor.constraint(equalToConstant: 20).isActive = true
//Street Address
address.text = streetAddress
address.numberOfLines = 1
address.textColor = .systemGray
address.textAlignment = .left
address.font = UIFont.boldSystemFont(ofSize: 15)
address.translatesAutoresizingMaskIntoConstraints = false
address.topAnchor.constraint(equalTo: description.bottomAnchor).isActive = true
address.leadingAnchor.constraint(equalTo: imageView.leadingAnchor).isActive = true
address.widthAnchor.constraint(equalToConstant: 250).isActive = true
address.heightAnchor.constraint(equalToConstant: 20).isActive = true
inserates.append(inserateView)
}
for inserate in inserates {
stackView.addArrangedSubview(inserate)
}
}
The problem is at the topAnchor of the address Label, it throws me this error: "Thread 1: "Unable to activate constraint with anchors NSLayoutYAxisAnchor:0x60000344ea40 \"UILabel:0x7f9198d6e830.top\" and NSLayoutYAxisAnchor:0x60000344e7c0 \"UILabel:0x7f9198d6e5c0.bottom\" because they have no common ancestor. Does the constraint or its anchors reference items in different view hierarchies? That's illegal.""
I really do not understand where the problem is, can somebody help me? :)
Hey guys, built a tableView with Custom Cells and everything is looking good but when I want to use the elements in the Cells (Searchbar, SegmentControl) they are doing nothing, can someone help me please
For example, this is my SearchBar Cell:
class SearchCell: UITableViewCell, UISearchBarDelegate {
let searchbar = UISearchBar()
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
addSubview(searchbar)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func setConstraints() {
searchbar.placeholder = "Country, City"
searchbar.searchBarStyle = .minimal
let TapGesture = UITapGestureRecognizer(target: self, action: #selector(searchBarTapped))
searchbar.addGestureRecognizer(TapGesture)
searchbar.isUserInteractionEnabled = true
Constraints
searchbar.translatesAutoresizingMaskIntoConstraints = false
searchbar.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true
searchbar.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 10).isActive = true
searchbar.widthAnchor.constraint(equalToConstant: 380).isActive = true
searchbar.heightAnchor.constraint(equalToConstant: 40).isActive = true
}
@objc func searchBarTapped() {
searchbar.delegate = self
}
override func awakeFromNib() {
super.awakeFromNib() {
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
}
}
And this is my TableView Controller:
class SearchViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UISearchBarDelegate {
let cellClasses = SearchCell()
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) - Int {
return 2
}
func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) - IndexPath? {
return indexPath
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) - UITableViewCell {
if indexPath.row == 0 {
let cell = tableView.dequeueReusableCell(withIdentifier: "SearchCell", for: indexPath) as! SearchCell
cell.setConstraints()
cell.selectionStyle = .none
return cell
}
if indexPath.row == 1 {
let cell = tableView.dequeueReusableCell(withIdentifier: "SegmentControlCell", for: indexPath) as! SegmentControlCell
cell.setUpSegmentControlCell()
cell.selectionStyle = .none
return cell
} else {
let basicCell = tableView.dequeueReusableCell(withIdentifier: "basicCell", for: indexPath) as! TestCell
basicCell.setUpabel()
basicCell.selectionStyle = .none
return basicCell
}
}
@IBAction func jumpToSearchViewController() {
tabBarController?.selectedIndex = 2
}
let tableView = UITableView()
override func viewDidLoad() {
super.viewDidLoad()
tableView.register(SearchCell.self, forCellReuseIdentifier: "SearchCell")
tableView.register(SegmentControlCell.self, forCellReuseIdentifier: "SegmentControlCell")
tableView.register(TestCell.self, forCellReuseIdentifier: "basicCell")
tableView.dataSource = self
tableView.delegate = self
tableView.allowsSelection = true
view.backgroundColor = .white
navigationController?.navigationBar.prefersLargeTitles = true
navigationItem.title = "Search"
Functions
configureTableView()
}
func configureTableView() {
view.addSubview(tableView)
tableView.rowHeight = 80
Constraints
tableView.translatesAutoresizingMaskIntoConstraints = false
tableView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
tableView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
tableView.heightAnchor.constraint(equalTo: view.heightAnchor).isActive = true
tableView.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
}
Thanks in advance! :)