#development
1 messages Ā· Page 240 of 1
it surely would have been useful back when there was no connection between iphones and macbooks for calling
hm I thought that was said to be misunderstood, rather a custom wifi/bt chip, not 4G/5G
I remember this being rumored as a sure thing back in like 2011 though lol
way more viable now though with the type of battery life Apple Silicon gets
Alright time to start on my writeup
I know of Proxima supposedly being apple's new WiFi/Bluetooth chip but that doesn't match with Centuari
where'd you get the info that it's a WiFi/Bluetooth chip?
and also apple themselves making the C1 chip more efficient
applying for dev role

surely
Thoughts on the writeup?
Any suggestions?
I will be creating a git repository for those who want the build script for the toolchain, as well as the compiled toolchain and a build script that automatically builds with no code-signing required and changes info.plist after build time from 7.0 to 6.0
I'd say don't mention how exactly you got the beta š
I didnāt :)
āA generous individualā
through
mysterious circumstances
this lost media fell in your lap
Indeed indeed
What about the rest?
Itās my first so Iām open to improvement
I did my best to make it enjoyable to read
also shortening r/jailbreak to r/jb may not be a good idea in this case
still be careful, because I don't imagine many people download that specific release
Fair but someone could very well have had it sitting on their hard drive
True Iāll change that now
Hopefully itās not too boring
It was pretty enjoyable to write
It was a funny chain of events anyways
still reading but it looks good
it's the type of post that hacker news would like to read
Idk if thatās a compliment or a bad thing
Alrighty
honestly Swift compiler engineers might see it and have some lore to share in the comments
Real that could be great
Compiling swift 3 was an actual pain
I sat for hours staring at the build slowly progressing hoping each time itād be the time
the toolchain stuff is crazy, but also for Apple, doesn't surprise me
Yep
Idk what I expected
Honestly Iām not sure why they removed iOS 6 support
When I mean stable on swift 2.2 I mean itās like it was built for it
You get no indication that itās weird
Or wrong
Itās perfect
they've changed their mind a lot on how legacy support works
Yeah
I mean they supported iOS 7 for a while to be fair
And the idea of bundling swift with the app was a great one for legacy compatibility
This allowed iOS 6 to work
it was iOS 4.3 for a long time, then 6.0, then 9.0 for a very long time, but recently it seems they now target the past 5 versions only
Yeah
Itās because the APIs move so fast now
SwiftUI as an example has changed drastically
5 versions is 13-18
Could not be more distinctly different
I'd say mainly because SwiftUI keeps changing its mind on how things should work every year, and Apple's policy is just, tell your users to update
I guess, itās kind of petered out in recent years though thankfully
Ever since SwiftUI 17
Itās been pretty consistent
And SwiftUI 26 was a big step forward to making SwiftUI less dependent on UIKit
Iām confident one day itāll mature enough to be viable as a stand-alone ui module
Xcode 26 just still support building to iOS 12 (at least as of beta 1)
it's only device debugging that has bumped a lot from what I recall
(Swift could be different though and SwiftUI was only introduced in 13 and wasn't useful until 14 at a minimum though)
<@&355174844205367317>
Ty
@kind herald :3
@kind herald Hey this was offtopic can you tell him
@native dune Btw is it working
@fading shell Offtopic in development buddy
Better move to the correct channel buddy
dont think you need a jailbreak for that
Not sure if it works for BLE, but you can install one of those debug profiles and it'll show in analytics data under accessoryd-packets
Might be iAP2 or Bluetooth classic only
How to compile a tweak on Theos for Mac Catalyst app on x86_64 Mac? I add x86_64 to Makefile but has both error on iOS and Mac targets, also loader and pspawn doesn't compile for x86_64, only libellekit
https://developer.apple.com/bug-reporting/profiles-and-logs/?platform=ios debug profiles here btw @hexed knot
Why do none of these clock URL schemes open what theyāre supposed to open?
Trying to programmatically open this view
The URL schemes for the clock app have apparently not worked since 2016
https://stackoverflow.com/questions/36011122/how-can-i-launch-the-ios-clock-app-using-a-a-url-scheme
you could make a feedback for it but I doubt it would go anywhere
oh apple...
i have a iphone 7 that can be jailbroken
but the latest version is ios 15 while im on 18.6.2 on a 13 pro
idk if that would matter
it works on my iPad
which is on iOS 16
let me try a shortcut
wtf it broke
let me make sure it wasn't a placebo
yea it doesn't work
rip
I found https://gist.github.com/levantAJ/be52cc86dc5d476f23e4be75ae7905cc and got an .ipa file of the clock app from the decrypted ipa store. ran the script on the ipa but it couldnt find any URL Schemes. The only .plist Info.plist in the .app package doesnt have a schema definition either:
it looks like they're restricted somehow
there's definitely URL schemes
otherwise clock wouldn't open
yeah ik
the macOS app has them (same behavior on macOS)
so i think these schemes are managed by ios itself
the real clock app is in com.apple.mobileasset.SystemApp btw
oh ok
no way to get there without a jb right
you just go to a URL
quite a coincidence because I literally downloaded that yesterday to analyse the clock app
wdym?
you can get system apps pretty easily
but in any case you're out of luck if these schemes don't work
i'd like to know how, just coz im curious
unfortunate
but why are they blocked?
Idk
https://mesu.apple.com/systemassets/{build_id}/{system_image_id}/com_apple_MobileAsset_SystemApp/com_apple_MobileAsset_SystemApp.xml
build ID and system image ID are from SystemVersion.plist
or if you're unjailbroken you can use ie. ideviceinfo
or even an app on device since it's an unsandboxed path
im a little confused on how to get these ID's?
idk you can use shortcuts or ideviceinfo
the full path is /System/Library/CoreServices/SystemVersion.plist
is ideviceinfo only for linux?
@wooden yarrow you sure it's a system app
yep
oh it's mobiletimer
i have it right here
thanks apple
lmao
i didnt know how to parse the concatenated zip .data so i had to scroll to the correct offset with hex editor and remove everything before it
but also it's not on versions that dont have removable clock app
which i think was probably like ios 14 ish
ĀÆ_(ć)_/ĀÆ
I just sent the .data file to Keka and it extracted it just fine
but idk why it downloaded Safari??
no yeah thats what i mean
if you just extract it normally
it just extracts the first of the concatenated zip files
so you have to find mobiletimer in the zip hex and extract that
wait so the .data contains all the apps or?
oh i see that it has gotten bigger
only tim apple would know
also, is this how the native apps get updated when you update the ios?
yes
there's patches in the OTA though
yeah idk anything abt hex stuff so it ends here for me
do you want my clock app's info.plist
its from ios 18 latest
or well
near latest,
thanks but i have no use for it
schemes are blocked anyways
i wanted to learn more abt how all of this worked, so thats the only reason i went into the rabbit hole
Thank you
Okay so now that swift works on iOS 6, how is tweak development in swift
sw*ft
yeah i always kinda got the vibe that tweak dev was built for obj c
which is fine
getting swift to work on ios 6 was hard enough on its own
@magic hazel I've made a couple Swift tweaks without Orion, here's one: https://github.com/NightwindDev/HorizontalSliders
@convention(c) seems to have been added in Swift 2 so you're good on that part
okay so its basically just objective c but in swift with nice swift stuff
like guard let
more or less
guard let is so nice
but you do need to do stuff manuially where in Logos you have %hook and whatnot
wheres that?
yeah tehres quite a bit of verbose swift code here that looks quite like its obj c counterpart but thats expected
right because you're not patching over obj c stuff
struct Dynamic {
private let className: String
init(_ name: String) {
self.className = name
}
func alloc<I>(interface: I.Type) -> I {
guard let cls = objc_getClass(className) as? AnyClass else {
fatalError("Could not find class named \(className)")
}
let allocSelector = sel_getUid("alloc")
guard let allocMethod = class_getClassMethod(cls, allocSelector) else {
fatalError("Could not find alloc method in \(className)")
}
let allocIMP = method_getImplementation(allocMethod)
let alloc = unsafeBitCast(allocIMP, to: (@convention(c) (AnyClass, Selector) -> Unmanaged<AnyObject>).self)
let instance = alloc(cls, allocSelector).takeRetainedValue()
return unsafeBitCast(instance, to: interface)
}
}```
number 1 rule for me in swift, if i see alloc, i'm getting the hell out of there
struct CCUIModuleSettingsManagerHook {
private static var origIMP: IMP?
static func hook() {
guard let targetClass = objc_getClass("CCUIModuleSettingsManager") as? AnyClass else { return }
typealias HookType = @convention(c) (NSObject, Selector, String, CCUILayoutSize) -> CCUIModuleSettings
let hook: HookType = { target, selector, identifier, prototypeSize in
let orig = unsafeBitCast(Self.origIMP, to: HookType.self)
if identifier == "com.apple.control-center.DisplayModule" || identifier == "com.apple.mediaremote.controlcenter.audio" {
let size = CCUILayoutSize(width: 2, height: 1)
return Dynamic("CCUIModuleSettings")
.alloc(interface: CCUIModuleSettings.self)
.initWith(portraitLayoutSize: size, landscapeLayoutSize: size)
}
return orig(target, selector, identifier, prototypeSize)
}
MSHookMessageEx(targetClass, sel_getUid("moduleSettingsForModuleIdentifier:prototypeSize:"), unsafeBitCast(hook, to: IMP.self), &origIMP)
}
}
%hook CCUIModuleSettingsManager
- (CCUIModuleSettings *)moduleSettingsForModuleIdentifier:(NSString *)identifier prototypeSize:(CCUILayoutSize)prototypeSize {
if ([identifier isEqualToString:@"com.apple.control-center.DisplayModule"] || [identifier isEqualToString:@"com.apple.mediaremote.controlcenter.audio"]) {
CCUILayoutSize const size = CCUILayoutSizeMake(2, 1);
return [[%c(CCUIModuleSettings) alloc] initWithPortraitLayoutSize: landscapeLayoutSize:];
}
return %orig;
}
%end
yeah this is a workaround of sorts to bypass the Swift type checking system
still pretty verbose
yep i picked that much up
its a pretty cool idea, i'll give you that, but again, alloc in my swift code? hell no
look at where it's used
yeah right okay
Dynamic("CCUIModuleSettings")
.alloc(interface: CCUIModuleSettings.self)```
yeah tbh I would say it's a pretty elegant solution to an otherwise really difficult problem to solve
i agree tbh
idk it's just the kinda code that i use swift to avoid
however, i see no other way of doing it
yeah the more complicated way would be to link with the binary but anyway
i didnt realise how many functions i relied upon from swift 4 particularly
.random() didnt even exist until then
you had to use the god awful arc4random
extension Array {
func randomElement() -> Element? {
if self.isEmpty { return nil }
let index = Int(arc4random_uniform(UInt32(self.count)))
return self[index]
}
}```
this vs
.randomelement()
I do wanna know now Swift has macros, whether Logos can be reproduced in pure Swift
no preprocessing
that would be interesting
agreed yeah that would be really cool
of course, not pre-Swift 5.whatever compatible
yeah obv
import Foundation
import UIKit
// Helper structs to fake Swift 4+ ranges
struct RandomClosed {
let min: CGFloat
let max: CGFloat
}
struct RandomHalfOpen {
let min: CGFloat
let max: CGFloat
}
// Overload the ... and ..< operators to return our structs
func ... (lhs: CGFloat, rhs: CGFloat) -> RandomClosed {
return RandomClosed(min: lhs, max: rhs)
}
func ..< (lhs: CGFloat, rhs: CGFloat) -> RandomHalfOpen {
return RandomHalfOpen(min: lhs, max: rhs)
}
// CGFloat extension
extension CGFloat {
static func random(in range: RandomClosed) -> CGFloat {
let diff = range.max - range.min
return CGFloat(arc4random()) / CGFloat(UInt32.max) * diff + range.min
}
static func random(in range: RandomHalfOpen) -> CGFloat {
let diff = range.max - range.min
return CGFloat(arc4random()) / CGFloat(UInt32.max) * diff + range.min
}
}
random(in: 0...1) syntax
tbh my implementation is kinda wacky
but it works
all i needed was the effect and syntax to be identical so you can just copy paste swift code and have it compile
i cant really see any way of doing that without doing what i've done
it works quite well
and its pretty intuitive if you think about it
a lot of changes will just be like this though
extension UIViewAutoresizing {
static var flexibleWidth: UIViewAutoresizing {
return .FlexibleWidth
}
static var flexibleHeight: UIViewAutoresizing {
return .FlexibleHeight
}
}
and i mean a LOT
just camelcase changes
ts gonna take me forever
at this point you're just fighting the language lol
eh
not really
once you code it once
it works
and its so much cleaner
the idea is you never see this
i write it
you download the folder
import it
boom
plus ill add compile checks so you can use it on swift 3, swift 4
so you just get whatever you're missing
this was a must have
import Foundation
import UIKit
//Swift 3 Timer
class ClosureTimer: NSObject {
let block: (NSTimer) -> Void
init(block: (NSTimer) -> Void) {
self.block = block
}
@objc func fire(timer: NSTimer) {
block(timer)
}
}
extension NSTimer {
// Swift 3-style API
class func scheduledTimer(withTimeInterval interval: NSTimeInterval, repeats: Bool, block: (NSTimer) -> Void) -> NSTimer {
let closureTimer = ClosureTimer(block: block)
return NSTimer.scheduledTimerWithTimeInterval(interval,
target: closureTimer,
selector: #selector(ClosureTimer.fire(_:)),
userInfo: nil,
repeats: repeats)
}
}
typealias Timer = NSTimer```
this one is honestly pretty simple
really just converting the syntax into a closure but MAN it is so much nicer to not have to rely upon obj c selectors
NSTimer.scheduledTimerWithTimeInterval(interval, target: closureTimer, selector: #selector(ClosureTimer.fire(_:)), userInfo: nil, repeats: repeats)
Timer.scheduledTimer(withTimeInterval: 1, repeats true) { _ in
}```
its not even close
syntax is so much cleaner
oh yeah i wanted feedback on this, i implemented addAction from iOS 14 UIKit but i did it slightly differently, any thoughts
private class ClosureSleeve {
let closure: () -> Void
init(_ closure: () -> Void) {
self.closure = closure
}
@objc func invoke() { closure() }
}
extension UIButton {
func addAction(for controlEvents: UIControlEvents, _ closure: () -> Void) {
let sleeve = ClosureSleeve(closure)
addTarget(sleeve, action: #selector(ClosureSleeve.invoke), forControlEvents: controlEvents)
// Use NSUUID for unique key
objc_setAssociatedObject(self, NSUUID().UUIDString, sleeve, .OBJC_ASSOCIATION_RETAIN)
}
}```
so its just button.addaction(for: .TouchUpInside) {
your code
}
its as simple as can be
are you sure it wouldn't be easier to patch .swiftinterface and friends?
lowercase first letter seems like something that could be done
Not really, one i donāt know how to do that, and two, this is drop in. Anyone can use it
that's fair. you would still need to write a parser in python or something of course
to figure out if the symbol is a type that needs to be camelcased
also not sure if the format really contains every symbol, or only ones that needed overrides from default objc -> swift symbol naming behavior
Great use of an associated object. Donāt forget to mark it as obsolete in iOS 14
thanks!
I had to research it quite a bit
I still don't fully understand it
Since it's an objc type
But
I kinda gotthe gist
I was worried i migh've stuffed solmething up
i'm not great with the more technical side of swift
Nothing on my dev role request yet 
Finally got a real Mac
Going from an HDD to an SSD is so big
It takes the computer from being slow as fuck to genuinely usable
MacBook Pro 2011
Oh and I upgraded the ram from 4->16gb
Back when apple actually allowed us to upgrade our computers
wow setting up git repos is so much more painful on older xcode versions
to use it just download the folder and take the one thats at the same level as info.plist
copy into your project and then drag it into xcode
should work fine
i havent added compile checks yet so be wary of that
usually MVC
Alr
that's kinda sorta what i'm using rn
i mean
most of my logic is actually in the view controller
i assume i'd just do like
let model = ModelClass()
and then just use the methods from there?
usually the view controller "houses" the view
so you shouldn't really be accessing the controller from the view, rather the opposite
yeah no i meant
i have viewcontroller.swift
i have model.swift
inside model.swift i have a model class
inside viewcontroller.swift i do let model = ModelClass()
and then use the modelclass logic to link to ui
for example if i want a button to do something from my model like
button.addAction(for: .TouchUpInside) {
model.buttonaction()
}
do you have an example of what you're talking about? that may be easier to comprehend rather than just general examples
errr
yep
model
//
// ColourChanger.swift
// Colour Snap Legacy
//
// Created by JWI on 31/08/2025.
// Copyright Ā© 2025 JWI. All rights reserved.
//
import Foundation
import UIKit
class colourChanger {
var backgroundColor: UIColor = .red
var onBackgroundColourChange: ((UIColor) -> Void)?
var titleColor: UIColor = .red
var onTitleColourChange: ((UIColor) -> Void)?
var lastColour: UIColor = .clear
var currentColour: UIColor = .clear
var exclusions: Set<UIColor> = [.clear]
var onColourChange: ((UIColor) -> Void)?
var timer: Timer?
/*func DONTTOUCH() {
timer = Timer.scheduledTimer(withTimeInterval: 2, repeats: true) { timer in
withAnimation(1.5, animation: .CurveEaseInOut) {
self.lastColour = self.currentColour
let avaliableBackgroundColours = colors.filter( { !self.exclusions.contains($0) } )
if let safeNewColour = avaliableBackgroundColours.randomElement() {
self.currentColour = safeNewColour
self.exclusions.remove(self.lastColour)
self.exclusions.insert(self.currentColour)
self.onColourChange?(self.currentColour)
}
}
}
}*/
func backgroundColourChanger() {
let _ = Timer.scheduledTimer(withTimeInterval: 2, repeats: true) { _ in
withAnimation(1.5, animation: .CurveEaseInOut) {
self.backgroundColor = UIColor(red: .random(in: 0...0.5), green: .random(in: 0...0.5), blue: .random(in: 0...0.5))
self.onBackgroundColourChange?(self.backgroundColor)
}
}
}
func titleColourChanger() {
let _ = Timer.scheduledTimer(withTimeInterval: 0.6, repeats: true) { _ in
self.titleColor = UIColor(red: .random(in: 0.5...1), green: .random(in: 0.5...1), blue: .random(in: 0.5...1))
self.onTitleColourChange?(self.titleColor)
}
}
}```
viewcontroller
//
// GameViewController.swift
// Colour Snap Legacy
//
// Created by JWI on 31/08/2025.
// Copyright Ā© 2025 JWI. All rights reserved.
//
import Foundation
import UIKit
class GameViewController: UIViewController {
let backButton = UIButton(type: .custom)
var myColourChanger: colourChanger = colourChanger()
override func viewDidLoad() {
super.viewDidLoad()
myColourChanger.backgroundColourChanger()
let backgroundView = UIView(frame: view.bounds)
self.view.backgroundColor = UIColor(red: .random(in: 0...0.5), green: .random(in:0...0.5), blue: .random(in:0...0.5))
myColourChanger.onBackgroundColourChange = { newColour in
backgroundView.backgroundColor = newColour
}
view.addSubview(backgroundView)
backButton.setTitle(" Back to main menu ", for: .normal)
backButton.translatesAutoresizingMaskIntoConstraints = false
backButton.backgroundColor = UIColor.gray.colorWithAlphaComponent(0.4)
backButton.layer.cornerRadius = 15
backButton.layer.shadowRadius = 5
backButton.layer.shadowColor = UIColor.black.CGColor
backButton.layer.shadowOpacity = 0.5
backButton.adjustsImageWhenHighlighted = false
backButton.addAction(for: .TouchUpInside) {
let mainMenuVC = MainMenuViewController()
mainMenuVC.modalTransitionStyle = .crossDissolve
self.presentViewController(mainMenuVC, animated: true, completion: nil)
}
view.addSubview(backButton)
view.layoutIfNeeded()
setupConstraints()
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
backButton.titleLabel?.font = UIFont.systemFontOfSize(backButton.frame.width*0.1)
}
func setupConstraints() {
view.addConstraint(NSLayoutConstraint(item: backButton, attribute: .centerX, relatedBy: .equal, toItem: view, attribute: .centerX, multiplier: 1, constant: 0))
view.addConstraint(NSLayoutConstraint(item: backButton, attribute: .centerY, relatedBy: .equal, toItem: view, attribute: .top, multiplier: 1, constant: view.frame.height*0.05))
view.addConstraint(NSLayoutConstraint(item: backButton, attribute: .width, relatedBy: .equal, toItem: view, attribute: .width, multiplier: 0.5, constant: 0))
view.addConstraint(NSLayoutConstraint(item: backButton, attribute: .height, relatedBy: .equal, toItem: backButton, attribute: .width, multiplier: 0.2, constant: 0))
}
}```
whoa okay, this is very interesting
what part
the colourChanger part
why's it interesting
well for one, one nitpick I have is it should be ColourChanger, using UpperCamelCase for classes
ig
the only interesting part is me figuring out you can use a variable like ((UIColor) -> Void) to run a function whenever a varible changes
so the ui updates
usually i'd use @Published on swiftui but there's none of that here
but more so I have not seen that type of architecture in a UIKit project
the thing you have that's a "model"
How so
What would it usually be
Where would you store the methods you intend to use
You would put them directly in the view controller
that's extremely odd
so
there's no seperate layer
everything goes in the viewcontroller
no model at all
Or a delegate
huh that's weird, sounds like a way to get a really really large viewcontroller
that is more or less what happens
1 file storing every single method, class, action seems like a bad idea
ima avoid it like the plague
store all the logic in a seperate file
import it as a variable
if you split properly then you should be fine
like you would in swiftui
you could do extensions
but with a viewmodel
ehhh
why both
just have it seperated
its so much nicer to think about
one file is ui
one file is model
you can essientally take an arrow
and drag it to your uielement
when this element clicked -> run this function from model
its also reusable
this is kinda what i'm attempting to replicate
oh shit its not public
bcus published app
I mean, structure it how you want, but just mentioning that a lot of UIKit projects are not structured like this so you're kind of fighting against the standard
what's not public?
I see
so like in swiftui i would do this
this is my colourmatch model
mutating func colourGameChanger() {
var exclusions = Set(currentGameColours)
if countSinceMatch < 10 {
for x in 0..<currentGameColours.count {
lastGameColours[x] = currentGameColours[x]
let avaliableColours = colourArray.filter( { !exclusions.contains($0) } )
if let safeNewColour = avaliableColours.randomElement() {
currentGameColours[x] = safeNewColour
exclusions.remove(lastGameColours[x])
exclusions.insert(safeNewColour)
}
}
countSinceMatch += 1
}
else {
if let randomRectangle = currentGameColours.indices.randomElement() {
currentGameColours[randomRectangle] = chosenMatchColour
}
countSinceMatch = 0
}
}
then in my viewmodel id import the function
then in my view i'd reference with viewmodel.colourgamechanger()
by the way, just a reminder to follow best code practices and mark variables as let if you're not going to be mutating them
Correct, this is a SwiftUI style approach, however in UIKit it's different because of how views are actually laid out
i mean if uikit is just dump everything in one file idk how ppl can mantain a large project
if everything from my old swiftui game was in one file i would crash out
I did not say put everything in one file, I said put stuff on the view controller, not the model
you can most definitely still separate out the files, and also unlike SwiftUI, you have a lot more custom views in UIKit so that you can reuse things
In SwiftUI you can get away with copy pasting a VStack with some elements inside everywhere but in UIKit you might wanna think about the actual view grid
You definitely could still try using an MVVM approach in UIKit as well, no problem with that, but to my knowledge that's not as common
Nice, that's a good approach then
A lot of people get away with just dumping everything in one view and only refactoring when necessary
thats wild
i tried that at first and it was so painful
the code was unreadable
now baselevelview is clean
There's a balance to be had, obviously refactoring every single thing into its own view is gonna become unmaintanable at some point as well
what just happened
too big a text i imagine
I see
WHAT
THAT WASNT EVEN LARGE

VStack {
pauseButton
levelScoreView.zIndex(12)
changingRectangleView.zIndex(viewModel.gameStatus == .won ? 13 : 10)
matchColourView
if !initialStart {
beginButton
}
if !storeKitManager.hasPurchased{
bannerAd
}
}```
btw those views aren't inside the baselevelview
are those just a bunch of viewbuilders or what
they're inside other files
ig
cus it's not a function
It shouldn't be a function
its a struct
it should be a struct conforming to View
it is
//
// YouWonFlyingView.swift
// ColourMatchV2
//
// Created by JWI Master on 24/6/2025.
//
import SwiftUI
import ConfettiSwiftUI
struct YouWonFlyingView: View {
//MARK: Shared Variables
@ObservedObject var uiColourChanger: ColourMatchGame.ColourChanger
@State var offsetY: CGFloat = -800
@State var opacity: Double = 0
@State var go: Bool = false
var body: some View {
Text("You won!")
.font(.custom("Moodcake", size: 35))
.offset(y: offsetY)
.opacity(opacity)
.confettiCannon(trigger: $go, openingAngle: Angle(degrees: 0), closingAngle: Angle(degrees: 360), radius: 200)
.compositingGroup()
.onAppear {
withAnimation(.interpolatingSpring(mass: 1, stiffness: 250, damping: 20)) {
offsetY = 0
opacity = 1
go.toggle()
}
}
}
}
#Preview {
YouWonFlyingView(uiColourChanger: ColourMatchGame.ColourChanger())
}
but swiftui has never indicated you'd say ()
unles
Where do you declare pauseButton?
you need to pass variables
oh thats in baselevelview i think
thats tiny tho
its a single button
the only time i have to use view() is when im passing values to that view
OH
right
nvm
actually
im dumb
you're right
I gotcha
var matchColourView: some View {
Text("Your colour is: \(viewModel.chosenMatchColourName)")
.padding()
.background(RoundedRectangle(cornerRadius: 12).foregroundStyle(viewModel.chosenMatchColour))
.modifier(iOS26GlassEffect(enableGlass: enableGlass, useShape: true, shape: .rect(cornerRadius: 12), cornerRadiusForNonGlass: 12))
}```
like that
well
not like that
var changingRectangleView: some View {
BaseChangingRectangleView(
viewModel: viewModel,
showWinMenu: $showWinMenu,
showLoseMenu: $showLoseMenu,
levelStarted: $levelStarted,
blurOpacityOn: $blurOpacityOn
)
}```
there
like that
I see, cool cool
damn i'm forgetting the syntax already, guess you lose it if you don't practice
man the one thing i like about swiftui is how compact is it
you can just do everything in like one line
It's important to know and understand both thinking strategies, the imperative programming of UIKit and the declarative programming of SwiftUI
.padding() .font .shadow
instead of
seperate line EVERY TIME
takes up so much space
button.layer.shadow
button.layer.shadowcolor
button.settitle
Button.addaction
button.backgroundcolor
swiftui would be button("stuff", action: { stuff }).padding().shadow().font().backgroundcolorstyle()
one liner
uikit is like 7
I mean if you really look at it it's basically the same thing
just mentally take away button at the beginning and you pretty much have the same concept
yes but its like 7 lines
As long as you write good code*
compared to 1
Generally you wouldn't want to put all of the modifiers on one line in SwiftUI
Maybe if there's one, but all of those (since there's multiple), would go on separate lines
yeah but like it's attached to one declaration
its
button
.this
.that
.there
instead of button.this
Button.that
button.there
and its inside ()
.
also i just found out YOU CANT EVEN ANIMATE MOST THINGS IN UIKIT
its so cooked
you cant even animate textcolor
Uh, you should be able to
nope
cant
you have to use CATextLayer()
UILabel's have like no animatable properties
it's cooked
How are you animating?
UIView.transition(with: yourLabel, duration: 0.3, options: .transitionCrossDissolve, animations: {
self.yourLabel.textColor = .red
}, completion: nil)
This seems to work, according to stackoverflow
yes i know but YOU CAN ANIMATE BACKGROUND COLOR with uiview.animate
the idea of withANimation is to hidethat bad syntax
also its attached directly to a view
which is annoying
well again, you're fighting UIKit now
that's why you're having the hurdles you're having
the fact that you need .transition for textcolor and .animatewithduration for background color makes no sense
why are they two different things
swiftui is withAnimation for literally everything
I was surprised as well, but there's most likely some sort of under the hood reason
That's fair, and it might be easier to use, but since you're working with UIKit, you're gonna have to work with its quirks too
grrr now i have to write a check into my withAnimation extension to see if the property uses .transition or .animatewithduration 
No, just use the native syntax, imo
in this case it's fine as it is
other stuff I understand, like the closure based buttons - but this is something you can still work with just fine
selector based buttons give me headaches
they are so dumb
it really should not be that freaking hard to make a button do something
hence why apple made it better in ios 14
but man it took them a long ass time
They are inconvenient to use in Swift, I agree - they were more rooted in Objective-C, as you can obviously see, with the @objc syntax
yes exactly
idk why they stuck around so long
i even prefer my closure syntax to apples
its a real closure
and im pretty proud that i remembered to make sure the action isn't deallocated
(i broke my rule of no alloc in swift)
ngl i still dont full understand the fact you can just create a closure out of thin air and add it to a function but chatgpt explained it well enough for me to be able to piece together that extension
ngl without chatgpt i wouldve been half as good at programming, idk why ppl use it to code for them rather than to teach them
its like stackexchange on steriods
When I started programming it wasn't a thing yet, so a lot of the work was manual
But with the advent of ChatGPT and Claude, they have been nice tools to use to assist with certain things, but they are still nowhere good enough for complicated tasks
I still mostly go on Google for my questions, and only resort to AI if I'm really desperate, before asking other people for help
for me i just use it to debug errors
its so useful for that i find
it takes forever to find someone who has/understands a specific error on google
it takes seconds for chatgpt to generally figure it out decently
mostly its never quite right
but its enough for me to understand whats actually going wrong
so i can fix it myself
Yeah I mean if you're working with a semi-common error then it should be alright, but if you're deep in a rabbithole then it probably won't be able to help you
ngl it was actually kinda fire helping me build swift 3
and there was NOTHING online about that
That's good
oh yeah i made a little writeup documenting my process
swift 3 is kinda cooked before final commit
its really funky
methods are still ()
.main() instead of .main
.red() instead of .red
.main isn't really a method though, as you probably know
indeed
It's a computed variable
yes but its written like it is
@objc(UIScreen)
public class UIScreen: NSObject {
public static var main: Self {
// ...
}
}
something like this
Well, it was .main() before, an actual method
yes
not a computed var
Oh you mean that in between stage of Swift 3
yes
I thought you meant the syntax in general
ngl that final commit is so big
it basically does the whole great renaming
its like 13k lines added
š
lol
it added pretty much all the classes ios 6 doesnt understand
anyways my backport takes care of all the renaming
or it will
.mainScreen() to .main
the idea is you can copy paste swift 3 code to and from swift 2.2
and have it compile in both
plus some added goodies
i genuinely don't understand why swift didnt get .randomElement() and .random until swift 4
I like the idea, but I think you're conflating two different things, the backporting stuff, which I think is great and interesting, but also some of the SwiftUI convenience that you want to bring over to UIKit. The latter is nice, but I think it would be better as a separate package because it's not really related to the rest of the "compatibility layer"
oh yeah its in its own folder
and its just withAnimation
bcus the uikit animate method is extremely verbose
No no I mean its own project/repo or whatever
right
yeah i was thinking of that
possibly even a largish backport of swiftui in general
idk if its possible in swift 2 tho
maybe in swift 2 WITH swiftcompatkit
anyways
im really hoping this works on ios 6
https://github.com/nsomar/OAStackView
its an excellent port of UIStackView
it's syntax and methods are basically identical
I'm like 95% sure you don't have to specify all the arguments though:
UIView.animateWithDuration(0.5) {
// ...
}
I think that should work
how do you specify the animation being used tho
my withAnimation is
withAnimation(1.5, animation: .Animation) {
}
i dont see any way of specifying animation without being verbose
if you can tho ill get rid of withanimation
yeah no you need delay, animations and completion to use .options
maybe i should make an extension to allow you to autofill those
Good point, hm:
extension UIView {
func animate(withDuration duration: CGFloat, options: UIViewAnimationOptions = [], animations: () -> Void, completion: () -> Void) {
self.animateWithDuration(duration, delay: 0, options: options, animations: animations, completion: completion)
}
}
something like that I guess
i see
or even
extension UIView {
func animate(withDuration duration: CGFloat, delay: NSTimeInterval = 0, options: UIViewAnimationOptions = [], animations: () -> Void, completion: () -> Void = { _ in }) {
self.animateWithDuration(duration, delay: delay, options: options, animations: animations, completion: completion)
}
}
then you would be able to specify things as needed
alr
ill test
grr ima try xcode 7
8*
7 is pissing me off
groups aren't folders???
why tf does the project just dump all the files in the project folder
š
oh yeah that's ridiculous
then again, ill have to take the ios 9 sdk
bcus a bunch of methods im using in xcode 7 exist in the ios 10 sdk
seperate from swift
like NSTimer.scheduledTimer
and ill have to use swift 2.3
hmm
ill make a copy of the project
my god this old mac is loud
its actually pretty fast tho
i cannot stress how much of a difference an ssd made
and then the ram on top made it even better
this machine is nearly fully usable
xcode runs smooth asf
at least xcode 7
idk about xcode 8
oh and ill have to force it to target ios 7 as well
grr
i think xcode 8 was the big update
it added auto profile management
finally ill be able to properly sign my app
lol
@visual meadow sshrd 18.2 broken I guess?
@visual meadow will look but in the meantime irecovery and finder detect dfu but sshrd says [*] Waiting for device in DFU mode still
not on my mac but someone else
ipad 7
Alr I can probably take a look sometime soon but i havent had that happen to any mac users weird
Usually its linux because of udev or whatever
@visual meadow wait lsusb might not be preinstalled
I think I use a different thing for macOS but you're right about that
For linux users
That script is due for a rewrite i just havent really felt like it to be honest
system_profiler SPUSBDataType
no output
What macos are they on?
I really hope its not tahoe, and if they changed something there
i had to replace the toolchain š
without that xcode continually thinks theres something there that just isnt
dammit
of course they changed something like that
Ill have to look when I get time or feel like it
But I'm heading to bed
@visual meadow lol iOS 18 already works you are using v26 instead of v29
lsusb -v works on mac but it needs to be installed
Okay that was thebiggest shitshow ever
So because Xcode introduced that new api
It's basically impossible to compile
No matter what you od
If you start replacing toolchains and copying sdks it just freaks out
so xcode 7 it is
Think I can just bundle a static build
I really dont want to make the user do more work to get stuff
nvm it seems it uses the same profiler lol
IT WORKS!!!
Thatās huge
UIStackView for iOS 6 UIKit
So useful
Now to try and understand the code and potentially rewrite it in swift
icl before i learnt the art of the stackview i would just add height width leading and trailing constraints to all my subviews in a for loop
its nearly like swiftui!!
thats where i was headed
š
takes more work but
it actually does end up doing what i want to do
this is great
this will work really well
this is a really big development
i'm making big strides in making ios 6 development more approachable
i'm also adding some uikit stuff from neweev ervsion
can you add iOS 7 NSAttributedStrings with the images
easier time dealing with custom emojis
inline images
errr ios 6 supports it
UILabels have inline nsattributedstrings
not the inline images, no
nsattributedstrings changed over time
@magic hazel https://developer.apple.com/documentation/uikit/nstextattachment iOS 7+
no that's the html webkit thing
yeah then this guy
let label = OHAttributedLabel(frame: CGRect(x: 10, y: 50, width: 300, height: 50))
// Basic text
let text = "Hello {star} world!"
let attributedString = NSMutableAttributedString(string: text, attributes: [
NSFontAttributeName: UIFont.systemFontOfSize(16),
NSForegroundColorAttributeName: UIColor.blackColor()
])
// Replace {star} with image
let image = UIImage(named: "star.png")!
let attachment = NSTextAttachment() // We wonāt use it directly, just as placeholder
let imageString = NSMutableAttributedString(string: " ", attributes: [
NSFontAttributeName: UIFont.systemFontOfSize(16)
])
// OHAttributedLabel provides a method to embed images
label.setText(attributedString, afterInheritingLabelAttributesAndConfiguringWithBlock: { (mutableStr) -> NSMutableAttributedString in
let range = (mutableStr.string as NSString).rangeOfString("{star}")
if range.location != NSNotFound {
// Replace placeholder with image
let attachmentStr = NSMutableAttributedString(string: " ")
let attachment = NSTextAttachment()
attachment.image = image
attachment.bounds = CGRect(x: 0, y: -3, width: 16, height: 16)
attachmentStr.appendAttributedString(NSAttributedString(attachment: attachment))
mutableStr.replaceCharactersInRange(range, withAttributedString: attachmentStr)
}
return mutableStr
})
label.sizeToFit()
self.view.addSubview(label)
this doesn't help with inline images whatsoever
and this uses iOS 7+ only apis
in fact it's explicitly stated that "Unfortunately, I no longer have time to maintain this class. Moreover, as since iOS6, UILabel now natively support NSAttributedStrings, this component is totally obsolete now (and maintaining it requires a lot of work for little benefit with recent projects all supporting iOS6+)."
oh well
yeah nah this is way beyond the rest of my helpers maybe ill get to it
wait why dont you just use html
am i supposed to generate html on the fly
manual positioning
no
oh okay
I mean, my ports rn have really been api renames with SOME backports of nonexistent types
hwoever
they're always based off types that do exist
and can be made into an overarching type
this doesn't exist in any capacity
DTCoreText seems like itd work
This is useful for drawing simple rich text like any HTML document without having to use a web view
it would but how am i supposed to generate html on the fly
wdym? you have your body of text and you copy it into a reusable html text component
so do you just want <p>%s</p> and <img src="%s" /> and for me to sprintf it into html
so do you just want
<p>%s</p>and<img src="%s" />and for me to sprintf it into html
@slim bramble we need a phd paper on how using swift is related to human brain degradation
lol
i mean
if you can't use it
ig skill issue
i could use that perfectly fine
in fact im considering it in my swift legacy discord port
.
i mean realistically the question that HAS to be asked is what is your alternative
and the alternative as plx has stated is manual positioning
i would take this ANY DAY over that
of course, i'm sure both me and plx would love to hear an alternative solution
it doesn't really matter how "cursed" or non cursed it is, on old ios, if it works, it works
var rectArray: [UIView] = []
for _ in 0...3 {
let x = UIView()
x.backgroundColor = .red
x.layer.cornerRadius = 12
rectArray.append(x)
}
let spacer = SpacerView()
spacer.translatesAutoresizingMaskIntoConstraints = false
let stack2 = UIStackView(arrangedSubviews: rectArray)
let stack = UIStackView(arrangedSubviews: [backButton, stack2, newText])
stack2.axis = .Vertical
stack2.spacing = 10
stack2.distribution = .FillEqually
stack2.alignment = .Center
stack2.translatesAutoresizingMaskIntoConstraints = false
stack.axis = .Vertical
stack.spacing = 10
stack.alignment = .Center
stack.distribution = .Fill
stack.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(stack)
setupConstraints()
view.layoutIfNeeded()
view.addConstraint(NSLayoutConstraint(item: stack, attribute: .Top, relatedBy: .Equal, toItem: view, attribute: .Top, multiplier: 1, constant: 20))
view.addConstraint(NSLayoutConstraint(item: stack, attribute: .Bottom, relatedBy: .Equal, toItem: view, attribute: .Bottom, multiplier: 1, constant: -20))
view.addConstraint(NSLayoutConstraint(item: stack, attribute: .Leading, relatedBy: .Equal, toItem: view, attribute: .Leading, multiplier: 1, constant: 20))
view.addConstraint(NSLayoutConstraint(item: stack, attribute: .Trailing, relatedBy: .Equal, toItem: view, attribute: .Trailing, multiplier: 1, constant: -20))```
funni uistackview
html for rendering emojis?)) fr?)
again, give me an alternative
inline emojis
go for it
custom emojis not system ones
plx already did #development message
pardon? that's not "it". that's him asking for a better solution than what he has
what he has is literally drawing an image next to the text
which is basically just as bad
manually finding where the image needs to be drawn and drawing it there
which is very fragile
what he's asking for is an implementation of apple's solution of a native class that does that
but thats ios 7+
the discord client is ios 5+
that class does not exist, therefore, other solutions must be found
<img aria-label=":frcoal~2:" class="emoji" data-type="emoji" data-id="784338955759517696" alt=":frcoal~2:" draggable="false" src="https://cdn.discordapp.com/emojis/784338955759517696.webp?size=56">```
it seems thats also how discord does it's emojis!
in fact, it's EXACTLY how discord does it's emojis
if it's good enough for one of the headlining features of a multi million dollar company, it's good enough for me
and while yes, you aren't making a website per se in an iOS app
there is no reason to think you shouldn't use a bit of html to make rendering an element designed to be rendered in html easier
nice. is your question solved then?
whats your question
i don't have one
the point was raised that using html for this would be "cursed"
i provided counter arguments
ah ok my bad, i assumed you had a question
nah all g
right answer but wrong reason :/
imagine if you just did everything discord does when making software
based chariz user
aight itās submitted
On one hand it's not very userfriendly to have the popular tweaks on so many different repos but on the other hand competition is awesome. We've seen how a "monopoly" like Cydia lead to nothing. Definitely a Chariz fan even though their website isn't too great.
We have cross repo search (canister) these days, these days users are fine
Maybe it won't help for discovery but if it's something specific users can find it
This message means nothing
Cydia wasnāt a repo, it was a package manager for repos like how Sileo is
The reason why people make tons of repos is because they are individually selling/distributing their own shit
With the intention of like BigBoss, Havoc, Chariz, etc to offer a centralized repo for HQ tweaks
Lmfao
Do people still make their own repos?
I remember it used to be the cool thing to have your own repo
I do, Iām hosting/planning to host primarily themes
Ones like ports where it wouldnāt be allowed on like havoc
A lot of people have their own repos, but they shove their big or free tweaks on a proper storefront like havoc/chariz
this commit supports ios 4.3+ and it supports using url's
you can embed links
registering fonts in uikit is such a pain
Yes, obviously.
But Cydia being this huge package manager was quite bad. Other package managers never had a chance or didnāt even start development. All while Cydia could just do the bare minimum and be a mess code wise. While the biggest alternative (RockApp) was bought by saurik.
I wanted to compare that same thing to repos where Havoc is kinda in the same position. Though then again, who wants to host a big repo platform nowadays with the amount of tweak releases.
what could be improved on the website?
I'll push back on that a bit, Cydia could have been better in a lot of ways, but without a doubt he always meant well
Oh, hey. Basically I mainly mean that youāre unable to filter or search on Chariz. Maybe thereās something that could be changed about the design but I donāt have any specific ideas there.
realistically a lot of the issues arising from Cydia occurred more when saurik stepped away and it got little to no attention in modern iOS
hi
yeah, I agree, search feels a bit overdue
with the help of chatgpt and apple's documentation, i'm happy to say i've backported NSLayoutConstraint's anchors
import UIKit
// MARK: - Anchor Backport
class Anchor {
weak var view: UIView?
let attribute: NSLayoutAttribute
init(view: UIView, attribute: NSLayoutAttribute) {
self.view = view
self.attribute = attribute
}
// constraint to another anchor
func constraint(equalTo other: Anchor, multiplier: CGFloat = 1.0, constant: CGFloat = 0) -> NSLayoutConstraint {
let constraint = NSLayoutConstraint(
item: view!,
attribute: attribute,
relatedBy: .Equal,
toItem: other.view,
attribute: other.attribute,
multiplier: multiplier,
constant: constant
)
return constraint
}
// constraint to constant value
func constraint(equalToConstant constant: CGFloat) -> NSLayoutConstraint {
let constraint = NSLayoutConstraint(
item: view!,
attribute: attribute,
relatedBy: .Equal,
toItem: nil,
attribute: .NotAnAttribute,
multiplier: 1,
constant: constant
)
return constraint
}
}
// MARK: - UIView Anchor Properties
extension UIView {
var leadingAnchor: Anchor { return Anchor(view: self, attribute: .Leading) }
var trailingAnchor: Anchor { return Anchor(view: self, attribute: .Trailing) }
var topAnchor: Anchor { return Anchor(view: self, attribute: .Top) }
var bottomAnchor: Anchor { return Anchor(view: self, attribute: .Bottom) }
var widthAnchor: Anchor { return Anchor(view: self, attribute: .Width) }
var heightAnchor: Anchor { return Anchor(view: self, attribute: .Height) }
var centerXAnchor: Anchor { return Anchor(view: self, attribute: .CenterX) }
var centerYAnchor: Anchor { return Anchor(view: self, attribute: .CenterY) }
}
// MARK: - NSLayoutConstraint isActive Backport
private var activeConstraints = NSHashTable<NSLayoutConstraint>.weakObjects()
extension NSLayoutConstraint {
var isActive: Bool {
get {
return activeConstraints.contains(self)
}
set {
guard let firstView = firstItem as? UIView else { return }
firstView.translatesAutoresizingMaskIntoConstraints = false
if newValue {
// add to superview if not already added
if let superview = firstView.superview, !superview.constraints.contains(self) {
superview.addConstraint(self)
}
activeConstraints.add(self)
} else {
if let superview = firstView.superview {
superview.removeConstraint(self)
}
activeConstraints.remove(self)
}
}
}
// MARK: - Activate / Deactivate multiple constraints
static func activate(constraints: [NSLayoutConstraint]) {
for c in constraints { c.isActive = true }
}
static func deactivate(constraints: [NSLayoutConstraint]) {
for c in constraints { c.isActive = false }
}
}
ok that's really cool
it would be nice to have a kind of general backport library for UIKit features
particularly like stack views
oh thats already done
lmao
someone did that
OAStackView
It's pretty comprehensive
the syntax is basically identical
just make a typealias for UIStackview and OAStackview
and you're good to go
viewStack.addArrangedSubview(SpacerView.spacer())
viewStack.addArrangedSubview(gameTitle)
viewStack.addArrangedSubview(SpacerView.spacer())
viewStack.addArrangedSubview(playButton)
viewStack.axis = .Vertical
viewStack.alignment = .Center
viewStack.distribution = .FillEqually
viewStack.translatesAutoresizingMaskIntoConstraints = false```
hmm
conflicting methods
ima try the ios 8 sdk
oh true that
I'm sure most of these things can be drop-in replaced by open source libs
it's an excellent port, has some quirks but overall it's quite good
errr no
funnily enough nearly nothing backports apples syntax
it's always their own special syntax that has it's own documentation
usually via cocoapods installation
ugh why
i want 1 library that has apple syntax and you can literally just drop the folder into your project
boom
start writing modern swift and uikit
so far everything other t han OAStackview has been the work of me/chatgpt (chatgpt fixes all my errors bcus im too lazy)
actually kinda sad cocoapods is shutting down
yeah
better in literally every way
and spm uhhh⦠doesn't demand GitHub run an entire dedicated server for them for free, forever
at CocoaPods' peak they were pushing a ton of traffic to the one repo
reluctantly
nah you're kidding this is microsoft
like what are they gonna do, break a critical part of the iOS dev supply chain
it was pre-Microsoft it started
so?
it's owned by microsoft
why haven't they shut it down
they're bleeding money
the irony is Microsoft would themselves have depended on it during its heyday
lmao thats wild
anyways ima install the ios 8 sdk
i think theres issues here with the ios 9 one actually having the methods im replicateing
and although i could do like
jlayoutanchor
i'd much prefer like actual uikit
then again idk if i prefer having to manually install the ios 8 sdk
š
and forcing every other user to also do it
yeah nah i have to rename

