Kotlin itself is largely dependent on Java. So Google needs a completely different alternative which helps them get rid of it entirely (That’s one of the reasons for the existence of Fuchsia). The Dart programming language used in the Flutter framework is one of the first steps taken by Google to do the same.I am still thinking between Reative Native and Flutter. Actually I prefer developing an app using a native code. So recently I looked through Kotlin and Android native platform. By the way it seems that Google might give up Kotlin in the future in according to this article.
8/22/2019
8/07/2019
Docker connection is refused in Jenkins
3:09 AM
devops, docker, docker daemon was refused, jenkins
No comments
The issue was from Docker configuration. In Ubuntu 18.04 Docker configuration is located in /lib/systemd/system/docker.service Then I need to update to enable Docker daemon connection from Jenkins.
ExecStart=/usr/bin/docker daemon -H fd://
I updated the configuration above to a new configuration below.
ExecStart=/usr/bin/docker daemon -H fd:// -D -H tcp://0.0.0.0:2375
The I restarted Docker daemon.
sudo systemctl daemon-reload
sudo systemctl restart docker
Now it worked. Jenkins can connect the Docker daemon now.
7/19/2019
How to handle a iOS extension using fastlane
6:17 PM
app profile, cicd, fastlane, fastlane gym, fastlane match, fastlane produce, iOS Development, notification extension, onesignal, provisioning profile
No comments
Create an app profile for your extension
You can use fastlane produce function to create an app profile for your extension. If you already have an app profile in Apple Developer portal, pass this instruction.lane :createAppProfile do
produce(
app_identifier: “com.victorchoi.x.OneSignalNotificationServiceExtension",
app_name: “victorchoi OneSignalNotificationServiceExtension",
skip_itc: true
)
Create a provisioning profile
Then you need to create a certificate and a provisioning profile for your extension. I use fastlane match to easily create and manage a certifcate and a provisioning profile.lane :codesign do
match(
app_identifier: ["com.victorchoi.x”,”com.victorchoi.x.OneSignalNotificationServiceExtension"],
type: "appstore",
)
Download the provisioning profile and save into your CI/CD server
Lastly, you need to make sure that your CI/CD server has the provisioning profile to build. At this step, you must have two provisioning profile for your app. So let’s configure your provisioning profile in the build process. In this case, I use fastlane gym to build them.provisioningProfiles: {
“com.victorchoi.ios” => "match AppStore com.victorchoi.ios“,
“com.victorchoi.x.OneSignalNotificationServiceExtension" => "match AppStore com.victorchoi.x.OneSignalNotificationServiceExtension"
}
Building your CI/CD process takes time. So I hope this article helps you not to spend much time on it. No Profile for team error on Jenkins using fastlane gym
5:03 PM
devops, fastlane, gym, iOS Development, jenkins, no profile for team, xcode
No comments
I prefer to use a combination of Jenkins and fastlane to build and distribute my iOS application. Recently I tried to make a CI/CD server using Jenkins and fastlane and then I faced an issue that I had struggled to fix it. The issue is normally coming from a build process using gym in fastlane. The error log is normally like below.
No profile for team 'TXVIGNOXXXX’ matching ‘iPhone_Development' found: Xcode couldn't find any provisioning profiles matching 'TXVIGNOXXXX/iPhone_Development'. Install the profile (by dragging and dropping it onto Xcode's dock item) or select a different one in the General tab of the target editor
So how do I solve this issue?
Check your Provisioning Profile Mostly you can find this advice on the web. Provisioning Profile files are saved in the path
/Users/{{UserAccount}}/Library/MobileDevice/Provisoning Profilesand then your right provisioning file should be there. But my case wasn’t like this. I use fastlane match to create and update Provisioning Profile and there should not be this issue.Check your Team ID Find your team ID and then check the Team ID is correct.
Permission issue The third one was my issue. In my case, I use
sudocommand to runfastlane release. But the problem was the Provisioning Profile belongs to Jenkins user account. Then I just removed thesudocommand and then now it works. Still, I am not 100% sure that the issue was caused by the permission to runfastlanecommand.
I hope that this article could help someone has a similar issue.
6/21/2019
How to prevent your Mac from sleep
4:04 PM
Mac, mac sleep mode, macbook, macOS, macserver, preventmacfromsleep, sleep
No comments
Then I found a Apple support link to solve this issue via a terminal command.
Open your terminal on your mac and then type the command below.
sudo pmset -a disablesleep 1
That’s it. Now you can prevent your mac from the sleep mode.
The support link isn’t updated by Apple anymore. So I guess that in the future Apple might force the command doesn’t work.
12/05/2017
A Code Sample to use Core Data Stack as a Singleton
6:26 PM
AppDelegate, Core Data, Core Data to Singleton, Singleton
No comments
I used to create an instance of my Core Data Stack in AppDelegate file and accessed it from other View Controllers. But I have to modify it because iOS 11 forces to access AppDelegate file in the main thread. So I made my Core Data Stack as a singleton.
If you are looking for a code sample to make your core data stack as a singleton. Please refer the code below.
class func sharedInstance() -> CoreDataStack {
struct Static {
static let instance = CoreDataStack()
}
return Static.instance
}
How can I detect iPhone X's screen size?
4:32 PM
Detect iPhone X Screen, iPhone X, iPhone X Screen Size, UIScreen
No comments
How can I detect iPhone X’s screen size?
After Apple released iPhone X I am trying to update my application for iPhone X. The UI elements to fit iPhone X I have to detect the screen size of iPhone X and I found the code below which works for me.
if UIDevice().userInterfaceIdiom == .phone {
switch UIScreen.main.nativeBounds.height {
case 1136:
print("iPhone 5 or 5S or 5C")
case 1334:
print("iPhone 6/6S/7/8")
case 2208:
print("iPhone 6+/6S+/7+/8+")
case 2436:
print("iPhone X")
default:
print("unknown")
}
}