I have an iOS app.
When I install pods via CLI to my project for the first time, launch Xcode, and then run the app, everything works fine – no build errors.
But after several instances of running the project on my device, all of a sudden build errors appear like:
/Pods/FirebaseCrashlytics/Crashlytics/Crashlytics/Settings/Models/FIRCLSApplicationIdentifierModel.m:19:9 'Crashlytics/Shared/FIRCLSByteUtility.h' file not found
/Pods/PostHog/vendor/libwebp/ph_sharpyuv_csp.h /Pods/PostHog/vendor/libwebp/ph_sharpyuv_csp.h: No such file or directory
And I have no idea why if it's because of my PodFile or any Build Settings/Phases/Rules, but this keeps happening repeatedly and it's impossible to develop anything with this.
I've tried a string of commands such as "pod deintegrate", "pod cache clean --all", removing PodFile.lock and doing pod install again, removing derived data, and cleaning build folder. I still keep running into the same build error and it's always after a few builds this happens, nothing is missing prior when the project successfully builds.
Here is my PodFile for reference:
# Uncomment the next line to define a global platform for your project
platform :ios, '17.0'
def google_utilities
pod 'GoogleUtilities/AppDelegateSwizzler'
pod 'GoogleUtilities/Environment'
pod 'GoogleUtilities/ISASwizzler'
pod 'GoogleUtilities/Logger'
pod 'GoogleUtilities/MethodSwizzler'
pod 'GoogleUtilities/NSData+zlib'
pod 'GoogleUtilities/Network'
pod 'GoogleUtilities/Reachability'
pod 'GoogleUtilities/UserDefaults'
end
target 'SE' do
# Comment the next line if you don't want to use dynamic frameworks
use_frameworks!
# Pods for SE
pod 'Firebase/Core'
pod 'Firebase/Firestore'
pod 'Firebase/Auth'
google_utilities
end
target 'NSE' do
# Comment the next line if you don't want to use dynamic frameworks
use_frameworks!
# Pods for NSE
pod 'Firebase/Messaging'
google_utilities
end
target 'targetApp' do
# Comment the next line if you don't want to use dynamic frameworks
use_frameworks!
#Pods for targetApp
pod 'Firebase/Core'
pod 'Firebase/Crashlytics'
pod 'Firebase/Messaging'
pod 'Firebase/Firestore'
pod 'Firebase/Storage'
pod 'Firebase/Functions'
pod 'PromiseKit', '~> 6.0'
pod 'lottie-ios'
pod 'GooglePlaces'
pod 'JWTDecode', '~> 2.4'
pod 'PostHog'
pod 'Kingfisher', '~> 8.0'
pod 'PhoneNumberKit'
google_utilities
end
post_install do |installer|
installer.aggregate_targets.each do |target|
target.xcconfigs.each do |variant, xcconfig|
xcconfig_path = target.client_root + target.xcconfig_relative_path(variant)
IO.write(xcconfig_path, IO.read(xcconfig_path).gsub("DT_TOOLCHAIN_DIR", "TOOLCHAIN_DIR"))
end
end
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
if config.base_configuration_reference.is_a? Xcodeproj::Project::Object::PBXFileReference
xcconfig_path = config.base_configuration_reference.real_path
IO.write(xcconfig_path, IO.read(xcconfig_path).gsub("DT_TOOLCHAIN_DIR", "TOOLCHAIN_DIR"))
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '17.0'
end
end
end
installer.pods_project.targets.each do |target|
if target.name == 'BoringSSL-GRPC'
target.source_build_phase.files.each do |file|
if file.settings && file.settings['COMPILER_FLAGS']
flags = file.settings['COMPILER_FLAGS'].split
flags.reject! { |flag| flag == '-GCC_WARN_INHIBIT_ALL_WARNINGS' }
file.settings['COMPILER_FLAGS'] = flags.join(' ')
end
end
end
end
end
And here is my only "Run Script" in Build Phases:
"${PODS_ROOT}/FirebaseCrashlytics/upload-symbols" \
-gsp "${PROJECT_DIR}/targetApp/GoogleService-Info.plist" \
-p ios \
"${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}"
Selecting any option will automatically load the page
Post
Replies
Boosts
Views
Activity
I have an iOS app where I'm trying to paste something previously copied to the user's UIPasteboard. I came across the UIPasteControl as an option for a user to tap to silently paste without having the prompt "Allow Paste" pop up.
For some reason, despite having what seemingly is the correct configurations for the UIPasteControl, on testing a tap, nothing is called. I expected override func paste(itemProviders: [NSItemProvider]) to fire, but it does not.
Any help would be appreciated as there doesn't seem to be much info anywhere regarding UIPasteControl.
import UniformTypeIdentifiers
class ViewController: UIViewController {
private let pasteControl = UIPasteControl()
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .systemBackground
pasteControl.target = self
pasteConfiguration = UIPasteConfiguration(acceptableTypeIdentifiers: [
UTType.text.identifier,
UTType.url.identifier,
UTType.plainText.identifier
])
view.addSubview(pasteControl)
pasteControl.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
pasteControl.centerXAnchor.constraint(equalTo: view.centerXAnchor),
pasteControl.centerYAnchor.constraint(equalTo: view.centerYAnchor),
])
}
}
extension ViewController {
override func paste(itemProviders: [NSItemProvider]) {
for provider in itemProviders {
if provider.hasItemConformingToTypeIdentifier(UTType.url.identifier) {
provider.loadObject(ofClass: URL.self) { [weak self] reading, _ in
guard let url = reading as? URL else { return }
print(url)
}
}
else if provider.hasItemConformingToTypeIdentifier(UTType.plainText.identifier) {
provider.loadObject(ofClass: NSString.self) { [weak self] reading, _ in
guard let nsstr = reading as? NSString else { return }
let str = nsstr as String
if let url = URL(string: str) {
print(url)
}
}
}
}
}
}
I integrated an Advanced App Clip Experience to my app. In trying to test the App Clip Card, the card does not appear when I tap the link on my device that is associated to the Advanced App Clip Experience.
Listed are some contextual information:
Testing on device running on iOS 18.3.1
Associated Domains:
Main target app: applinks:
App clips target app: applinks: and appclips:
Archived and uploaded build to App Store Connect.
Green "Testing" status via Testflight.
On Distribution tab, green "Valid" status for build domain.
Advanced App Clip Experience green "Received" status.
Developer App Clip Testing Diagnostics:
Green "Register Advanced Experience" status
Green "App Clip Code" status
Warning "App Clip Published on App Store"
Orange Circle "Associated Domains"
After looking at countless threads, I still cannot for the life of me find a solution to test the App Clip. Any guidance would be extremely appreciated. I had also submitted a support ticket with case ID #102552504973.
I use a PHPickerViewController for a user to select profile images. I want the order in which the photos were selected, respected.
However, whenever I return the selected results, the order in which I selected is not reflected.
I've double checked my config, but no solution has worked and would appreciate any guidance that does not involve using a 3rd party! Apple Documentation states simply setting the .selection property to .ordered should respect the user's selected order, but it does not!! documentation
//Setup code
var config = PHPickerConfiguration()
config.selectionLimit = 3
config.filter = .images
config.selection = .ordered
let picker = PHPickerViewController(configuration: config)
picker.delegate = self
//Delegate handler
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
guard !results.isEmpty else {
picker.dismiss(animated: true)
return
}
self.photos = []
var tempImages: [Int: UIImage] = [:]
let dispatchGroup = DispatchGroup()
for (index, result) in results.enumerated() {
dispatchGroup.enter() // Enter the group
result.itemProvider.loadObject(ofClass: UIImage.self) { [weak self] object, error in
defer { dispatchGroup.leave() }
guard let self = self else { return }
if let image = object as? UIImage {
tempImages[index] = image
}
}
}
dispatchGroup.notify(queue: .main) { [weak self] in
guard let self = self else { return }
for index in 0..<tempImages.keys.count {
if let image = tempImages[index] {
self.photos?.append(image)
}
}
}
picker.dismiss(animated: true)
}
I created a Notification Service Extension to display profile images in place for the app image (i.e. iMessage).
I send a remote push notification via Firebase Functions, and in the payload, the relevant profile image url string. The profile image url string in the payload is successfully delivered as it appears in my console log and AppDelegate didReceiveRemoteNotification function.
My problem is the profile image does not replace the default app icon image in the remote push notification.
Below is my configuration. Any guidance would be appreciated!
Main target app: the info plist contains NSUSerActivityTypes = [INSendMessageIntent]. The Communications Notifications capability is enabled and "Copy only when installing" in Build Phases Embed Foundation Extensions
Notification Service Extension plist: contains NSExtension > NSExtensionAttributes > IntentsSupported > INSendMessageIntent.
Notification Service Extension class code:
var contentHandler: ((UNNotificationContent) -> Void)?
var bestAttemptContent: UNMutableNotificationContent?
override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
self.contentHandler = contentHandler
bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)
guard var bestAttemptContent = bestAttemptContent else { return }
guard let fcmOptions = bestAttemptContent.userInfo["fcm_options"] as? [String: Any],
let attachmentUrlAsString = fcmOptions["imageURL"] as? String else {
contentHandler(bestAttemptContent)
return
}
if let attachmentUrl = URL(string: attachmentUrlAsString) {
var senderNameComponents = PersonNameComponents()
senderNameComponents.nickname = bestAttemptContent.title
let profileImage = INImage(url: attachmentUrl)
let sender = INPerson(personHandle: INPersonHandle(value: "1233211234", type: .unknown), nameComponents: senderNameComponents, displayName: bestAttemptContent.title, image: profileImage, contactIdentifier: nil, customIdentifier: nil, isMe: false)
let receiver = INPerson(personHandle: INPersonHandle(value: "1233211234", type: .unknown), nameComponents: nil, displayName: nil, image: nil, contactIdentifier: nil, customIdentifier: nil, isMe: true)
let intent = INSendMessageIntent(
recipients: [receiver],
outgoingMessageType: .outgoingMessageText,
content: "Test",
speakableGroupName: INSpeakableString(spokenPhrase: "Sender Name"),
conversationIdentifier: "sampleConversationIdentifier",
serviceName: nil,
sender: sender,
attachments: nil
)
intent.setImage(profileImage, forParameterNamed: \.sender)
let interaction = INInteraction(intent: intent, response: nil)
interaction.direction = .incoming
interaction.donate(completion: nil)
if #available(iOSApplicationExtension 15.0, *) {
do {
bestAttemptContent = try bestAttemptContent.updating(from: intent) as! UNMutableNotificationContent
} catch {
contentHandler(bestAttemptContent)
return
}
}
contentHandler(bestAttemptContent)
} else {
contentHandler(bestAttemptContent)
return
}
}
}
I am using the Contacts API for my iOS app to fetch contacts. I currently sort the fetched contacts alphabetically, but was wondering if there is any ability to rank and sort them by "highest interaction" (i.e. scan iMessage or phone call log to prioritize contacts)?
Any insight would be appreciated. I don't think this is possible via the Contacts API from what I've read, and I haven't found any existing answer commenting on this.
For users to create an account and access my app, I only have Apple Sign-in. What sign-in credentials do I provide when I submit my app to the appstore for review?
If I try to create a dummy apple id account, I would have to provide a phone number to verify login from new devices, which is something I'd like to avoid, and even then don't know how I'd be able to relay the security code.
Any help would be appreciated.
I have a transactional welcome email sent to users.
In testing users replying back to my sender address, I received a delivery error from one user via private email relay service - "550 Relay is not allowed".
Can someone pleasee advise? Replies have worked for other users using Apple's same private email relay service...and domains have also already been registered/verified.