分类
stuff

�区 Apple ID 支付�充值 / 无�充值

支付�首页�索 PockytShop �程�:


(注��字�logo�开�商�称)

打开该�程�,长这样:

�以看到 Apple Gift Card US,有彩色的logo,该商���区礼��:

点开就有����价格的礼��,按需选择��:

选购�功�,会有礼���,如下图:

�制到App Store应用里→点击�上角头�→进入 Account,在列表选择 Redeem Gift Card or Code,在弹出的页�里,选择手动输入� Enter Code Manually,在输入框里粘贴之�的礼����,确认��。

�以在 Credit 里看到余�。

分类
stuff

WWDC2022

一年一度WWDC�啦

2022了, 还在�罩😷时代中, 今年继续线上WWDC.

�看到iPhone�空��, 也�知�是�是真的没有�伤(😂.

关�硬件的一点点讨论

熬夜看了开幕演讲. 然�在官网研究了下�载M2的两款笔记本, 真的是一言难尽的感觉�.

�么说呢, Air和Pro在芯片上看起�是�款, 所以有�样的�置选择: RAM 8G/16G/24G; SSD 256G/512G/1T/2T; 8核10核什么的.

然而, Air是�的30W(8核)/35W(10核)电�的, Pro则是仅标�67W电�. 那��电�的功耗差别这么大, 是�是满载的差�自�对核心的�定呢... 这么一看那Air就如其�, �能当�轻薄本用, �适�开�生产力了.

但是, �一看价格, �数��置情况下, Air更贵一点点. 这...看看效�图, 居然Pro用的机�是旧版, �幕也是旧版, 还带TouchBar, 这官方都默认淘汰的��儿.

所以苹��出�外的�开始销库存套路了. 😅

在我的�MacBook(2013)已��能更新最新的Xcode情况下, 本还以为�新�M2机器�以刚好置�下. 这下�得等10月�.

软件

啊, CarPlay, DriveKit? 车都没, �用�用;

桌�端功能, emm, 我还是�写移动端好了;

多端�动? 啊, �当你SideCar在Catalina上加入时, 我就因为电脑太旧没能用上, 多端�动新功能? ��能调试, 算了算了;

虚拟机? �能是最关注的点�. 自打在M1开始, vbox就没了. Session 10002有关�虚拟机的, �以关注一下.

�正目�没看到特别感兴趣的技术. 如��期看到, ��补�.

�没有

�没有iPad版Xcode, �想说...嗯...生产力? 还�是爱奇艺�. �年都�想期待这事儿了.

Author

Luo Yu(indie.luo@gmail.com)

Thursday, June 09, 2022

分类
LAZISNU

Module模�化iOS开�的应用��顾

Pre

2016年在�奥时, 在当时的项目需求下, �生了模�化设计的想法. 而�考如何划分�模���组件时, 写了篇文章: gate.io. 当时更多的是在�考划分界�, 然�用�有Cocoapods库进行组织的��践. 而��这个�法得到了�际使用的良好�馈, 我�将它�步打磨. 形�了Core库(github)的设计. �能是觉得和之�的文章内容并无�质上区别, 也就没有�独写一篇�记录. �在想想, 其�这是�文设计的一个更完备的形�.

设计

如�文�到的, 使用�有的Cocoapods进行模�组�管�, 为了解耦关�, 这里采用Core核心库的形�:

graph TB
subgraph LYCore

  subgraph id31[Third-party Libs<br>]
  id311[AFNetworking]
  id312[LYCategory]
  id313[Realm]
  id314[...etc]
  id311---|sibling| id312
  id312---|sibling| id313
  id313---|sibling| id314
  end

  subgraph id32[Implementation<br>]
  id321[Networking Layer/API wrapper]
  id322[Persistence Layer/Database wrapper]
  id323[Configuration Layer]
  id324[Class Base]
  id321---|sibling| id322
  id322---|sibling| id323
  id323---|sibling| id324
  end

  subgraph id33[Resource<br>]
  id331[Bundle wrapper]
  id332[Image]
  id333[Font]
  id334[Sound]
  id335[...etc]
  id331---|sibling| id332
  id332---|sibling| id333
  id333---|sibling| id334
  id334---|sibling| id335
  end

end

核心库的��中,

  • æŒ�久化层, æ•°æ�®åº“访问å°�装, 文件读写å°�装;
  • é…�置层, é…�置文件的访问å°�装;
  • 网络层, 包å�«äº†Server API的基础访问å°�装, 并å�¯é€šè¿‡é…�置文件åˆ�始化;
  • 基类, 包å�«å�„ç§�常用类的定义;

这样基�Core(核心)库, �开始�建�个�际的功能模�(Module).

Module也以Cocoapods Library的形�创建, podspec里注��赖�Core库.
�建在Core之上的Module, �通过Core库访问Server API�了解当�用户鉴�状��读写数�库���&调整�置等.
无需�赖其他模�.

App则最终以工程的形�创建, 通过Podfile选择所需的模�们(Modules).
这和使用其他的第三方库一样, 没什么区别.

整体��大致如图:

graph TB
  id1["Module: LYCore<br>(git repo | pod lib)"]
  id11["Module: A<br>(git repo | pod lib)"]
  id12["Module: B<br>(git repo | pod lib)"]
  id13["Module: C<br>(git repo | pod lib)"]
  id14["Module: D<br>(git repo | pod lib)"]
  id15["Module: E<br>(git repo | pod lib)"]
  id21["App: 1<br>(git repo | project)"]
  id22["App: 2<br>(git repo | project)"]
  id1-->|podspec| id11
  id1 -->|podspec| id12
  id1 -->|podspec| id13
  id1 -->|podspec| id14
  id1 -->|podspec| id15
  id11 -->|podfile| id21
  id12 -->|podfile| id21
  id13 -->|podfile| id21
  id12 -->|podfile| id22
  id13 -->|podfile| id22
  id14 -->|podfile| id22
  id15 -->|podfile| id22

Author

Luo Yuluoyu@luoyu.space

分类
dev

About Cocoapods

关�安装Cocoapods

Cocoapods(�简称为pod)是一个Ruby程�, 当然�以在Gem里找到并安装.

但如�我们系统里有统一的包管�器Homebrew(�简称brew), 更应该�由它�安装, 这样也便�统一的管�版本, 以����的包在��的程�管�下的混乱局�.

通过brew安装pod就很简�:

brew install cocoapods

�级Cocoapods

��Xcode�SDK的�断�级, Cocoapods也在跟��断�级以适应项目生�.

所以我们一定��时更新pod版本, 以�在Xcode�级�, 生�的xcodeproj和pod有兼容问题.

如上所述, 通过brew安装的包, 也应该通过brew�管�版本, �级也很简�:

# 先更新下brew的formula信�:
brew update
# 如�Cocoapods有�用更新上�的命令结�会展示出�.

# 想查看全部�更新的包:
brew outdated

# æ›´æ–°Cocoapods
brew upgrade cocoapods

CDN

新的pod(1.9.x)已支�CDN加速, �过目�也没用出速度区别�~

�以看到的改�在~/.cocoapods/repos/目录下,

  • 旧的 master仓库/trunk仓库 å·²ç»�没了, ç�°åœ¨é»˜è®¤ä»“库å��为cocoapods.
  • æ–°å¢�一个trunk文件夹, 类别为CDN (https://cdn.cocoapods.org/), 此目录é��git仓库.

�际使用下, pod install会�CDN读�以确定安装的库的版本.

也就是说, 库版本的确定�在的路径是:

Podfile.lock > CDN > cocoapods repo

如需更新必须使用pod update.

利用指定repo�加速

指定repo本是�以添加�有Spec仓库的.

例如我曾在�项目里用到:

Podfile:

source 'https://github.com/CocoaPods/Specs.git'
source 'https://github.com/blodely/LYSpecs.git'
source 'https://e.g.some.company.git.server/PrivateSpecs.git'

�指定除了官方仓库外, 还有自己的LYSpecs仓库(里�有一些未�到官方的libs), 和公�的�有库(包�一些模�化的库, 但仅�公�内部访问).

source就�以指定多��.

而pod仓库在GitHub, 对�国内用户�说访问速度�是特别�好, 特别是Spec仓库目录�文件众多, 克隆和拉�都很慢, 容易因网络波动断开.

这样我们就�以用一些国内的Cocoapods spec的镜��作为�.

应用起�很简�:

# 在Podfile首行加上你所想用的镜�地�

# 清��
source 'https://mirrors.tuna.tsinghua.edu.cn/git/CocoaPods/Specs.git' 

# 或者�云的�
source 'https://gitee.com/mirrors/CocoaPods-Specs.git'

# 或者其他

注�找信得过�哦!~

��没什么大问题的情况下, 大家都使用官方�.

关�Repo仓库

用过pod search�pod repo add, �能会找到在路径~/.cocoapods/repos/下的一些仓库.

它们事�上就是一个git管�的仓库, 包�了所有被�上�的pod库的spec等信�.

所以当我们对一个项目的Podfile�行pod install命令时, 它会知��一个pod库应该�哪���.

search的索引

pod的spec仓库如此��而缓慢, �索如�是直��中进行, 那效�会太�.

所以pod的�法是, 根�仓库创建一个用��索的索引文件(index), 然�使用索引��索(pod search).

这个文件��~/Library/Caches/CocoaPods/search_index.json.

当首次克隆完spec仓库�执行�索时, 或是添加了新的spec仓库�执行�索时, 它都会出�一个Creating search index for spec repo 'xxx'..的等待过程.

如若�到索引文件�正确的情况无法search, �以删除该index, 让pod�新生�一个, �修�该问题.

Author

Luo Yu

luoyu@luoyu.space

Wednesday, July 8, 2020

分类
stuff

iOS App Store Review Guidelines �讨

�

首先, 这里是App Store Review Guidelines的官网链�.
啥都�以它为准, (哪怕是觉得他们错了�申诉).

“大礼包�

最近���公�组里�事那��这个�, 有点有趣.
在网上看了看大家�的审核问题, 很快就��了诸如“2.1大礼包�, “4.3大礼包�, “礼包5.0�等等有趣的�法.
想必是些个��.

2.1 App Completeness

程�完备性.
个人感觉这一�的问题应该算是�以比较容易解决的问题.
��程度上, 是�交方自己没�好的.
按照指示修�问题��.

2.3 Accurate Metadata

很常�的, 应用程�元数��准确.
这里��Apple的�求比较严格. (我碰到的审核问题大部分都在这一�).

列举常�的此类问题:
- screenshot: 目�对�手机应用, 必传的图有iPhone X/iPhone 8 Plus的尺寸图; 需�注�的是, 图中若出�iPhone, 则需�应对应图片所指代的iPhone(也就是说iPhoneX的图里的手机必须是iPhone X, iPhone Plus里则是普通iPhone).
- 应用介�内容和应用程��一致; ��写太宽泛就好; 需�注�的是, 一些诸如医疗�慈善等相关的内容, 需��布公�/���该内容的�供方, ��然是肯定�会通过的.
- �索关键字;

4.3 Spam

导引上说“Don’t create multiple Bundle IDs of the same app.�
看�这�是��包改��交的行为了.
这个我�没�过.
�过试想了一下, 如�真有这�需求, 改动一点��交�, 对�有开�人员的情况, 这应该�是什么大问题.
如��是买了别人的应用代�就想�交的�..�怕会�到此问题.

相关审核规则:
4.3.0 - Are a duplicate of another app or are conspicuously similar to another app

IAP应用内购相关

积分or类似积分形�, 数字消耗�, App内消耗�等类似形�的购买物, 都应走In-App Purchase(应用内购).

列举相关:
3.1.1 - Use payment mechanisms other than in-app purchase to unlock features or functionality in the app

��功能相关

若Apple审核以��手段检测or怀疑�交审核的应用包���功能, �能列举如下�款:

1.1.6 - Include false information, features, or misleading metadata.
2.3.0 - Undergo significant concept changes after approval
2.3.1 - Have hidden or undocumented features, including hidden "switches" that redirect to a gambling or lottery website

这里说得很�确了, ��功能, 审核通过�会出��大功能�更...
马甲包的问题在此.

Legal 法律相关问题

基本指�了, 若��供相关�务, 必须是具有该资质的机�/公�/���交应用.

5.2.1 - Were not submitted by the legal entity that owns and is responsible for offering any services provided by the app
5.2.3 - Facilitate illegal file sharing or include the ability to save, convert, or download media from third party sources without explicit authorization from those sources
5.3.4 - Do not have the necessary licensing and permissions for all the locations where the app is used

借贷问题相关:
3.2.1 - Do not come from the financial institution performing the loan services
具有资质的机��能�交借贷相关功能的应用.

Author

骆昱(CIATOTO)

Email: indie.luo@gmail.com

Version

1.0.0, Thursday, August 16, 2018

分类
stuff

笔记: WWDC 2016 Session 805 Iterative UI Design

��

最近在翻看WWDC视频.
这个����设计�的内容, 以�也确�没有��看看.
觉得还�错, 有很多更Apple�格的�路. 留点笔记�.

笔记

805所说的迭代UI设计, 更多的是在讲如何�零开始设计一个App.
迭代的, 是产�设计的��过程.

围绕一些问题, �以�梳��路:

  1. What are we making?
  2. Who is it for?
  3. Does it actually work?
  4. And did we get it right?

Identify the features that matter most to the people who will use your app,
and features that serve your own goals for the app it self.
In order to determine what your app should do.

还大字说�了一件感觉很多“产����应该好好看看的--

You ≠ User

你�是用户.

Designing for yourself distracts you from what matters most to everyone else.

诸多产���喜欢用自己的习惯, 套上“用户�如何如何想, “用户�如何如何觉得这样的外衣, �解读需求.
应该注�注�啦.

视频里还演示了用Keynote�画UI的过程, 并归纳了一下:
1. Use screenshots as references;
2. Draw some squares and lines;
3. Zoom in and out a lot (to make sure that they were pixel perfect);
4. Use believable content.

设计完一个界��, �继续延展.
因为一�界��是一个App, 需�完善workflow.

基本�则还是:

Started with what I knew and then I evaluated and iterated on all my designs until I ended up with something I was happy with.

整个过程就是805所在�的, iterative design, 迭代设计.

å°¾

�际看�, 他们的�作, 有多设计, 多比较, 比我日常看到的有更多的互动.
而�是一个人盯�一�幕的工具, 和别人家的产�, 埋头~~抄抄抄~~画画画.

Author

骆昱(Luo Yu, indie.luo@gmail.com)
Tuesday, August 14, 2018

分类
stuff

笔记: ArchLinux�境

最近把旧电脑的�硬盘�下�, 然�立马元气满满的样�. 就准备给它装个Linux�用.

�外好久没有更新,就把东西放上�好了.

准备安装U盘

�ArchLinux的官网下载最新的iso文件,文件很�.

然�用它制作�动U盘,因为在Mac中,就直��以dd到U盘的设备.

�动安装�境

��U盘,�U盘�动,进入安装�境.

先�上Wifi:

wifi-menu

�选择到�置都很简�.

也��便ping个地�看�好了没.

准备硬盘空间了:

fdisk -l

列举了�盘的情况.

我就用cfdisk分区了.

�次进,会让选择分区表类�,��电脑这边就用的MBR.

创建一个primary分区,准备挂载/,标记上bootable;

因为主硬盘�有120G的SSD,准备在副硬盘上挂数�,这里就�多分区了;

然�准备一个swap分区.

然�write改�,退出 cfdisk.

�下�格�化硬盘,

mkfs.ext4 /dev/sda1
mkswap /dev/sda2

好了就�以激活swap,

swapon /dev/sda2

挂载分区:

mount /dev/sda1 /mnt

安装系统

pacstrap /mnt base
# 也�加上 base-devel

等它下载安装完以�,

创建fstab文件:

genfstab /mnt >> /mnt/etc/fstab

这就�以change-root了:

arch-chroot /mnt #/bin/bash

修改系统的�置

�消/etc/locale.gen文件里en_US.UTF-8的注释,

这个以��置中文也�对应放开里�相关的项目,

然�激活它:

locale-gen

输出一个/etc/locale.conf文件:

echo 'LANG=en_US.UTF-8' > /etc/locale.conf

链�一下�置时区:

ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

�步时间:

hwclock --systohc # --utc

�以date试试看输出时间对��

设置root密�:

passwd

设置hostname:

echo mr_luo_arch > /etc/hostname

�用dhcpcd:

systemctl enable dhcpcd

安装bootloader

先安装好grub:

pacman -S grub os-prober

安装grub引导,

grub-install /dev/sda

生��置:

grub-mkconfig -o /boot/grub/grub.cfg

这里基础系统就装好了.

其他安装

�过我顺便装上桌��境,最近觉得gnome3用�挺顺手的,

# 安装相关的包
pacman -Sy --nocomfirm gnome gnome-extra

# �用gdm
systemctl enable gdm

这里的Gnome还少一个网络�置管�的工具,

顺�给它装上:

# 安装相关的包
pacman -S networkmanager

# �用
systemctl enable NetworkManager

给加一个普通用户:

useradd -m -s /bin/bash NewUserName
# -m 创建home目录
# -s 设置默认shell

# 给它�置密�
passwd NewUserName

编辑/etc/sudoers文件,加上:

NewUserName ALL=(ALL) ALL

这样新用户�以用上sudo.

结�

退出change-root,��就好啦�

exit
reboot

Author

骆昱

分类
dev

Docker in Production 笔记

In production

docker-workshop-thought-works

上周六�加了thoughtworks的docker workshop活动, 主��讨了docker技术在生产�境应用的问题.

��介�了一下容器相关技术, 如Linux Container(lxc), 也介�了namespace隔离等等.

还有docker的��:

docker-architecture

然��有部分常�的docker使用技术, 如docker compose, 使用compose.yml文件指定容器的创建, 以�整体管�等.

进阶

文件系统的挂载, 包括数��挂载(-v), 以�制作+使用数�容器的�路方�.

容器网络模�, host内的bridge, 跨host的overlay, 以�sandbox/endpoint定义.

docker-network

也扩展了一下安全性问题. (docker真的��...太高了)

多主机部署��务��

Consul�务��.

Registrator�务注册.

Docker Swarm集群.

日志/监�

docker logs的使用局�.

一点关��际应用的�考

在docker的助力下,将�个�务,��一个容器,然�跑在公�所有的主机上,这样的微�务��想想就知��是当下最��的方�。

借助cluster解决方案,�以将公�的多�务器主机的资��起�利用,并能更好的应对�务故障。

而容器微�务,在开�本地调试,一旦通过测试�以�布,�布的过程也是简�而�会出错。

�建好如上讲述的�务注册+��,更能动����务地�,自动完��务之间的��,�称得上是科学�法。

而�务状�监�,�康检查,日志收集处�,这些�务�建好,�能真的在出错时�时追溯问题,更能通过预警邮件�时知�问题。

一个产��境,必须是科学专业的�境,而�是��能�行就行。

分类
stuff

Rust-Lang Notes | Day 2

General

��

��默认是���immutable的.

let x = 5;
x = 6; // ERROR: re-assignment of immutable variable

mut关键字声���的��.

let mut x = 5;
x = 6;

常� constants

声�常�使用const关键字, 且��许使用mut.

常��光默认�能�,它总是�能�.

而且必须注�值的类�.

const MAX_POINTS: u32 = 100_000;
// 声�一个常�MAX_POINTS, 值是100,000.

常�在整个程�生命周期中都有效,��它声�的作用域之中.

这使得常��以作为多处代�使用的全局范围的值.

将用�整个程�的硬编�的值声�为常�对��的维护者了解值的�义很用帮助。它也能将硬编�的值汇总一处,为将��能的修改�供方便。

��(Shadowing)

��使用let关键字���.

分类
dev

Rust-Lang Notes

Rust语言学习笔记

Installation 安装

习惯的

$ brew search rust
==> Searching local taps...
rust       rustc-completion       rustup-init      uncrustify

然�顺手就�以:

$ brew install rust

这样安装完之�是�以使用rustc等的.

然而缺少rustup工具, 也因为brew�一管�路径的�因, 缺失~/.cargo目录, (�知�为啥没有至少一个软��?).

所以出�学习阶段(在我还没弄清�更好时), 先使用官方的方法(况且cargo是Rust的package manager):

如�brew安装过的, 别忘了先brew uninstall rust�载�.

$ curl https://sh.rustup.rs -sSf | sh
info: downloading installer

Welcome to Rust!

This will download and install the official compiler for the Rust programming
language, and its package manager, Cargo.

It will add the cargo, rustc, rustup and other commands to Cargo's bin
directory, located at:

  /Users/blodely/.cargo/bin

This path will then be added to your PATH environment variable by modifying the
profile files located at:

  /Users/blodely/.profile
  /Users/blodely/.zprofile

You can uninstall at any time with rustup self uninstall and these changes will
be reverted.

Current installation options:

   default host triple: x86_64-apple-darwin
     default toolchain: stable
  modify PATH variable: yes

1) Proceed with installation (default)
2) Customize installation
3) Cancel installation
1

