branch_io_cli 0.3.2 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 334a3a4f55aeb27b4a683036fb8c26c576c93e0e
4
- data.tar.gz: 74ea173bc48c7eedd4868098612064ec6369a21c
3
+ metadata.gz: df2700adf827fe4870ef19d9125cedf54970f134
4
+ data.tar.gz: eb840f83b956602b89b0ec30770bc3fe251c7845
5
5
  SHA512:
6
- metadata.gz: 49ff44e9f2aa8c44a9df062ce6a650682823c278028aa1ad6be2488d0c6ca603fe8baf60ce8bc23b7c5c316a9339b58d51682a9909e88eb2448c57f02f43f962
7
- data.tar.gz: 6efb3a1bf7349f0b8772ef5e6f03e34b5fcd834004eef6799bcbf5de2eb4b4a719fcf3f549fa77304409d528e09ecc300d04475ec839b3bb681452608b04d855
6
+ metadata.gz: 458c06211c2619714678d29a1986e060dd3437a25b16a50aa4b5500b6c7a9dd95d38e98b577924e6cc3ae6a169b1a82c5aa3c851b775218b9cc2fddb541d98c2
7
+ data.tar.gz: 6485a940ce0a27f302007d54dfe141fe8b20543b7866e57c8124e2fd892f52dd5bd29d005d01ea1345ebe3d36e81c465dab8cb32d7066b1cbc867988ba1a13b7
data/README.md CHANGED
@@ -90,6 +90,7 @@ command, respectively, available in your path.
90
90
  |--test_key key_test_yyyy|Branch test key|
91
91
  |--app_link_subdomain myapp|Branch app.link subdomain, e.g. myapp for myapp.app.link|
92
92
  |--domains example.com,www.example.com|Comma-separated list of custom domain(s) or non-Branch domain(s)|