any way to do it with preprocessor macros?
probably not I think
I've only ever done it by checking swift version
nah nah i figured out a ay
typealiases
im already doing it with OAStackView
I can use UIStackView just fine
Even tho it exists in ios 9
bcus its not pointing to the actual class
its pointing to OAStackView
so ima just type alias everything
import UIKit
// MARK: - Internal Anchor Backport (safe names)
class JAnchor {
weak var view: UIView?
let attribute: NSLayoutAttribute
init(view: UIView, attribute: NSLayoutAttribute) {
self.view = view
self.attribute = attribute
}
func constraint(equalTo other: JAnchor, multiplier: CGFloat = 1.0, constant: CGFloat = 0) -> NSLayoutConstraint {
return NSLayoutConstraint(
item: view!,
attribute: attribute,
relatedBy: .Equal,
toItem: other.view,
attribute: other.attribute,
multiplier: multiplier,
constant: constant
)
}
func constraint(equalToConstant constant: CGFloat) -> NSLayoutConstraint {
return NSLayoutConstraint(
item: view!,
attribute: attribute,
relatedBy: .Equal,
toItem: nil,
attribute: .NotAnAttribute,
multiplier: 1,
constant: constant
)
}
}
// MARK: - UIView extension using safe internal anchors
extension UIView {
var jLeadingAnchor: JAnchor { return JAnchor(view: self, attribute: .Leading) }
var jTrailingAnchor: JAnchor { return JAnchor(view: self, attribute: .Trailing) }
var jTopAnchor: JAnchor { return JAnchor(view: self, attribute: .Top) }
var jBottomAnchor: JAnchor { return JAnchor(view: self, attribute: .Bottom) }
var jWidthAnchor: JAnchor { return JAnchor(view: self, attribute: .Width) }
var jHeightAnchor: JAnchor { return JAnchor(view: self, attribute: .Height) }
var jCenterXAnchor: JAnchor { return JAnchor(view: self, attribute: .CenterX) }
var jCenterYAnchor: JAnchor { return JAnchor(view: self, attribute: .CenterY) }
}
// MARK: - NSLayoutConstraint isActive Backport
private let activeConstraints: NSHashTable = NSHashTable(options: .WeakMemory)
extension NSLayoutConstraint {
var jIsActive: Bool {
get {
return activeConstraints.containsObject(self)
}
set {
guard let firstView = firstItem as? UIView else { return }
firstView.translatesAutoresizingMaskIntoConstraints = false
if newValue {
if let superview = firstView.superview where !superview.constraints.contains(self) {
superview.addConstraint(self)
}
activeConstraints.addObject(self)
} else {
if let superview = firstView.superview {
superview.removeConstraint(self)
}
activeConstraints.removeObject(self)
}
}
}
// MARK: - Activate / Deactivate multiple constraints
static func activate(constraints: [NSLayoutConstraint]) {
for c in constraints { c.jIsActive = true }
}
static func deactivate(constraints: [NSLayoutConstraint]) {
for c in constraints { c.jIsActive = false }
}
}
// MARK: - Typealiases / Modern-looking names
extension UIView {
var leadingAnchor: JAnchor { return jLeadingAnchor }
var trailingAnchor: JAnchor { return jTrailingAnchor }
var topAnchor: JAnchor { return jTopAnchor }
var bottomAnchor: JAnchor { return jBottomAnchor }
var widthAnchor: JAnchor { return jWidthAnchor }
var heightAnchor: JAnchor { return jHeightAnchor }
var centerXAnchor: JAnchor { return jCenterXAnchor }
var centerYAnchor: JAnchor { return jCenterYAnchor }
}
ngl chatgpt did the typealiasing for me i aint retyping allat
NSLayoutConstraint.activate([
playButton.centerXAnchor.constraint(equalTo: view.centerXAnchor),
playButton.centerYAnchor.constraint(equalTo: view.centerYAnchor),
playButton.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.25),
playButton.heightAnchor.constraint(equalTo: playButton.widthAnchor)
])```
this is now valid code on ios 6
prolly will just use view.addconstraint bcus im used ot it
It did start a little bit earlier even if it wasnāt really sauriks intention. Cydia definitely stopped other package managers which is unfortunate. Even Sileo had its issues taking over.
maybe, but I guess it was a good mix of both
I'm hazy on it now, but I think I was pushing for a proper auth system not using udids back in like 2015. reason it ended up first appearing in Sileo is because well⦠star was the first person that listened
maybe one day I'll reveal the magic formula that's made Chariz device linking work in Cydia. idk why but something I threw together in a few hours thinking it was nothing special, has never been replicated, and I've had plenty of people ask
it's definitely not straightforward though. and it shouldn't be necessary for it to be like that, but anyway
it just sucked from my pov that there was a whole JS API and no chance of it being exposed to anyone except cydia.saurik.com
@harsh junco 
Ong
Funny. I have that too!

anyone here know how i could properly inject a deb into an ipa but with ellekit instead of cydiasubstrate?
sideloadly?
I assume I would have to also manually inject Elektro right? Or am I blind
why
Because I heard cydiasubstrate is broken on 26 (or at least some headers idk) so I wanted to try with ellekit
The stuff that you can do without a jailbreak will be fine, i.e. objc swizzling
modifying c functions is beyond the paygrade of a jailed ios device
or at least, without jit
But like donāt apps crash when having tweaks injected with cydiasubstrate?
@velvet path idk the context here whats up
@native dune Is it working
On iOS 26 yeah
You need ellekit
Yeah
Do u know how I would do that?
Idk how manually but feather uses ellekit
Yeah that ik but to my knowledge that canāt directly export apps atm
And not worth it buying a cert just for that
what broke with substrate?
who is still using substrate
Most tools that inject tweaks into ipas I believe
Are you sure theyāre not just renaming ElleKit to substrate?
Idk
not sure but they crash
I would get you an ipa but I can't sign anything to test if it crashes lol
but this sounds weird
because all it should be doing is substrate hooks
which are just compiler macros
idk but I know my substrate apps broke when updating to iOS 26 and my ellekit apps continued working
and other people had the same issue
There is tool that does it with ellekit but it's made by a piracy developer
Filtered here too i believe
all you really need from ellekit is 1 dylib anyway
just rename it to whatever sideloadly or whatever expects
yeah
Also Iām pretty sure only ellekit to works to hook c functions on recent iOS versions
Other injection libraries would work
The method of hooking C functions hasnāt really changed
it has
or rather, ellekits is more simple
What does it do that the others didnāt?
the others did some mmap stuff idk
Ah I see
I forgot about all page permissions stuff I was thinking entirely about the actual physical hook
But okay no wonder itās changed lol
thats still only with jit ents right?
Not necessarily entitlements
But yeah, you need to be debugged or have dynamic-codesigning
did you ever look into libhookerās at any point? itās been broken a while
@native dune Can you make the testflight app work bruh
the jailbreak can supply an mmap hook to fix it
other than that it's impossible to work due to apples bullshit
even the fact ellekit works is a miracle
it's super weird
you can do
exec dsc mapping -> read/write dsc mapping (vm_protect) -> exec dsc mapping (vm_protect) once, but if you try to do it again, it doesn't work
iāve been using a Dobby shim by @visual meadow heād probably want to know this
this looks ai generated
lmao i mean i used AI to format the code and fix any bugs but i wrote pretty much everything myself
i generally only use ai for debugging
so
idk
i mean its pretty basic code
its really just busy work
reimplementing newer function calls
I'm pretty proud of some stuff
Like my dispatch queue reimplementation
it functions nearly identical to the actual thing
took a while to get that working
yeah idk lmao
i mean maybe the comments? then again i'm pretty shitty at comments and some of them mightve been left over from when i got some ai debugging
really i only needed debugging for uh
like timer and uibutton
timer was my first one tho
as a professional promptard i can confirm it has been tampered with ai
which it gets later confirmed here
Well yeah but yhe code itself hasnāt been written by so
ai*
Ai fixed my errors
Thatās about it
šļø
update: yes it does indeed appear to be the N1 chip instead of the C1, why'd so many news articles have to spread this around so much
(see above)
so it's basically just macbooks with the N1 chip which is uhh
nothing special really
n
1
n
1
Lol
n
1
?
what
finally, I have an excuse to use this system message thing
it survived for 6 years and went through 3 rewrites
i'm surprised it lasted this long
also jailbreaking is dead, so