info: syncing channel updates for 'stable-x86_64-apple-darwin'
info: latest update on 2017-08-31, rust version 1.20.0 (f3d6973f4 2017-08-27)
info: downloading component 'rustc'
 35.1 MiB /  35.1 MiB (100 %) 121.6 KiB/s ETA:   0 s
info: downloading component 'rust-std'
 49.0 MiB /  49.0 MiB (100 %) 128.0 KiB/s ETA:   0 s
info: downloading component 'cargo'
  2.6 MiB /   2.6 MiB (100 %) 124.8 KiB/s ETA:   0 s
info: downloading component 'rust-docs'
  3.6 MiB /   3.6 MiB (100 %) 115.2 KiB/s ETA:   0 s
info: installing component 'rustc'
info: installing component 'rust-std'
info: installing component 'cargo'
info: installing component 'rust-docs'
info: default toolchain set to 'stable'

  stable installed - rustc 1.20.0 (f3d6973f4 2017-08-27)


Rust is installed now. Great!

To get started you need Cargo's bin directory ($HOME/.cargo/bin) in your PATH
environment variable. Next time you log in this will be done automatically.

To configure your current shell run source $HOME/.cargo/env

这里当然猴急的�行source $HOME/.cargo/env,

�就测试一下:

$ rustc --version
rustc 1.20.0 (f3d6973f4 2017-08-27)