93
+ |--uri_scheme myurischeme[://]|Custom URI scheme used in the Branch Dashboard for this app|
93
94
  |--xcodeproj MyProject.xcodeproj|Path to an Xcode project to update|
94
95
  |--target MyAppTarget|Name of a target to modify in the Xcode project|
95
96
  |--podfile /path/to/Podfile|Path to the Podfile for the project|
@@ -76,6 +76,7 @@ EOF
76
76
  c.option "--test_key key_test_yyyy", String, "Branch test key"
77
77
  c.option "--app_link_subdomain myapp", String, "Branch app.link subdomain, e.g. myapp for myapp.app.link"
78
78
  c.option "--domains example.com,www.example.com", Array, "Comma-separated list of custom domain(s) or non-Branch domain(s)"
79
+ c.option "--uri_scheme myurischeme[://]", String, "Custom URI scheme used in the Branch Dashboard for this app"
79
80
 
80
81
  c.option "--xcodeproj MyProject.xcodeproj", String, "Path to an Xcode project to update"
81
82
  c.option "--target MyAppTarget", String, "Name of a target to modify in the Xcode project"
@@ -29,6 +29,8 @@ module BranchIOCLI
29
29
  # the following calls can all raise IOError
30
30
  helper.add_keys_to_info_plist xcodeproj, target_name, @keys
31
31
  helper.add_branch_universal_link_domains_to_info_plist xcodeproj, target_name, @domains if is_app_target
32
+ helper.ensure_uri_scheme_in_info_plist if is_app_target # does nothing if already present
33
+
32
34
  new_path = helper.add_universal_links_to_project xcodeproj, target_name, @domains, false if is_app_target
33
35
  `git add #{new_path}` if options.commit && new_path
34
36
 
@@ -18,6 +18,7 @@ module BranchIOCLI
18
18
  attr_accessor :podfile_path
19
19
  attr_accessor :cartfile_path
20
20
  attr_accessor :target
21
+ attr_accessor :uri_scheme
21
22
 
22
23
  def validate_setup_options(options)
23
24
  print_identification "setup"
@@ -28,6 +29,7 @@ module BranchIOCLI
28
29
  validate_target options
29
30
  validate_keys_from_setup_options options
30
31
  validate_all_domains options, !@target.extension_target_type?
32
+ validate_uri_scheme options
31
33
  validate_buildfile_path options, "Podfile"
32
34
  validate_buildfile_path options, "Cartfile"
33
35
 
@@ -63,6 +65,7 @@ EOF
63
65
  <%= color('Live key:', BOLD) %> #{@keys[:live] || '(none)'}
64
66
  <%= color('Test key:', BOLD) %> #{@keys[:test] || '(none)'}
65
67
  <%= color('Domains:', BOLD) %> #{@all_domains}
68
+ <%= color('URI scheme:', BOLD) %> #{@uri_scheme || '(none)'}
66
69
  <%= color('Podfile:', BOLD) %> #{@podfile_path || '(none)'}
67
70
  <%= color('Cartfile:', BOLD) %> #{@cartfile_path || '(none)'}
68
71
 
@@ -119,6 +122,11 @@ EOF
119
122
  end
120
123
  end
121
124
 
125
+ def validate_uri_scheme(options)
126
+ # No validation at the moment. Just strips off any trailing ://
127
+ @uri_scheme = uri_scheme_without_suffix options.uri_scheme
128
+ end
129
+
122
130
  # 1. Look for options.xcodeproj.
123
131
  # 2. If not specified, look for projects under . (excluding anything in Pods or Carthage folder).
124
132
  # 3. If none or more than one found, prompt the user.
@@ -229,6 +237,12 @@ EOF
229
237
  custom_domains + app_link_subdomains
230
238
  end
231
239
 
240
+ # Removes any trailing :// from the argument and returns a copy
241
+ def uri_scheme_without_suffix(scheme)
242
+ return nil if scheme.nil?
243
+ scheme.sub %r{://$}, ""
244
+ end
245
+
232
246
  def validate_buildfile_path(options, filename)
233
247
  # Disable Podfile/Cartfile update if --no_add_sdk is present
234
248
  return if options.no_add_sdk
@@ -35,6 +35,43 @@ module BranchIOCLI
35
35
  end
36
36
  end
37
37
 
38
+ def ensure_uri_scheme_in_info_plist
39
+ uri_scheme = ConfigurationHelper.uri_scheme
40
+
41
+ # No URI scheme specified. Do nothing.
42
+ return if uri_scheme.nil?
43
+
44
+ update_info_plist_setting ConfigurationHelper.xcodeproj,
45
+ ConfigurationHelper.target.name,
46
+ RELEASE_CONFIGURATION do |info_plist|
47
+ url_types = info_plist["CFBundleURLTypes"] || []
48
+ uri_schemes = url_types.inject([]) { |schemes, t| schemes + t["CFBundleURLSchemes"] }
49
+
50
+ if uri_schemes.empty?
51
+ say "No URI scheme currently defined in project."
52
+ else
53
+ say "Existing URI schemes found in project:"
54
+ uri_schemes.each do |scheme|
55
+ say " #{scheme}"
56
+ end
57
+ end
58
+
59
+ # Already present. Don't mess with the identifier.
60
+ return if uri_schemes.include? uri_scheme
61
+
62
+ # Not found. Add. Don't worry about the CFBundleURLName (reverse-DNS identifier)
63
+ # TODO: Should we prompt here to add or let them change the Dashboard? If there's already
64
+ # a URI scheme in the app, seems likely they'd want to use it. They may have just made
65
+ # a typo at the CLI or in the Dashboard.
66
+ url_types << {
67
+ "CFBundleURLSchemes" => [uri_scheme]
68
+ }
69
+ info_plist["CFBundleURLTypes"] = url_types
70
+
71
+ say "Added URI scheme #{uri_scheme} to project."
72
+ end
73
+ end
74
+
38
75
  def update_info_plist_setting(project, target_name, configuration = RELEASE_CONFIGURATION, &b)
39
76
  # raises
40
77
  target = target_from_project project, target_name
@@ -413,6 +450,8 @@ EOF
413
450
  )
414
451
  end
415
452
 
453
+ patch_open_url_method_swift app_delegate_swift_path
454
+
416
455
  add_change app_delegate_swift_path
417
456
  true
418
457
  end
@@ -490,10 +529,120 @@ EOF
490
529
  )
491
530
  end
492
531
 
532
+ patch_open_url_method_objc app_delegate_objc_path
533
+
493
534
  add_change app_delegate_objc_path
494
535
  true
495
536
  end
496
537
 