一切正常.

Hello, world

$ vim main.rs

然�录入:

fn main() {
    println!("Hello, world!~");
}

编译:

$ rustc main.rs

�行二进制文件:

$ ./main
Hello, world!~

Cargo

Cargo命令给出的解释是: Rust's package manager.

好�, 使用Cargo�创建一个工程看看.

$ cargo new hello_cargo --bin
    Created binary (application) `hello_cargo` project

这样就创建了一个binary�应用程�(而�是一个库)的工程了.

cd进���, 还给默认�始化�一个git仓库了.

$ git status
On branch master

Initial commit

Untracked files:
  (use "git add <file>..." to include in what will be committed)

    .gitignore
    Cargo.toml
    src/

文件结�已归好, 还�加git ignore文件.

查阅文档, --vcs�数��制此项.

然�这个Cargo.toml文件类�让我为之一震...

toml = Tom's Obvious, Minimal Language GithubRepo

$ cat Cargo.toml
[package] # 段�标题; �置一个包
name = "hello_cargo"
version = "0.1.0"
authors = ["Luo Yu <indie.luo@gmail.com>"]

[dependencies] # 项目�赖的crates列表(crate: Rust代�包)

�建��行:

$ cargo build # cargo run
   Compiling hello_cargo v0.1.0 (file:///Users/blodely/Desktop/hello_cargo)
    Finished dev [unoptimized + debuginfo] target(s) in 3.27 secs
$ ./target/debug/hello_cargo
Hello, world!

Author

Luo Yu

indie.luo@gmail.com

Tuesday, September 12, 2017