538
+ def patch_open_url_method_swift(app_delegate_swift_path)
539
+ app_delegate_swift = File.open app_delegate_swift_path, &:read
540
+ if app_delegate_swift =~ /application.*open\s+url.*options/
541
+ # Has application:openURL:options:
542
+ open_url_text = <<-EOF
543
+ // TODO: Adjust your method as you see fit.
544
+ if Branch.getInstance().application(app, open: url, options: options) {
545
+ return true
546
+ }
547
+
548
+ EOF
549
+
550
+ apply_patch(
551
+ files: app_delegate_swift_path,
552
+ regexp: /application.*open\s+url.*options:.*?\{.*?\n/m,
553
+ text: open_url_text,
554
+ mode: :append
555
+ )
556
+ elsif app_delegate_swift =~ /application.*open\s+url.*sourceApplication/
557
+ # Has application:openURL:sourceApplication:annotation:
558
+ # TODO: This method is deprecated.
559
+ open_url_text = <<-EOF
560
+ // TODO: Adjust your method as you see fit.
561
+ if Branch.getInstance().application(application, open: url, sourceApplication: sourceApplication, annotation: annotation) {
562
+ return true
563
+ }
564
+
565
+ EOF
566
+
567
+ apply_patch(
568
+ files: app_delegate_swift_path,
569
+ regexp: /application.*open\s+url.*sourceApplication:.*?\{.*?\n/m,
570
+ text: open_url_text,
571
+ mode: :append
572
+ )
573
+ else
574
+ # Has neither
575
+ open_url_text = <<EOF
576
+
577
+
578
+ func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
579
+ return Branch.getInstance().application(app, open: url, options: options)
580
+ }
581
+ EOF
582
+
583
+ apply_patch(
584
+ files: app_delegate_swift_path,
585
+ regexp: /\n\s*\}[^{}]*\Z/m,
586
+ text: open_url_text,
587
+ mode: :prepend
588
+ )
589
+ end
590
+ end
591
+
592
+ def patch_open_url_method_objc(app_delegate_objc_path)
593
+ app_delegate_objc = File.open app_delegate_objc_path, &:read
594
+ if app_delegate_objc =~ /application:.*openURL:.*options/
595
+ # Has application:openURL:options:
596
+ open_url_text = <<-EOF
597
+ // TODO: Adjust your method as you see fit.
598
+ if ([[Branch getInstance] application:app openURL:url options:options]) {
599
+ return YES;
600
+ }
601
+
602
+ EOF
603
+
604
+ apply_patch(
605
+ files: app_delegate_objc_path,
606
+ regexp: /application:.*openURL:.*options:.*?\{.*?\n/m,
607
+ text: open_url_text,
608
+ mode: :append
609
+ )
610
+ elsif app_delegate_objc =~ /application:.*openURL:.*sourceApplication/
611
+ # Has application:openURL:sourceApplication:annotation:
612
+ open_url_text = <<-EOF
613
+ // TODO: Adjust your method as you see fit.
614
+ if ([[Branch getInstance] application:application openURL:url sourceApplication:sourceApplication annotation:annotation]) {
615
+ return YES;
616
+ }
617
+
618
+ EOF
619
+
620
+ apply_patch(
621
+ files: app_delegate_objc_path,
622
+ regexp: /application:.*openURL:.*sourceApplication:.*?\{.*?\n/m,
623
+ text: open_url_text,
624
+ mode: :append
625
+ )
626
+ else
627
+ # Has neither
628
+ open_url_text = <<-EOF
629
+
630
+
631
+ - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
632
+ {
633
+ return [[Branch getInstance] application:app openURL:url options:options];
634
+ }
635
+ EOF
636
+
637
+ apply_patch(
638
+ files: app_delegate_objc_path,
639
+ regexp: /\n\s*@end[^@]*\Z/m,
640
+ text: open_url_text,
641
+ mode: :prepend
642
+ )
643
+ end
644
+ end
645
+
497
646
  def patch_podfile(podfile_path)
498
647
  podfile = File.open(podfile_path, &:read)
499
648
 
@@ -1,3 +1,3 @@
1
1
  module BranchIOCLI
2
- VERSION = "0.3.2"
2
+ VERSION = "0.4.0"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: branch_io_cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Branch
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2017-10-21 00:00:00.000000000 Z
12
+ date: 2017-10-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: commander